0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

UVM環(huán)境debug的正確開啟方式

冬至子 ? 來源:CSDN ? 作者:谷公子 ? 2023-07-03 18:14 ? 次閱讀

在使用UVM搭建環(huán)境時(shí),遇到問題時(shí),調(diào)試方式有千千萬萬,但很有必要了解下UVM庫提供了哪些內(nèi)建的調(diào)試手段,可以少走彎路,大大提升效率,而不是瘋狂加各種打印消息。

UVM庫給各個(gè)主要機(jī)制都提供了易于使用的內(nèi)置調(diào)試方法,來輔助定位使用UVM環(huán)境遇到的問題。

一、調(diào)試config_db機(jī)制問題

UVM庫內(nèi)實(shí)現(xiàn)了一個(gè)資源庫,它用于存儲(chǔ)配置信息,TB里各個(gè)組件可以根據(jù)情況使用config_db往里面存或者取各種類型數(shù)據(jù)。config_db存(set())和取(get())的關(guān)鍵在于字符串匹配,為此UVM庫提供了一些功能來幫助調(diào)試這些字符串匹配。

1. 使用+UVM_CONFIG_DB_TRACE和+UVM_RESOURCE_DB_TRACE命令行參數(shù)

UVM庫在Command Line上提供了+UVM_CONFIG_DB_TRACE和+UVM_RESOURCE_DB_TRACE命令行參數(shù),當(dāng)運(yùn)行仿真命令時(shí),如果帶上上述的參數(shù),那么在log中會(huì)打印出對(duì)資源庫的存和取的信息。+UVM_CONFIG_DB_TRACE用于uvm_config_db進(jìn)行的存取,+UVM_RESOURCE_DB_TRACE用于uvm_resource_db進(jìn)行的存取。比如我們?cè)赒uestasim工具的vsim命令后加上+UVM_CONFIG_DB_TRACE,然后有以下的uvm_config_db的set()和get()調(diào)用:

// In the TB env:
uvm_config_db #(int)::set(this, "*", "var", 666);
// In the TB driver:
int get_value;
if ( !uvm_config_db #(int)::get(this, "*", "var", get_value) ) begin
    `uvm_fatal(get_type_name(), "var is missing in config_db")
end else begin
    `uvm_info(get_type_name(), $sformatf("get var from env"), UVM_LOW)
end

那么在log中 可以找到以下打印信息:

UVM_INFO  …/uvm-1.2/src/base/uvm_resource_db.svh(121) @ 0.000ns: reporter 
// db類型                   匹配字符串               數(shù)據(jù)類型          路徑                   數(shù)據(jù)值
[CFGDB/SET] Configuration 'uvm_test_top.env.*.var' (type int) set by uvm_test_top.env = (int) 666
UVM_INFO  …/uvm-1.2/src/base/uvm_resource_db.svh(121) @ 0.000ns: reporter [CFGDB/GET] Configuration 
'uvm_test_top.env.d_agent.drv_h.*.var' (type int) read by uvm_test_top.env.d_agent.drv_h = (int) 666

從log信息可以看出,UVM會(huì)把對(duì)資源庫的set()和get()的數(shù)據(jù)類型,數(shù)據(jù)值、存取路徑、存取類型和匹配字符都打印出來,這樣就很方便我們?nèi)ザㄎ籾vm_config_db的匹配問題了。

2. 調(diào)用UVM component內(nèi)置函數(shù)

在uvm_component內(nèi)部提供了print_config()內(nèi)建函數(shù),使用它可以打印出當(dāng)前uvm_component范圍可見的所有config_db操作內(nèi)容。如果參數(shù)recurse為1,會(huì)把所有子components的可見的config_db操作內(nèi)容也遞歸調(diào)用打印出來。如果audit為1,會(huì)把調(diào)用config_db進(jìn)行操作的時(shí)間、次數(shù)和操作者路徑也打印出來。print_config()的函數(shù)定義如下:

function void uvm_component::print_config(bit recurse = 0, audit = 0);

假如我們?cè)谥袄拥腡B driver里調(diào)用:

print_config(.recurse(0), .audit(1));

那么將會(huì)有以下log輸出:

#  var [/^uvm_test_top\\.env\\..*$/] : (int) 666   
# UVM_INFO .../uvm-1.2/src/base/uvm_resource.svh(564) @ 0.000ns: reporter [UVM/RESOURCE/ACCESSOR] 
uvm_test_top.env reads: 0 @ 0.000ns  writes: 1 @ 0.000ns
# uvm_test_top.env.d_agent.drv_h reads: 1 @ 0.000ns  writes: 0 @ 0.000ns

它會(huì)把TB driver上config_db操作的字符串匹配、數(shù)據(jù)類型和數(shù)據(jù)值都打印出來,另外,由于我們指定audit為1,因此也會(huì)把config_db操作的時(shí)間、次數(shù)和操作者路徑打印出來了。這個(gè)一個(gè)很強(qiáng)大的debug功能。

建議可以在end_of_elaboration_phase里去調(diào)用這個(gè)函數(shù),因?yàn)檫@時(shí)候config_db操作基本都已經(jīng)完成了。

3. dump整個(gè)資源庫

如果遇到奇怪的訪問資源庫問題無法解決,另一種暴力debug方式就是將整個(gè)資源庫都打印出來。UVM提供了uvm_config_db #()::dump()函數(shù),可以將當(dāng)前資源庫的信息都打印出來,其中可以指定任何類型,主要是因?yàn)閐ump()是個(gè)static的函數(shù),提供任何類型最終訪問的dump()函數(shù)是同一個(gè),打印出的資源庫信息也是一樣的。

比如我們?nèi)栽赥B driver里調(diào)用:

uvm_config_db #(bit)::dump();

在log里增加的信息將有:

# UVM_INFO .../uvm-1.2/src/base/uvm_resource.svh(1347) @ 0.000ns: reporter
 [UVM/RESOURCE/DUMP] 
# === resource pool ===
...
#  var [/^uvm_test_top\\.env\\..*$/] : (int) 666  
...
# UVM_INFO .../uvm-1.2/src/base/uvm_resource.svh(1354) @ 0.000ns: reporter

 [UVM/RESOURCE/DUMP] === end of resource pool ===

也是建議可以在end_of_elaboration_phase里去調(diào)用這個(gè)函數(shù),因?yàn)檫@時(shí)候config_db操作基本都已經(jīng)完成了。

結(jié)合上述的三個(gè)方法,可以說100%的config_db相關(guān)的問題都可以搞定了。

二、調(diào)試objection機(jī)制問題

Objection用于控制消耗時(shí)間的uvm_phase在何時(shí)結(jié)束,TB中raise和drop的objection次數(shù)要一樣,但如果在多個(gè)地方進(jìn)行raise或drop的話,遇到objection沒有啟動(dòng)或無法結(jié)束時(shí),就比較難調(diào)試了。因此,UVM庫提供了用于跟蹤objection raise和drop的命令行參數(shù)+UVM_OBJECTION_TRACE。

比如我們?cè)赒uestasim工具的vsim命令后加上+UVM_OBJECTION_TRACE。那么log里將增加以下類似信息。

# UVM_INFO @ 0.000ns: run [OBJTN_TRC] Object uvm_test_top raised 1 objection(s) 
(START basetest): count=1  total=1
# UVM_INFO @ 0.000ns: run [OBJTN_TRC] Object uvm_top added 1 objection(s) to its 
total (raised from source object uvm_test_top, START basetest): count=0  total=1
...
# UVM_INFO @ 14190.000ns: run [OBJTN_TRC] Object uvm_test_top dropped 1 objection(s) 
(END basetest): count=0  total=0
# UVM_INFO @ 14190.000ns: run [OBJTN_TRC] Object uvm_test_top all_dropped 1 objection(s) 
(END basetest): count=0  total=0
# UVM_INFO @ 14190.000ns: run [OBJTN_TRC] Object uvm_top subtracted 1 objection(s) 
from its total (dropped from source object uvm_test_top, END basetest): count=0  total=0
# UVM_INFO @ 14190.000ns: run [OBJTN_TRC] Object uvm_top subtracted 1 objection(s) 
from its total (all_dropped from source object uvm_test_top, END basetest): count=0  total=0

三、調(diào)試phase機(jī)制問題

為了幫助用戶查看各個(gè)uvm_phase在何時(shí)開始和結(jié)束,UVM庫提供了+UVM_PHASE_TRACE命令行參數(shù)。

比如我們?cè)赒uestasim工具的vsim命令后加上+UVM_PHASE_TRACE。那么log里將增加以下類似信息。

# UVM_INFO .../uvm-1.2/src/base/uvm_phase.svh(1620) @ 0.000ns: reporter [PH/TRC/DONE] 
Phase 'common.connect' (id=37) Completed phase
# UVM_INFO .../uvm-1.2/src/base/uvm_phase.svh(1655) @ 0.000ns: reporter [PH/TRC/SCHEDULED]
 Phase 'common.end_of_elaboration' (id=40) Scheduled from phase common.connect
# UVM_INFO .../uvm-1.2/src/base/uvm_phase.svh(1345) @ 0.000ns: reporter [PH/TRC/STRT] 
Phase 'common.end_of_elaboration' (id=40) Starting phase
# UVM_INFO .../uvm-1.2/src/base/uvm_phase.svh(1620) @ 0.000ns: reporter [PH/TRC/DONE] 
Phase 'common.end_of_elaboration' (id=40) Completed phase

四、調(diào)試factory機(jī)制問題

UVM庫的factory機(jī)制用于創(chuàng)建對(duì)象,它是1個(gè)singleton對(duì)象,我們可以通過調(diào)用uvm_factory::get()獲得它的句柄。當(dāng)我們對(duì)factory機(jī)制創(chuàng)建的對(duì)象有疑問時(shí),可以使用factory機(jī)制提供的函數(shù)去調(diào)試有誰注冊(cè)了factory,factory override機(jī)制覆蓋了誰,最終factory為給定類型返回什么對(duì)象。Factory機(jī)制提供了3個(gè)函數(shù)去輔助debug。

1. print()

這個(gè)函數(shù)會(huì)根據(jù)參數(shù)all_types的不同,打印出當(dāng)前factory中注冊(cè)的類型、實(shí)例覆蓋和類型覆蓋。它的定義為:

function void print (int all_types=1);
比如我們?nèi)栽赥B driver中使用以下代碼:

uvm_factory f = uvm_factory::get();
f.print();

那么輸出log將增加以下類似信息:

#### Factory Configuration (*)
# 
#   No instance overrides are registered with this factory
#
#   Requested Type  Override Type
#   --------------  -------------
#   seq_base    seq1
#
# All types registered with the factory: 288 total
#   Type Name
#   ---------
    
#   ...
 
# (*) Types with no associated type name will be printed as < unknown >

從log中可以很清楚的看出,factory注冊(cè)了多少類型,類型之間的override關(guān)系,instance之間的override關(guān)系,基本上factory的問題看這個(gè)信息都可以搞定了。

2. debug_create_by_type()和debug_create_by_name()

這兩個(gè)函數(shù)對(duì)factory的搜索算法類似于create_ by_type()和create _by_type(),但它們不創(chuàng)建新對(duì)象。相反,它們提供了關(guān)于將返回的對(duì)象類型的詳細(xì)信息,和列出了override相關(guān)信息。具體傳遞參數(shù)用法,大家可以查詢UVM手冊(cè)。

總結(jié)上面的三個(gè)方法,不管有沒有factory問題,推薦統(tǒng)一都在TB base testcase的end_of_elaboration_phase里調(diào)用factory的print()函數(shù),方便大家查詢。

五、調(diào)試TLM 問題

UVM中的組件是通過TLM ports/exports/imps連接在一起的。UVM提供了兩個(gè)函數(shù)都可以在port/export/imp上使用,可以幫助用戶理解哪些對(duì)象連接在一起的。這兩個(gè)函數(shù)是get_connected_to()和get_provided_to(),這兩個(gè)函數(shù)返回的是uvm_port_component_base類型的關(guān)聯(lián)數(shù)組。TLM ports通常是fanout類型的,所以它通常會(huì)使用get_connected_to(),TLM exports/imps通常是fanin類型的,所以它一般會(huì)使用get_provided_to()。

在IEEE 1800.2中,增加了debug_connected_to() 和debug_provided_to(),它們的功能與上述兩個(gè)函數(shù)其實(shí)一樣,只不過它們返回的是可視化文本消息,方便用戶查看。個(gè)人比較推薦使用這兩個(gè)函數(shù)。

這四個(gè)函數(shù)的定義如下:

function void get_connected_to (ref uvm_port_list list);
function void get_provided_to (ref uvm_port_list list);
function void debug_connected_to (int level=0, int max_level=-1);
function void debug_provided_to  (int level=0, int max_level=-1);

這些函數(shù)需要在end_of_elaboration_phase里或之后調(diào)用,由于這時(shí)候TLM的port連接才完成了。

六、調(diào)試callback問題

Callback允許標(biāo)準(zhǔn)對(duì)象的外部對(duì)象上調(diào)用函數(shù)和任務(wù),來擴(kuò)展額外的功能。如果在UVM TB中使用callback功能,可以調(diào)用uvm_typed_callbacks#(type T=uvm_object)里的display()函數(shù)打印出當(dāng)前注冊(cè)的所有callback。display()函數(shù)定義如下:

static function void display( T obj = null )

這個(gè)函數(shù)也是需要在end_of_elaboration_phase里調(diào)用,而且它是靜態(tài)類型的,可以使用uvm_callbacks(xxx)::display()方式使用。

UVM也給callback的調(diào)試增加了+define+UVM_CB_TRACE_ON編譯選項(xiàng),當(dāng)編譯帶上UVM_CB_TRACE_ON宏時(shí),在log會(huì)也會(huì)打印出callback的跟蹤信息。

七、其它調(diào)試方式**

1.打印UVM層次結(jié)構(gòu)

在UVM環(huán)境搭建后之后,我們可以通過print_topology()函數(shù)將UVM層次結(jié)構(gòu)打印出來。

比如我們?cè)赥B里以下任一種方法代碼:

// 方法1:
uvm_top.print_topology();   // 需要UVM hierarchy建立之后調(diào)用
// 方法2:
uvm_top.enable_print_topology = 1;  // 在end_of_elaboration phase之前調(diào)用

在log中會(huì)出現(xiàn)以” [UVMTOP] UVM testbench topology:”開頭的打印信息,里面詳細(xì)列出了當(dāng)前UVM結(jié)構(gòu)。

2. uvm_info打印控制

在UVM中,可以指定verbosity來有選擇性的打印出uvm_info里的消息。UVM提供了全局式和分布式的控制方法。

全局式:這種控制方法是使用+UVM_VERBOSITY命令行參數(shù)來完成的。

分布式:這種控制方法是使用每個(gè)組件自帶的verbosity設(shè)置方法完成的,通過使用+uvm_set_verbosity命令行參數(shù)。當(dāng)然也可以直接在組件里使用set_report_verbosity_level()等方法設(shè)置的。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • UVM
    UVM
    +關(guān)注

    關(guān)注

    0

    文章

    181

    瀏覽量

    19088
  • TLM
    TLM
    +關(guān)注

    關(guān)注

    1

    文章

    32

    瀏覽量

    24711
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    IC驗(yàn)證之UVM常用宏匯總分析(四)

    OVM中過時(shí)的用法,使用純凈的UVM環(huán)境:`define UVM_NO_DEPRECATED除了上述通用的宏外,針對(duì)不同的仿真工具需要定義不同的宏:QUESTA、VCS、INCA分別對(duì)應(yīng)Mentor
    發(fā)表于 12-02 15:24

    什么是uvm?uvm的特點(diǎn)有哪些呢

    大家好,我是一哥,上章內(nèi)容我們介紹什么是uvm?uvm的特點(diǎn)以及uvm為用戶提供了哪些資源?本章內(nèi)容我們來看一看一個(gè)典型的uvm驗(yàn)證平臺(tái)應(yīng)該是什么樣子的,來看一個(gè)典型的
    發(fā)表于 02-14 06:46

    UVM sequence分層有哪幾種方式

    驗(yàn)證環(huán)境需要對(duì)數(shù)據(jù)進(jìn)行分層。例如,將32比特的寄存器讀寫封裝成數(shù)據(jù)讀寫和狀態(tài)讀寫等實(shí)際業(yè)務(wù)操作等或者對(duì)底層sequence進(jìn)行一些隨機(jī)控制等。實(shí)現(xiàn)這種分層可以有兩種方式:1、Sequence
    發(fā)表于 04-11 16:37

    如何構(gòu)建UVM寄存器模型并將寄存器模型集成到驗(yàn)證環(huán)境

    ),通常也叫寄存器模型,顧名思義就是對(duì)寄存器這個(gè)部件的建模。本文要介紹的內(nèi)容,包括對(duì)UVM寄存器模型的概述,如何構(gòu)建寄存器模型,以及如何將寄存器模型集成到驗(yàn)證環(huán)境中。篇幅原因,將在下一篇文章再給出寄存器
    發(fā)表于 09-23 14:29

    談?wù)?b class='flag-5'>UVM中的uvm_info打印

    ,  UVM_FULL = 400,  UVM_DEBUG = 500  } uvm_verbosity;  2. uvm_report_enabled(xxx)函數(shù)上有個(gè)
    發(fā)表于 03-17 16:41

    一種基于UVM的混合信號(hào)驗(yàn)證環(huán)境

    一種基于UVM的混合信號(hào)驗(yàn)證環(huán)境_耿睿
    發(fā)表于 01-07 21:39 ?1次下載

    利用Systemverilog+UVM搭建soc驗(yàn)證環(huán)境

    利用Systemverilog+UVM搭建soc驗(yàn)證環(huán)境
    發(fā)表于 08-08 14:35 ?5次下載

    如何優(yōu)雅地結(jié)束UVM Test

    分享一下在UVM驗(yàn)證環(huán)境中,結(jié)束仿真的幾種方式,不同結(jié)束仿真的方式適合不同的應(yīng)用場(chǎng)景。
    的頭像 發(fā)表于 12-17 11:23 ?2359次閱讀
    如何優(yōu)雅地結(jié)束<b class='flag-5'>UVM</b> Test

    Easier UVM Code Generator Part 4:生成層次化的驗(yàn)證環(huán)境

    本文使用Easier UVM Code Generator生成包含多個(gè)agent和interface的uvm驗(yàn)證環(huán)境。
    的頭像 發(fā)表于 06-06 09:13 ?946次閱讀

    UVM里的6個(gè)常見參數(shù)介紹分析

    UVM預(yù)先定義了六個(gè)詳細(xì)程度; UVM_NONE到UVM_DEBUG。這些級(jí)別只不過是整數(shù)枚舉值
    的頭像 發(fā)表于 06-06 12:33 ?3786次閱讀
    <b class='flag-5'>UVM</b>里的6個(gè)常見參數(shù)介紹分析

    基于UVM驗(yàn)證環(huán)境開發(fā)測(cè)試流程

    驗(yàn)證環(huán)境用戶需要?jiǎng)?chuàng)建許多測(cè)試用例來驗(yàn)證一個(gè)DUT的功能是否正確,驗(yàn)證環(huán)境開發(fā)者應(yīng)該通過以下方式提高測(cè)試用例的開發(fā)效率
    的頭像 發(fā)表于 06-09 11:11 ?840次閱讀
    基于<b class='flag-5'>UVM</b>驗(yàn)證<b class='flag-5'>環(huán)境</b>開發(fā)測(cè)試流程

    如何用Verdi查看UVM環(huán)境中的變量?

    我們常用的debug UVM的方法是通過打印log實(shí)現(xiàn)。有沒有辦法像 debug RTL代碼一樣將 UVM 中變量拉到波形上看呢?答案是有的,下面讓我們看看是怎么做到的。
    的頭像 發(fā)表于 06-25 16:01 ?1379次閱讀
    如何用Verdi查看<b class='flag-5'>UVM</b><b class='flag-5'>環(huán)境</b>中的變量?

    有沒有辦法像debug RTL代碼一樣將UVM中變量拉到波形上看呢?

    我們常用的debug UVM的方法是通過打印log實(shí)現(xiàn)。有沒有辦法像 debug RTL代碼一樣將 UVM 中變量拉到波形上看呢?答案是有的,下面讓我們看看是怎么做到的。
    的頭像 發(fā)表于 06-29 15:14 ?1211次閱讀
    有沒有辦法像<b class='flag-5'>debug</b> RTL代碼一樣將<b class='flag-5'>UVM</b>中變量拉到波形上看呢?

    UVM設(shè)計(jì)中的sequence啟動(dòng)方式有哪幾種呢?

    本篇介紹UVM中的sequence,這是UVM中最基礎(chǔ)的部分。對(duì)于前面介紹的uvm_callback, uvm_visitor等,很少被使用到或者也只有搭建平臺(tái)的人會(huì)使用。
    的頭像 發(fā)表于 08-17 10:07 ?3357次閱讀
    <b class='flag-5'>UVM</b>設(shè)計(jì)中的sequence啟動(dòng)<b class='flag-5'>方式</b>有哪幾種呢?

    為什么需要debug時(shí)鐘頻率 Debug時(shí)鐘頻率原理詳解

    在芯片設(shè)計(jì)中,為了便于定位故障,有時(shí)候需要確認(rèn)部分時(shí)鐘頻率是否正確,需要部分debug手段。常見的方式是:將時(shí)鐘信號(hào)引到芯片管腳,通過儀器測(cè)量。這類方式必須要測(cè)量?jī)x器,并且需要熟練使用
    的頭像 發(fā)表于 09-20 14:17 ?703次閱讀
    為什么需要<b class='flag-5'>debug</b>時(shí)鐘頻率 <b class='flag-5'>Debug</b>時(shí)鐘頻率原理詳解