當(dāng)我開始使用 UVM RAL 時(shí),我無法理解 UVM 基類庫對(duì)更新所需值和鏡像值寄存器的值有什么看法。我還認(rèn)為,所使用的術(shù)語沒有準(zhǔn)確反映其意圖。花了一些時(shí)間后,我想出了一個(gè)表,幫助我了解寄存器模型 API 的行為,以及如何最好地調(diào)用它們。
在介紹該表之前,讓我們看一下創(chuàng)建寄存器模型的過程:
創(chuàng)建寄存器格式規(guī)范
將規(guī)范轉(zhuǎn)換為 UVM 寄存器模型
使用寄存器模型
創(chuàng)建寄存器格式規(guī)范:有許多寄存器格式可用于描述設(shè)計(jì)人員的寄存器規(guī)范。您可能熟悉廣泛使用的 Synopsys RALF 格式。下圖說明了使用 Synopsys Ralgen 工具將 RALF 格式轉(zhuǎn)換為寄存器模型的流程。虛線表示您可以為不同的方法生成寄存器模型:
使用寄存器模型:寄存器模型具有一組用于所需寄存器值和鏡像寄存器值的變量。該文檔使用術(shù)語“所需”和“鏡像”,但為了避免混淆,我在下面將它們稱為“主”和“鏡像”。鏡像變量的目的是始終保存或表示 RTL 的值,以便它可以用作記分板。有一堆 API 可用于對(duì)這些變量進(jìn)行操作。這里的目的是闡明在模擬期間調(diào)用任何這些 API 時(shí)主變量和鏡像變量會(huì)發(fā)生什么情況。
讓我們看一下可用的 API。我將它們分為三類:主動(dòng)、被動(dòng)和間接。
積極:物理事務(wù)在總線上執(zhí)行讀取和寫入操作。Read()、write()、update() 和 mirror() 是使用物理接口在 DUT 上運(yùn)行的活動(dòng) API。您可以選擇使用后門機(jī)制,在這種情況下,它不會(huì)消耗模擬周期。您可以期待與使用前門訪問時(shí)發(fā)生的相同的 RTL 寄存器行為.
被動(dòng):僅使用寄存器模型運(yùn)行。set()、get() 和 predict() 是直接在模型上運(yùn)行的被動(dòng) API。我也稱 peek() 為被動(dòng),因?yàn)檫@不會(huì)在讀取過程中更改寄存器值。例如,讀取以清除寄存器 – 在執(zhí)行 peek() 時(shí)不會(huì)被清除。
間接:有一組API間接地在DUT上運(yùn)行,它們是peek()和poke()。請(qǐng)注意,peek() 和 poke() API 只是后門訪問。雖然 poke 可以更新 RTL 寄存器,但它無法模擬物理讀取期間可能發(fā)生的實(shí)際寄存器行為。例如,寫一個(gè)要清除。
讓我們簡(jiǎn)要介紹一下廣泛使用的 API 定義。您可以在 UVM 類參考指南中找到更多詳細(xì)信息。
讀取():使用前門或后門訪問從 DUT 寄存器讀取值。
寫():使用前門或后門訪問更新 DUT 寄存器。
更新():如果使用 set() 更改了主寄存器變量中的任何值,則可以使用此方法(批量更新)在 DUT 中寫入所有這些寄存器。您可以調(diào)用單獨(dú)的 write() 方法來獲得相同的結(jié)果。
鏡像(): 鏡像維護(hù) DUT 寄存器值的副本。Mirror() 方法讀取寄存器,如果啟用了檢查,則可以選擇將讀回值與當(dāng)前鏡像值進(jìn)行比較。 鏡像可以使用物理接口(前門)或 peek()(后門)機(jī)制執(zhí)行。
躲貓貓():使用后門訪問機(jī)制從 DUT 寄存器讀取值。
Poke():使用后門訪問機(jī)制將 DUT 寄存器寫入指定值。
預(yù)測(cè)(): 可以使用此方法將鏡像變量值更改為預(yù)期值。
我運(yùn)行了一些實(shí)驗(yàn),下表顯示了從測(cè)試臺(tái)執(zhí)行任何這些 API 時(shí)寄存器模型和 DUT 中會(huì)發(fā)生什么。
縮寫
UMV – 更新主變量, UMrV – 更新鏡像變量, AP – 自動(dòng)預(yù)測(cè)
RDR – 讀取 DUT 寄存器, UDR – 更新 DUT 寄存器, RMV – 讀取主變量
FD – 前門, BD – 后門, * – 檢查是否使用了UVM_CHEK, NA – 不適用
要記住的幾點(diǎn)
我沒想到 peek() 和 poke() 方法會(huì)無條件更新鏡像值。在查看了 UVM 源代碼后,我發(fā)現(xiàn) do_predit() 方法在 peek() 和 poke() 方法中被無條件調(diào)用。我還注意到,使用后門機(jī)制的 write() 和 read() 方法會(huì)在調(diào)用 do_predict() 時(shí)更新鏡像寄存器,而無需檢查此 get_auto_predict() 方法的輸出。我看到唯一有條件調(diào)用的地方是具有前門訪問權(quán)限的 write () 和 read() 方法。
在與專家討論后,我了解到預(yù)期功能是確保鏡像變量具有最新的寄存器值。類似地,使用后門訪問的read()/write()更新鏡像寄存器 — 這也是有意為之的。由于使用了后門程序,因此物理接口上不會(huì)觀察到(當(dāng)自動(dòng)預(yù)測(cè)關(guān)閉時(shí))來更新寄存器模型。因此,在所有情況下都必須對(duì)其進(jìn)行更新。
審核編輯:郭婷
-
寄存器
+關(guān)注
關(guān)注
31文章
5363瀏覽量
121161 -
API
+關(guān)注
關(guān)注
2文章
1510瀏覽量
62395 -
UVM
+關(guān)注
關(guān)注
0文章
182瀏覽量
19227
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論