System verilog 访问寄存器时尝试预测的警告意味着什么?

System verilog 访问寄存器时尝试预测的警告意味着什么?,system-verilog,uvm,System Verilog,Uvm,我有一个UVM验证环境 在我的测试序列中,在收到中断时,我通过前门(串行事务)从REGA读取(镜像) 在我的记分板中,我使用了.predict方法来更新REGA的预期值 但是,我有以下错误: Register "regmodel.REGA" value read from DUT (0x00000000000000AA) does not match mirrored value (0x0000000000000000) 从DUT读取的值是正确的(AA),若我打印预测方法中使用的值,那个么它也

我有一个UVM验证环境

在我的测试序列中,在收到中断时,我通过前门(串行事务)从REGA读取(镜像)

在我的记分板中,我使用了
.predict
方法来更新REGA的预期值

但是,我有以下错误:

Register "regmodel.REGA" value read from DUT (0x00000000000000AA) does not match mirrored value (0x0000000000000000)
从DUT读取的值是正确的(AA),若我打印预测方法中使用的值,那个么它也是正确的(AA)

然而 在模拟中,我在出错前的某个时间发出了以下警告:

Trying to predict value of register 'regmodel.REGA' while it is being accessed
我的第一个想法是因为种族(预测和前门访问),所以我在从寄存器读取之前增加了延迟,但它仍然碰巧是相同的行为


我想知道该警告的确切含义,如果我要更改某些内容,这确实意味着您在读取过程中预测了寄存器。如果您调用
predict(value)
并同时读取/写入寄存器,则在您的预测完成之前,寄存器模型上的读取/写入将出错(无论如何,使用前门访问)

就我个人而言,在开始预测操作之前,我会确保您的寄存器读取完全完成(通过显示
regmodel.REGA.is busy()==0


如果您想了解有关UVM的注册模型的更多信息,此链接非常好:

当您调用Predict函数时,它会调用do\u Predict()。请务必检查寄存器是否忙。如果发现寄存器正忙,do_predict()将不执行predict操作

因此,用户必须检查predict()函数的返回值,以检查操作是否成功完成

预测成功返回1,取消成功操作返回0

您可以编写如下内容,以确保predict操作已完成

  while (! (REGISTER.predict(<value>))); 


           OR
 Declare a standard task something like the following, and call it whenever you need



task dac_reg_base_seq::predict_register(uvm_reg REGISTER, bit [31:0] predict_value ); 
      uvm_reg register_temp;
      predict_register = 0; //Unsuccessful
      if (!$cast(register_temp, REGISTER))
      begin
        `uvm_fatal("NOT_UVM_REG_TYPE","Provided REGISTER is not of the correct type")
      end

     `uvm_info("PREDICT_REGISTER", $psprintf(" Starting the predict function setting register %s with value %h", register_temp.get_name(),predict_value), UVM_HIGH);
    while(1) begin
          if(register_temp.is_busy == 1) begin
           `uvm_info("PREDICT_REGISTER", $psprintf(" register %s  is busy ", register_temp.get_name()), UVM_HIGH);
         // Adding Delay to avoid simulater gets locked up here
         #1;
         continue;
          end
      else begin
            register_temp.predict(register_temp.get()| predict_value); 
            break;
          end
        end
     `uvm_info("PREDICT_REGISTER", $psprintf(" Done with updating the predict value to the register %s", register_temp.get_name()), UVM_HIGH);
endtask : predict_register 
while(!(REGISTER.predict());
或
声明一个标准任务,如下所示,并在需要时调用它
任务dac_reg_base_seq::predict_寄存器(uvm_reg寄存器,位[31:0]predict_值);
uvm_寄存器_温度;
预测_寄存器=0//不成功的
if(!$cast(寄存器温度,寄存器))
开始
`uvm_致命(“非uvm_REG_类型”,“提供的寄存器类型不正确”)
结束
`uvm_信息(“预测_寄存器”$psprintf(“使用值%h启动预测函数设置寄存器%s”,寄存器温度获取_名称(),预测_值),uvm_高);
而(1)开始
如果(寄存器\u temp.is\u busy==1)开始
`uvm_信息(“预测_寄存器”、$psprintf(“寄存器%s正忙”,寄存器临时获取_名称()),uvm_高);
//增加延迟以避免模拟器在此处被锁定
#1;
继续;
结束
否则开始
寄存器_temp.predict(寄存器_temp.get()| predict_值);
打破
结束
结束
`uvm_信息(“PREDICT_REGISTER”$psprintf(“完成将预测值更新到寄存器%s”,寄存器临时获取_name()),uvm_HIGH);
endtask:predict_寄存器

这里是另一个关于如何使用is_busy功能等待前门准备好接受预测的示例

function void do_reset_key_registers(hmac_sha256_regblock parent_reg_block, uvm_reg      reg);
//$cast(parent_reg_block, this.get_parent());//this has been done outside
            fork 
                automatic uvm_reg reg=reg;//this is to copy the correct handle for each thread
                begin
                    if (reg.get_name=="inst_STATUS") begin
                        if  (reg.is_busy()) begin    wait(!reg.is_busy()); end//wait until this register is not busy 
                    end
                    assert( parent_reg_block.inst_STATUS.KEY_ERROR.predict(1));//key protect 0                                                    
                end
                begin
                    if (reg.get_name=="inst_KEY_0") begin
                        if  (reg.is_busy()) begin    wait(!reg.is_busy()); end//wait until this register is not busy 
                    end                    
                    assert( parent_reg_block.inst_KEY_0.KEY_0.predict(0));//reset KEYS 0
                end
            join_none
        endfunction: do_reset_key_registers

我正在使用IUS(incisive)作为我的模拟器,但用户如何知道预测何时完成?考虑一个检查器更新预测值和从寄存器中读取序列(两者都在并行线程中工作,并且彼此异步)。日程安排不应该考虑到这种情况吗?或者是否有“忙”的标志?对不起,我点错了。在读取regmodel.REGA期间,寄存器模型中设置了一个字段(
uvm_reg::m_is_busy
)。该字段由
uvm\u reg::do\u predict()
检查。如果在预测开始时m_is_busy设置为高,您将得到“在访问register regmodel.REGA时尝试预测register regmodel.REGA的值”消息。至于如何解决这个问题,您可以使用异步线程都可以访问的信号量,或者在您尝试预测之前调用
regmodel.REGA.is_busy()
。谢谢,我将尝试这个方法,我在接下来的几天内不会处理这段代码,所以稍后将提供反馈。我也面临着同样的问题。我没有在这个线程中看到解决方案。我做了一个
等待(!regmodel.REGA.is_busy())
它就挂了。我能确定是谁让regmodel忙吗?请您对您提供的解释再加一点说明好吗?