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

五個(gè)廣泛使用的特殊寄存器

簡(jiǎn)述RAL寄存器模型基礎(chǔ)

簡(jiǎn)化UVM寄存器模型的使用

基于DUT內(nèi)部寄存器值的鏡像
寄存器模型Register Model學(xué)習(xí)筆記

評(píng)論