2014-03-05 30 views
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訪問)的公司,因爲,所以我加了德拉在從寄存器讀取之前,但它仍然是相同的行爲。

我想知道到底該警告意味着什麼,我是否應該改變的東西

+0

我使用曼月樂(尖銳)作爲我的模擬器 – wisemonkey

回答

1

這確實意味着你在讀期間預測的寄存器。如果您撥打predict(value)並且您正在同時讀取/寫入寄存器,則在預測完成之前(無論如何,前門訪問),寄存器模型上的讀/寫將出錯。

個人而言,在開始預測操作之前,我會確保您的寄存器讀取已完成完全(通過顯示regmodel.REGA.is busy() == 0)。

如果您想對UVM的寄存器模式多一點信息,這個環節非常出色:http://cluelogic.com/2013/02/uvm-tutorial-for-candy-lovers-register-access-methods/

+0

確定,但如何將用戶地預測完成時,知道嗎?考慮檢查器更新預測值和來自寄存器的序列讀取(兩者在並行線程中工作並且彼此異步)。不應該安排照顧情況?還是有一個標誌表示預測'忙'? – wisemonkey

+1

我讓我訂購錯了,對不起。在讀取regmodel.REGA期間,在寄存器模型('uvm_reg :: m_is_busy')內設置了一個字段。該字段由'uvm_reg :: do_predict()'檢查。如果在預測開始時將m_is_busy設置爲高電平,您將看到「嘗試預測寄存器regmodel.REGA在訪問時的值」消息。至於如何解決這個問題,你可以使用異步線程可訪問的信號量,或者在嘗試預測之前調用'regmodel.REGA.is_busy()'。 –

+0

謝謝我要試試這個,我沒有在接下來的幾天編寫這段代碼,所以稍後會提供反饋。 – wisemonkey

1

當你調用函數預測,它調用do_predict()。預測檢查寄存器是否忙。如果發現寄存器繁忙,則do_predict()將不執行預測操作。

因此,用戶一定要檢查的預測()函數的返回值來檢查操作是否成功完成

預測成功的話返回1和0 UN_SUCCESSFUL操作

你可能喜歡寫東西下面,以確保預測操作完成

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 
+0

您能否爲您提供的解釋添加更多描述? – abarisone

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

相關問題