當我開始使用UVM RAL時,我無法理解UVM基類庫對更新Desired和Mirror 寄存器的解釋。覺得使用的術語并不能準確地反映里面的真實的意思。花了一些時間后,我想出了一個表格,它可以幫助我理解寄存器模型API 的行為,以及如何最好地調用它們。
在介紹表格之前,我們先來看看寄存器模型的創建過程:
- 創建寄存器格式規范
- 將規范轉換為 UVM 寄存器模型
- 使用寄存器模型
創建寄存器格式規范:有許多寄存器格式可用于描述DUT的寄存器規范。您可能熟悉廣泛使用的 Synopsys RALF 格式。下圖說明了使用 Synopsys Ralgen 工具將 RALF 格式轉換為寄存器模型的流程。虛線表示您可以為不同的方法生成寄存器模型:
使用寄存器模型:寄存器模型具有一組用于Desired和Mirror寄存器值的變量。UVM文檔使用了術語Desired 和Mirror, 但我在下面將它們稱為Main和Mirror以避免混淆。Mirror變量的目的是始終保持或表示RTL的值,以便它可以用作Scoreboard。有很多 API 可對這些變量進行操作。此處的目的是闡明在仿真期間調用這些API時Main變量和Mirror變量會發生什么。
讓我們看一下可用的 API。我將它們分為三組:Active、Passive和Indirect。
Active: 在總線上通過物理事務做讀寫操作。Read()、write()、update() 和 mirror() 是Active API,它們使用物理接口在 DUT 上運行。您可以選擇使用后門機制,在這種情況下它不會消耗仿真周期。與使用前門訪問相同的RTL寄存器行為一致。
Passive:僅使用寄存器模型操作。set()、get() 和 predict() 是直接在模型上操作的Passive API。調用Passive peek() 不會在讀取過程中改變寄存器值。例如,讀取以清除寄存器——執行 peek() 時寄存器不會被清除。
Indirect: 有一組 API 可以間接在 DUT 上運行,它們是 peek() 和 poke()。請注意 peek() 和 poke() API 只是后門訪問。盡管 poke 可以更新 RTL 寄存器,但它不能模擬物理讀取期間可能發生的實際寄存器行為。例如,寫1來清除寄存器。
讓我們簡要介紹一下廣泛使用的 API 定義。您可以在 UVM 類參考指南中找到更多詳細信息。
Read():使用前門或后門訪問從 DUT 寄存器中讀取值。
Write():使用前門或后門訪問更新 DUT 寄存器。
Update(): 如果您使用 set() 更改了主寄存器變量中的任何值,則可以使用這種方法(批量更新)將所有這些寄存器寫入 DUT。您可以調用單獨的 write() 方法來實現相同的結果。
Mirror(): Mirror 維護DUT寄存器值的副本。Mirror() 方法讀取寄存器,如果啟用檢查,則可選擇將回讀值與當前鏡像值進行比較。 可以使用物理接口(前門)或 peek()(后門)機制執行鏡像。
Peek(): 使用后門訪問機制從DUT寄存器中讀取值。
Poke():使用后門訪問機制將指定值寫入DUT寄存器。
Predict():您可以使用此方法將鏡像變量值更改為期望值。
我進行了一些實驗,下表顯示了當從Testbench執行任何這些 API 時,寄存器模型和 DUT 中發生的情況。
縮寫
UMV – 更新主變量,UMrV – 更新鏡像變量,AP – Auto Predict
RDR – 讀取DUT寄存器,UDR – 更新DUT寄存器,RMV – 讀取Main變量
FD – 前門,BD – 后門,* – 檢查是否使用了 UVM_CHEK, NA – 不適用
要記住的幾點
沒想到 peek() 和 poke() 方法會無條件更新鏡像值。查看UVM源碼后,發現在peek()和poke()方法內部無條件調用do_preedit()方法。我還注意到使用后門機制的 write() 和 read() 方法會在調用 do_predict() 時更新鏡像寄存器,而無需檢查此 get_auto_predict() 方法的輸出。我看到這個有條件調用的唯一地方是具有前門訪問的 write() 和 read() 方法。
在與專家討論后,了解到這樣設計是有意的,是為了確保鏡像變量中具有最新的寄存器值。類似地,使用后門訪問的 read()/write() 也會更新鏡像寄存器——這也是有意的。因為使用了后門,所以不會在物理接口上觀察到(當auto predict關閉時)更新寄存器模型的事務。因此,它必須在所有情況下進行更新。
作者:Vidyashankar Ramaswamy
來源:
https://blogs.synopsys.com/vip-central/2015/01/06/using-uvm-register-model/
-
寄存器
+關注
關注
31文章
5342瀏覽量
120274 -
API
+關注
關注
2文章
1499瀏覽量
61981 -
UVM
+關注
關注
0文章
182瀏覽量
19168
發布評論請先 登錄
相關推薦
評論