UVM的RAL和MPI

南笙酒味 提交于 2019-12-06 14:21:18

1、RAL的组成

ral是寄存器列表+访问控制的集合。

  表部分,ral包含了寄存器基本的域、寄存器、页签、多页签的层次组成方式,将多个小的单元包含在一个大的单元里边,再将大的单元包含在更大的单元里边,层层嵌套,组成一个包含多个页签的寄存器表。

  其中最小的单元是域(uvm_reg_field),然后是寄存器(uvm_reg),多个寄存器可以组成一个块(uvm_reg_block)相当于一个页签,多个页签可以还可以组成一个更大的页签

 

  访问控制部分,ral的uvm_reg_block类中内置了default_map成员,这个类保存了页签中所有寄存器的相对地址、偏移地址、访问权限等信息,同时还提供了do_read()和do_write()函数供调用。在uvm_reg_block中使用default_map.add_reg就可以将寄存器的相对地址等信息保存到map中。如果是页签,则使用ad_submap的方式将偏移地址等信息保存在map中,并修改页签所的偏移地址为add_submap传来的偏移地址。

       uvm_reg_block中的每个寄存器(uvm_reg)和每个域(uvm_reg_field)中都要read和write函数,只需要通过类的层层引用就能调用对应寄存器或者域的read和write函数。其中域的write和read函数是通过调用parent的read和write函数来实现的。而寄存器(uvm_reg)中的read和write又是通过调用default_map中的read和write来实现的。default_map中保存了寄存器的所有信息,但要寄存器的地址、数据、访问类型等数据发给driver,还需要sequencer和adapter的帮助。因为UVM中driver都是接受sequencer传来的uvm_sequence_item数据,所以在访问控制的时候,发送的数据需要通过adapter的reg2bus函数将uvm_reg_bus_op类型的数据转换成uvm_sequence_item类型,然后通过sequencer发送给driver。

 只有一个寄存器页签的例子。

寄存器类

 

页签类

 2、为ral提供sequencer和adapter

使用ral中default_map的set_sequencer函数,配置default_map中的sequencer和adapter,其中sequencer的export已经在mpi_if_agent中与mpi_driver的port相连。

3、adapter数据类型转换

在mpi_driver中接收到uvm_sequence_item类型的数据后会将数据强制转换成mpi_xaction类型,这就要求在ral中发送的数据类型就为mpi_xaction类型

 

在ral中,default_map的do_write和do_read函数会调用adapter的reg2bus函数将uvm_reg_bus_op的数据类型转换为mpi_xaction的数据类型。

这个操作比较绕,由于mpi_xaction是最低级的子类,这就要求adapter中转换出来的必须是mpi_xaction类型,然后在将引用指向父类uvm_sequence_item,实现方式是在例化adapter的时候传了一个mpi_xaction的引用proto,通过这个引用产生了一个mpi_xaction的变量,并将所有赋给父类,这样实际发生的数据就是mpi_xaction的数据类型了。

 

注意:$cast(子类引用,父类引用),通过cast将父类引用转换为子类引用的前提是父类引用指向的是一个子类变量。

4、uvm_reg中FROOTDOOR访问方式选择

uvm_reg_map提供了USER FRONTDOOR和BUILT-IN FRONTDOOR两种前门读写的方式,

其中用户自定义的前门访问方式是直接通过sequencer发送uvm_reg_frontdoor类型的数据给driver.

内建的范围前门访问方式则是调用default_map(uvm_reg_map)的do_write和do_read函数发送数据给driver.

在使用用户自定义模式的时候需要给frontdoor变量赋一个非null的值,在我们使用的时候,这个值就是null,所以使用的是内建模式的前门访问方式。

5、高级的map数据类型

这个就相当于JAVA中的map类型,uvm_reg是键的类型,uvm_reg_map_info是值的类型。

 

6、发送的数据位宽

可以发送64bit位宽的数据,但是要发送超过64bit位宽以上的数据需要修改reg2bus,在ral传来的数据uvm_reg_bus_opt的数据域bit位宽大于32的时候要将数据拆分层mpi_xaction成员的多个域,mpi_driver接收到到mpi_xaction的时候要判断data的长度,根据一定的规则写入MPI。

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!