UVM——RAL模型运用之二(前/后门访问、寄存器值跟踪方式)

一、两种寄存器访问方式

  利用寄存器模型可以更方便的对寄存器进行操作。两种访问寄存器的方式是前门访问(front-door)和后门访问(back-door)。

前门访问在寄存器模型上做的读写操作,通过总线SPI实现总线上的物理时序访问,是真实的物理操作
后门访问指利用UVM DPI(uvm_hdl_read()、uvm_hdl_deposit()),将寄存器的操作直接作用到DUT内的寄存器变量,而不通过物理总线访问。

1.1.前门访问

  • 下面的sequence,继承于uvm_reg_sequence。uvm_reg_sequence除了具备一般的预定义方法之外,还具有与寄存器相关的方法。
    1)、第一种即uvm_reg::read( )/write( )。在传递时,用户注意将参数path指定为UVM_FRONTDOOR。uvm_reg::read()/write()方法传入的参数较多,除了status和value两个参数需传入,其他参数若不指定,可采用默认值。
regmodel.register.write(status,value,UVM_FRONTDOOR,.parent(this));         //regmodel——寄存器模型实例名;   register——寄存器实例名
regmodel.register.read(status,value,UVM_FRONTDOOR,.parent(this));

   2)、第一种即uvm_reg_sequence::read_reg( )/write_reg( )。传递时,path指定为UVM_FRONTDOOR

write_reg(regmodel.register,status,value,UVM_FRONTDOOR);
read_reg(regmodel.register,status,value,UVM_FRONTDOOR);
class apb_spi_seq extends uvm_reg_sequence;  
   reg_block_rgm     rgm;
   `uvm_object_utils(apb_spi_seq)         //注册类
   `uvm_declare_p_sequencer(apb_spi_sequencer)    //创建p_sequencer变量,操作virtual sequence内容
   ...
   task body();
      uvm_status_e     status;
      uvm_reg_data_t   data;
      if(!uvm_config_db#(reg_block_rgm)::get(null,get_full_name(),"rgm",rgm))begin
         `uvm_error("GETRGM","no top-down RGM handle is assigned")
      end
      rgm.ctrl.read(status,data,UVM_FRONTDOOR,.parent(this));        //1. 寄存器模型提供的方法read()/write()
      rgm.ctrl.write(status,'h11,UVM_FRONTDOOR,.parent
  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
UVM提供了uvm_reg_backdoor类,用于在测试访问寄存器的内部实现。这个类可以让我们在测试使用不同的方式访问寄存器,以验证寄存器的功能和性能。 uvm_reg_backdoor类主要有两个方法: - `void read(uvm_reg_item rw)`:读取寄存器,将结果存储在rw.value。 - `void write(uvm_reg_item rw)`:写入寄存器,将存储在rw.value。 其,`uvm_reg_item`是一个包含寄存器地址、写入/读取等信息的uvm序列化对象。 要使用uvm_reg_backdoor类,我们需要创建一个新类,继承自uvm_reg_backdoor。在新类的构造函数,我们需要调用基类的构造函数,并通过该函数将要访问寄存器作为参数传递。 下面是一个使用uvm_reg_backdoor类的示例: ```systemverilog class my_reg_backdoor extends uvm_reg_backdoor; `uvm_object_utils(my_reg_backdoor) function new(string name = "my_reg_backdoor"); super.new(name); endfunction virtual function void read(uvm_reg_item rw); // 从寄存器读取 endfunction virtual function void write(uvm_reg_item rw); // 将写入寄存器 endfunction endclass ``` 在测试,我们可以使用uvm_reg_backdoor类的实例来访问寄存器。例如: ```systemverilog my_reg_backdoor my_bd = new; uvm_reg_item rw = new; rw.element = my_reg; rw.kind = UVM_REG; rw.path = UVM_FRONTDOOR; rw.offset = 0; rw.value[0] = 0x1234; my_bd.write(rw); // 从寄存器读取 my_bd.read(rw); $display("value = %h", rw.value[0]); ``` 使用uvm_reg_backdoor类可以方便地访问寄存器的内部实现,从而进行更全面和深入的验证。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SD.ZHAI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值