寄存器(RAL)模型中的mirror实现读操作

本文探讨了在寄存器(RAL)模型中,如何利用mirror方法执行读操作,并强调其在检查一致性方面的优势。mirror方法与read方法类似,但当设置为UVM_CHECK时,会对比读取值与DUT的值,若不一致则发出警告。这为验证过程提供了额外的检查层。

在寄存器读操作中,除了了使用read方法,peek方法,还可以使用mirror方法,mirror方法最大的好处可以进行check,也就是说如果read的值value与RAL中的现有的镜像值不一致的话,可以报出相应的信息。

task uvm_reg::mirror(output uvm_status_e       status,
                     input  uvm_check_e        check = UVM_NO_CHECK,
                     input  uvm_door_e         path = UVM_DEFAULT_DOOR,
                     input  uvm_reg_map        map = null,
                     input  uvm_sequence_base  parent = null,
                     input  int                prior = -1,
                     input  uvm_object         extension = null,
                     input  string             fname = "",
                     input  int                lineno = 0);
   uvm_reg_data_t  v;
   uvm_reg_data_t  exp;
   uvm_reg_backdoor bkdr = get_backdoor();

   XatomicX(1);
   m_fname = fname;
   m_lineno = lineno;


   if (path == UVM_DEFAULT_DOOR)
     path = m_parent.get_default_door();

   if (path == UVM_BACKDOOR && (bkdr != null || has_
在UVM寄存器模型中,mirror方法用于更新寄存器模型的镜像值。其原理和方式与寄存器模型中镜像值的概念以及整体操作机制相关。 镜像值表示当前硬件状态的已知值,往往由模型预测给出,在前门访问时通过观察总线或在后门访问时通过自动预测等方式来给出。不过,镜像值有可能与硬件实际值不一致,无法保持同步更新[^3]。 mirror方法更新镜像值的具体方式和原理如下: - **前门访问情况**:当使用前门访问时,monitor会捕捉到总线上面的行为(对DUT寄存器进行写),然后做预测(predict)后更新镜像值。但对于RAL中的寄存器,在RAL没有去DUT中的对应的状态REG时候是不会自动更新的(后门也可以用来更新),必须通过前门操作走出这一步才会更新。例如,在使用UVM寄存器模型时,若通过前门访问取硬件寄存器的值,mirror方法会根据取到的硬件值来更新寄存器模型中的镜像值。 - **后门访问情况**:在后门访问时,通过自动预测等方式给出镜像值。当调用mirror方法时,它会获取硬件寄存器的实际值,并将其更新到寄存器模型的镜像值中。 - **结合期望值情况**:随机化针对的是期望值,随机化对mirror value不起作用。在调用mirror方法前,若对期望值进行了设置,然后通过update方法将期望值写入硬件,之后调用mirror方法,它会检查硬件值与镜像值是否一致,并根据硬件值更新镜像值。例如以下代码: ```systemverilog class MyReg extends uvm_reg; rand uvm_reg_field data; function new(string name = "MyReg"); super.new(name, 32, UVM_NO_COVERAGE); endfunction virtual function void build(); data = uvm_reg_field::type_id::create("data",, get_full_name()); data.configure(this, 32, 0, "RW", 0, 32'h0, 1, 1, 1); endfunction endclass // 在测试用例中 task run_phase(uvm_phase phase); MyReg reg_inst; uvm_status_e status; uvm_reg_data_t data_val; reg_inst = reg_block.my_reg; // 假设 reg_block 是寄存器块 // 设置期望值 reg_inst.data.set(32'hA5A5_A5A5); $display("Desired value: %0h", reg_inst.data.get()); // 将期望值写入硬件 reg_inst.update(status); $display("Mirrored value after update: %0h", reg_inst.data.get_mirrored()); // 取硬件值并检查 reg_inst.mirror(status, UVM_CHECK); $display("Mirrored value after mirror: %0h", reg_inst.data.get_mirrored()); endtask ``` 在上述代码中,先设置了期望值,然后通过update方法将期望值写入硬件,最后调用mirror方法取硬件值并更新镜像值,同时可以通过`UVM_CHECK`参数检查硬件值与镜像值是否一致。 若访问寄存器有多重总线访问方式,monitor可能没有都检测到,那就没法及时更新镜像值。在硬件行为异常(例如写入失败)时,镜像值可能无法达到期望值,验证时可以通过mirror方法检测不一致,这也体现了mirror方法在更新镜像值以及验证硬件与模型一致性方面的重要作用[^1][2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值