对于顶层的寄存器模型来说,get_parent()返回的就是null,也就是说寄存器模型中的寄存器会自下而上层层判断有没有自定义的uvm_reg_backdoor句柄,如果都没有,图2中的代码段1执行的get_backdoor()函数最终返回的就是null。于是乎代码段2中执行的就是backdoor_read()任务,而backdoor_read()中又调用了backdoor_rea...
1taskuvm_reg::read(outputuvm_status_e status,2outputuvm_reg_data_t value,3inputuvm_path_e path =UVM_DEFAULT_PATH,4inputuvm_reg_map map =null,5inputuvm_sequence_base parent =null,6inputintprior = -1,7inputuvm_object extension =null,8inputstringfname ="",9inputintlineno =0);10Xatomi...
UVM中的regmodel建模(三) 总结一下UVM中的寄存器访问实现: 后门访问通过add_hdl_path命令来添加寄存器路径,并扩展uvm_reg_backdoor基类,定义read与write函数,最后在uvm_reg_block类中 通过set_backdoor()来将相应的寄存器与它对应的后门访问的读写函数对应起来。其中read和write函数以路径名来直接操作。 前门访问通...
例如在稍后对寄存器SLV0_RW_REG进行后门访问时,UVM DPI函数会通过寄存器HDL路径“reg_backdoor_access.dut.regs[0]”映射到正确的寄存器位置,继而对其进行读值或者修改。另外,寄存器模型build()函数最后一句,以lock_model()结尾,该函数的功能是结束地址映射关系,并且保证模型不会被其它用户修改。 在寄存器模型完成了H...
reg_model p_rm; 需要在env中将p_rm传递给参考模型:mdl.p_rm = this.p_rm; 对于寄存器,寄存器模型提供了两个基本的任务:read和write p_rm.invert.read(status, value, UVM_FRONTDOOR); read任务的原型如下所示: 第一个是uvm_status_e型的变量,这是一个输出,用于表明读操作是否成功;第二个是读取的数值...
下面是一个使用Backdoor的示例代码: ```verilog //获取寄存器模型的指针 reg_model reg_ptr = uvm_reg::get_reg_by_name("my_register"); //执行读取操作 reg_data_t read_data; reg_ptr.read(read_data); //执行写入操作 reg_data_t write_data = 8'hFF; reg_ptr.write(write_data); ``` 在...
在UVM中,Backdoor访问通过UVM的uvm_reg_backdoor类实现。以下是使用UVM寄存器模型的Backdoor的一般步骤:导入相关库和包:systemverilog Copy code import uvm_pkg::*;创建寄存器模型:`include "uvm_macros.svh"class my_reg_model extends uvm_reg_block;// 定义寄存器模型的寄存器字段 uvm_reg_field field1;uv...
BACKDOOR是通过hdl_path的方式去操作dut的并不会经过physical interface,我们这篇文章主要讨论的是reg2...
reg中的poke()和peek()也会自动调用do_predict()函数,类似于do_write()/do_read()的UVM_BACKDOOR...
读取的方式可以选择BACKDOOR或者FRONTDOOR。与update类似,每个uvm_reg派生来的类都有mirror操作,每个由uvm_reg_blcok派生出来的类也有mirror操作。mirror操作可以指定是否报告DUT中寄存器的值与register model中镜像值不一样。如果选择了这一项,那么就可以检查某些计数器的值是否DUT中相应计数器的值一致。