图12 src/reg/uvm_reg_block.svh中存储HDL路径的键值对 我们可以通过调用add_hdl_path来添加寄存器模型的HDL路径,如图13所示,添加HDL路径可以指定不同的键值来对寄存器HDL路径进行分组,实现同一个寄存器模型存储多个不同的HDL路径,这是为了应对同样的寄存器模块在RTL中有多个instance分布在不同的hierarchy下,就可以通过...
在reg_field中的task中,基本都调用uvm_reg的task,但是read、write根据是否支持individual可能会调用map中的task。 uvm_reg中还有一些hdl_path的function,add_hdl_path_slice,添加到field的path路径。这些路径,之后在map中会被集成起来。 形成一个full_name。 uvm_reg_frontdoor,从uvm_reg_sequence继承而来,本身是一...
后门访问通过add_hdl_path命令来添加寄存器路径,并扩展uvm_reg_backdoor基类,定义read与write函数,最后在uvm_reg_block类中 通过set_backdoor()来将相应的寄存器与它对应的后门访问的读写函数对应起来。其中read和write函数以路径名来直接操作。 前门访问通过总线操作来实现,在其中有uvm_adapter的扩展类,扩展了函数reg...
这样子通过reg_file连接reg_block和reg,当reg_block名字发生变化时,只需要将reg_file的configure参数值改变一下即可,减少了大量修改名字发生错误的可能性。 对于一个寄存器包含多个域的情况,与单个域寄存器的区别是每个field需要单独调用configure函数并设置其对应的hdl路径,调用完每个域的configure函数后,需要使用add_hdl...
uvm_reg中还有一些hdl_path的function,add_hdl_path_slice,添加到field的path路径。这些路径,之后在map中会被集成起来。 形成一个full_name。 uvm_reg_frontdoor,从uvm_reg_sequence继承而来,本身是一个sequence。 uvm_reg_backdoor,从uvm_object继承而来,本身就是一个object,其中定义了read、write的原型函数。
map.add_reg(chnl0_ctrl_reg,32'h0000_0000,"RW");//将 uvm_reg 添加到 map 中 ... lock_model();//不允许外部访问 endfunction endclass 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
· string hdl_path=“”,用于指定hdl_path,后门的一种,这里不指定,默认 当然,reg_block中的add_reg关联操作也会在reg的configure中被调用。至此,一个完整的reg_block创建完成,可以直接在test,env或者其他component中进行例化。 1.2.3. uvm_reg_map 关于uvm_reg_map的创建,方法也很多,第一种,在例化uvm_reg_...
例码中通过 uvm_reg_ block: :add_ hdl _path()将寄存器模型关联到了 DUT一端,而通过uvm _reg: :add_ hdl _path_ slice 完成了将寄存器模型各个寄存器成员与 HDL一侧地址的映射。例如,稍后对寄存器 SLVO_RW_REG 进行后门访问时, UVM DPI 函数通过寄存器 HDL 路径 "reg_backdoor_access.dut.regs[0]" ...
· string hdl_path=“”,用于指定hdl_path,后门的一种,这里不指定,默认 当然,reg_block中的...
获取uvm_reg_backdoor句柄的过程会遍历寄存器模型的层次,如果没有自定义backdoor,就会从顶层寄存器模型开始查找。在默认情况下,寄存器模型使用sv语法的DPI方式访问,但可以通过自定义类实现其他形式的访问。源代码中的get_full_hdl_path函数负责获取寄存器的完整HDL路径,这涉及到uvm_hdl_path_concat和uvm_...