2

我有UVM验证环境。

在我的测试序列中,我在收到中断时通过 FRONTDOOR(串行事务)从 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

我的第一个想法是因为种族(预测和 FRONTDOOR 访问),所以我在从寄存器读取之前添加了延迟,但它仍然是相同的行为。

我想知道该警告的确切含义,以及是否应该更改某些内容

4

3 回答 3

1

这确实意味着您在读取期间预测您的寄存器。如果您打电话predict(value)并同时读/写寄存器,则在您的预测完成之前,寄存器模型上的读/写将出错(无论如何,前门访问)。

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

如果您想了解有关 UVM 寄存器模型的更多信息,此链接非常好:http ://cluelogic.com/2013/02/uvm-tutorial-for-candy-lovers-register-access-methods/

于 2014-06-25T22:56:42.760 回答
1

当您调用 Predict 函数时,它会调用 do_predict()。如果寄存器忙,请进行预测检查。如果发现寄存器忙,do_predict() 将不会执行预测操作。

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

对于 SUCCESS,Predict 返回 1,对于 UN_SUCCESSFUL 操作返回 0

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

  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 
于 2016-02-12T07:35:02.687 回答
0

这是另一个关于如何使用 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
于 2017-11-10T08:45:56.547 回答