第三章 UVM基礎(chǔ)

3.1 uvm_component與uvm_object

3.1.1 uvm_component派生自u(píng)vm_object

uvm_object是UVM中最基本的類(lèi)。

uvm_component有兩大特性u(píng)vm_object所沒(méi)有的:(1)通過(guò)在new的時(shí)候指定parent參數(shù)來(lái)形成一種屬性的組織結(jié)構(gòu);(2)有phase的自動(dòng)執(zhí)行特點(diǎn)。

只有基于uvm_component派生的類(lèi)才可能成為UVM樹(shù)的結(jié)點(diǎn)。



UVM中常用類(lèi)的繼承關(guān)系


3.1.2 常用的派生自u(píng)vm_object的類(lèi)

除了driver, monitor, agent, model, scoreboard, env, test之外的幾乎所有的類(lèi),本質(zhì)上都是uvm_object,如sequence, sequence_item, transaction, config等。


uvm_sequence_item:所有transaction要從uvm_sequence_iem派生。 uvm_sequence_item是從uvm_transaction派生而來(lái)的,它相比uvm_transaction添加了很多實(shí)用的成員變量和函數(shù)/任務(wù)。

uvm_sequence:所有sequence要從uvm_sequence派生,sequence就是sequence_item的組合。

config:所有的config一般直接從uvm_object派生,其主要功能就是規(guī)范驗(yàn)證平臺(tái)的行為方式。config是把所有參數(shù)放在一個(gè)object中,然后通過(guò)config_db的方式設(shè)置給所有需要這些參數(shù)的component。

uvm_reg_item:派生自u(píng)vm_sequence_item,用于register model中。

uvm_reg_map, uvm_mem, uvm_reg_field, uvm_reg, uvm_reg_file, uvm_reg_block等與寄存器相關(guān)的眾多的類(lèi)都是派生自u(píng)vm_object,它們都是用于register model。

uvm_phase:派生自u(píng)vm_object,主要作用為控制uvm_component的行為方式,使得uvm_component平滑地在各個(gè)不同的phase之間依次運(yùn)轉(zhuǎn)。


3.1.3 常用的派生自u(píng)vm_component的類(lèi)

uvm_driver:所有的driver都要派生自u(píng)vm_driver。driver的主要功能就是向sequencer索要sequence_item(transaction),并且將sequence_item里的信息驅(qū)動(dòng)到DUT的端口上,這相當(dāng)于完成了從transaction級(jí)別到DUT能接受的端口級(jí)別信息的轉(zhuǎn)換。與uvm_component相比,uvm_driver多了如下幾個(gè)成員變量:

? ? ? ? ? ? uvm_seq_item_pull_port ?? #(REQ, RSP) ?? seq_item_port;

? ? ? ? ? ? uvm_seq_item_pull_port ?? #(REQ, RSP) ?? seq_item_prod_if;

? ? ? ? ? ? uvm_analysis_port ?? #(RSP) ?? rsp_port;

? ? ? ? ? ? REQ ?? req;

? ? ? ? ? ? RSP ?? rsp;


uvm_monitor:所有的monitor都要派生自u(píng)vm_monitor。monitor從DUT的pin上接收數(shù)據(jù),并且把接收到的數(shù)據(jù)轉(zhuǎn)換成transaction級(jí)別的sequence_item,再把轉(zhuǎn)換后的數(shù)據(jù)發(fā)送給scoreboard,供其比較。與uvm_component相比,uvm_monitor幾乎沒(méi)有做任何擴(kuò)充。

uvm_sequencer:所有的sequencer都要派生自u(píng)vm_sequencer。sequencer的功能就是組織管理sequence,當(dāng)driver要求數(shù)據(jù)時(shí),它就把sequence生成的sequence_item轉(zhuǎn)發(fā)個(gè)driver。與uvm_component相比,uvm_sequencer做了相當(dāng)多的擴(kuò)展。

uvm_scoreboard:一般的scoreboard都要派生自u(píng)vm_scoreboard。uvm_scoreboard幾乎沒(méi)有在uvm_component的基礎(chǔ)上做擴(kuò)展。

reference model:直接派生自u(píng)vm_component。

uvm_agent:所有agent派生自u(píng)vm_agent。它把driver和monitor封裝在一起。與uvm_component相比,uvm_agent的最大改動(dòng)在于引進(jìn)了一個(gè)變量is_active。

uvm_env:所有的env都要派生自u(píng)vm_env。env將驗(yàn)證平臺(tái)上用到的固定不變的component都封裝在一起。uvm_env沒(méi)有在uvm_component的基礎(chǔ)上做過(guò)多擴(kuò)展。

uvm_test:所有的測(cè)試用例都要派生自u(píng)vm_test或其派生類(lèi),不同的測(cè)試用例之間差異很大。uvm_env沒(méi)有在uvm_component的基礎(chǔ)上做任何擴(kuò)展。


3.1.4 與uvm_object相關(guān)的宏

在UVM中與uvm_object相關(guān)的factory宏有如下幾個(gè):

? ? ? ? ? ? uvm_object_utils:用于把一個(gè)直接或間接派生自u(píng)vm_object的類(lèi)注冊(cè)到factory中。

? ? ? ? ? ? uvm_object_param_utils:用于把一個(gè)直接或間接派生自u(píng)vm_object的參數(shù)化的類(lèi)注冊(cè)到factory中。

? ? ? ? ? ? uvm_object_utils_begin:當(dāng)需要使用field_automation機(jī)制時(shí),需要使用此宏。

? ? ? ? ? ? uvm_object_param_utils_begin

? ? ? ? ? ? uvm_object_utils_end:與uvm_object_*_begin成對(duì)出現(xiàn),facotry注冊(cè)的結(jié)束標(biāo)志。


3.1.5 與uvm_component相關(guān)的宏

在UVM中與uvm_component相關(guān)的factory宏有如下幾個(gè):

? ? ? ? ? ? uvm_component_utils

? ? ? ? ? ? uvm_component_param_utils

? ? ? ? ? ? uvm_component_utils_begin:在component中使用field_automation機(jī)制,可以自動(dòng)地使用config_db來(lái)得到某些變量的值。

? ? ? ? ? ? uvm_component_param_utils_begin

? ? ? ? ? ? uvm_component_utils_end


3.1.6 uvm_component的限制

uvm_component無(wú)法使用 clone 函數(shù),但是可以使用 copy 函數(shù)。 (clone = new + copy)

位于同一個(gè)父結(jié)點(diǎn)下的不同component,在實(shí)例化時(shí)不能使用相同的名字。


3.1.7 uvm_component與uvm_object的二元結(jié)構(gòu)



3.2 UVM的樹(shù)形結(jié)構(gòu)

3.2.1 uvm_component中的parent參數(shù)

3.2.2 UVM樹(shù)的跟


完整的UVM樹(shù)

UVM中真正的樹(shù)根是一個(gè)稱(chēng)為uvm_top的東西。uvm_top是一個(gè)全局變量,它時(shí)uvm_root的一個(gè)實(shí)例(而且也是唯一一個(gè)實(shí)例),而uvm_root派生自u(píng)vm_component,uvm_top的parent是null。

如果一個(gè)component在實(shí)例化時(shí),其parent被設(shè)置為null,那么這個(gè)component的parent將會(huì)被系統(tǒng)設(shè)置為uvm_root的實(shí)例uvm_top。還可以使用如下方式得到它的指針:

? ? ? ? ? ? uvm_root top;

? ? ? ? ? ? top = uvm_root::get();

3.2.3 層次結(jié)構(gòu)相關(guān)函數(shù)

UVM提供了一系列的接口函數(shù)用于訪問(wèn)UVM樹(shù)中的結(jié)點(diǎn):

? ? ? ? ? ? get_parent()

? ? ? ? ? ? get_child(string name):name表示此child的實(shí)例在實(shí)例化時(shí)指定的名字。

? ? ? ? ? ? uvm_component array[$]

????????????get_children(array)

? ? ? ? ? ? get_num_children()



3.3 field automation機(jī)制

3.3.1 field automation機(jī)制相關(guān)的宏

`define uvm_field_**_**(ARG, FLAG)


3.3.2 field automation機(jī)制的常用函數(shù)

copy 函數(shù):

? ? ? ? ? ? B.copy(A):把實(shí)例A復(fù)制到B實(shí)例中,B必須已經(jīng)使用new函數(shù)分配好了內(nèi)存空間。

compare 函數(shù):

? ? ? ? ? ? A.compare(B) or B.compare(A)。

pack_bytes 函數(shù):

? ? ? ? ? ? 用于將所有字段打包成byte流。

unpack_bytes 函數(shù):

? ? ? ? ? ? 用于將一個(gè)byte流逐一恢復(fù)到某個(gè)類(lèi)的實(shí)例中。

pack 函數(shù):

? ? ? ? ? ? 用于將所有的字段打包成bit流。

unpack 函數(shù):

? ? ? ? ? ? 用于將一個(gè)bit流逐一恢復(fù)到某個(gè)類(lèi)的實(shí)例中。

pack_ints 函數(shù)

unpack_ints 函數(shù)

print 函數(shù)

clone 函數(shù)

3.3.3 field automation機(jī)制中標(biāo)志位的使用

UVM的標(biāo)志位本身是一個(gè)17bit的數(shù)字:


3.3.4 field automation中宏與if的結(jié)合



3.4 UVM中打印信息的控制

3.4.1 設(shè)置打印信息的冗余度閾值

在打印信息之前,UVM會(huì)比較要顯示信息的冗余度級(jí)別與默認(rèn)的冗余度閾值。如果小于等于閾值,就會(huì)顯示。默認(rèn)的冗余度閾值時(shí)UVM_MEDIUM,所有低于等于UVM_MEDIUM的信息都會(huì)被打印出來(lái)。

get_report_verbosity_level 函數(shù):得到某個(gè)component的冗余度閾值。

set_report_verbosity_level 函數(shù):設(shè)置某個(gè)特定的component的默認(rèn)冗余度閾值。由于需要牽扯到層次引用,所以需要在connect_phase及之后的phase才可以調(diào)用這個(gè)函數(shù)。如果不牽扯到任何層次引用,就可以在之前調(diào)用。

set_report_verbosity_level_hier 函數(shù):設(shè)置某個(gè)component及其以下所有的component的冗余度閾值。

set_report_id_verbosity 函數(shù):根據(jù)不同的uvm_info宏的id來(lái)設(shè)置冗余度閾值。

set_report_id_verbosity_hier 函數(shù)

UVM支持在命令行中設(shè)置冗余度閾值:

? ? ? ? ? ? <sim command> +UVM_VERBOSITY=UVM_HIGH

????????????<sim command> +UVM_VERBOSITY=HIGH ? ? ? ?

? ? ? ? ? ? 將整個(gè)驗(yàn)證平臺(tái)的冗余度閾值設(shè)置為UVM_HIGH。


3.4.1 重載打印信息的嚴(yán)重性

set_report_severity_override(UVM_WARNING, UVM_ERROR);

set_report_severity_id_override(UVM_WARNING, "my_driver", UVM_ERROR);

命令行中實(shí)現(xiàn):

? ? ? ? ? ? <sim command> +uvm_set_severity=<comp>,<id>,<current severity>,<new severity>


3.4.2 UVM_ERROR到達(dá)一定數(shù)量結(jié)束仿真

set_report_max_quit_count(number);


3.4.3 設(shè)置計(jì)數(shù)的目標(biāo)

set_report_severity_action(UVM_WARNING, UVM_DISPLAY | UVM_COUNT):把UVM_WARNING加入計(jì)數(shù)目標(biāo)。

set_report_severity_action_hier(UVM_WARNING, UVM_DISPLAY | UVM_COUNT);

set_report_severity_action(UVM_ERROR, UVM_DISPLAY):把UVM_ERROR從統(tǒng)計(jì)計(jì)數(shù)目標(biāo)中移除。

set_report_id_action("my_drv", UVM_DISPLAY | UVM_COUNT):對(duì)某個(gè)特定的ID進(jìn)行計(jì)數(shù)。把ID為my_drv的所有信息加入到計(jì)數(shù)中,UVM_INFO, UVM_WARNING, UVM_ERROR, UVM_FATAL。

set_report_severity_id_action(UVM_WARNING, "my_driver", UVM_DISPLAY | UVM_COUNT);

......

命令行中設(shè)置技術(shù)目標(biāo):

? ? ? ? ? ? <sim command> +uvm_set_action=<comp>,<id>,<severity>,<action>

3.4.5 UVM的斷點(diǎn)功能

當(dāng)程序執(zhí)行到斷點(diǎn)處時(shí),停止仿真,進(jìn)入交互模式,從而進(jìn)行調(diào)試。

"base_test.sv"

virtual function void connect_phase(uvm_phase phase);

? ? env.i_agt.drv.set_report_severity_action(UVM_WARNING, UVM_DISPLAY | UVM_STOP);

...

當(dāng)env.i_agt.drv中出現(xiàn)UVM_WARNIN時(shí),立即停止仿真,進(jìn)入交互模式。

命令行中設(shè)置UVM斷電:

? ? ? ? ? ? <sim command> +uvm_set_action="uvm_test_top.env.i_agt_drv,my_driver,UVM_WARNING,UVM_DISPLAY | UVM_STOP"


3.4.6 將輸出信息導(dǎo)入文件中


3.4.7 控制打印信息的行為



3.5 config_db機(jī)制

3.5.1 UVM中的路徑

變量名與其實(shí)例化時(shí)傳遞的名字不一致的情況應(yīng)該盡量避免。


3.5.2 set 與 get函數(shù)

config_db機(jī)制用于在UVM驗(yàn)證平臺(tái)間傳遞參數(shù),set函數(shù)和get函數(shù)通常成對(duì)出現(xiàn)。


3.5.3 省略get語(yǔ)句

在某些情況下,可以省略get語(yǔ)句:

(1)必須使用uvm_component_utils宏注冊(cè);(2)變量必須使用uvm_field宏注冊(cè);(3)在調(diào)用set函數(shù)的時(shí)候,set函數(shù)的第三個(gè)參數(shù)必須要與get函數(shù)中的變量名字相一致。


3.5.4 跨層次的多重設(shè)置

UVM規(guī)定層次越高,它的優(yōu)先級(jí)越高。越靠近根結(jié)點(diǎn)uvm_top,其層次越高,set函數(shù)的優(yōu)先級(jí)也越高。

寄信人的層次相同時(shí),比較寄信的時(shí)間。

在調(diào)用set函數(shù)時(shí)其第一個(gè)參數(shù)應(yīng)該盡量使用this。在無(wú)法使用this指針的情況下(如在top_tb中),使用null或者uvm_root::get()。


3.5.5 同一層次的多重設(shè)置


3.5.6 非直線的設(shè)置與獲取

非直線的設(shè)置,如在scoreboard中對(duì)driver的某些變量使用config_db機(jī)制進(jìn)行設(shè)置:

? ? ? ? ? ? uvm_config_db#(int)::set(this.m_parent, "i_agt.drv", "pre_num", 200);

? ? ? ? ? ? or

? ? ? ? ? ? uvm_config_db#(int)::set(uvm_root::get(), "uvm_test_top.env.i_agt.drv", "pre_num", 200);


非直線的獲取,如在reference model中獲取其他component設(shè)置給my_driver的參數(shù)的值:

? ? ? ? ? ? void'(uvm_config_db#(int)::get(this.m_parent, "i_agt.drv", "pre_num", drv_pre_num));

? ? ? ? ? ? or

? ? ? ? ? ? void'(uvm_config_db#(int)::get(uvm_root::get(), "uvm_test_top.env.i_agt.drv", "pre_num", drv_pre_num));


3.5.7 config_db機(jī)制對(duì)通配符的支持

不推薦使用通配符。


3.5.8 check_config_usage

如果set函數(shù)的第二個(gè)參數(shù)設(shè)置錯(cuò)誤,不會(huì)給出錯(cuò)誤信息。

check_config_usage()函數(shù)可以顯示出截止到此函數(shù)調(diào)用時(shí)有哪些參數(shù)是被設(shè)置過(guò)但是卻沒(méi)有被獲取過(guò),此函數(shù)一般在connect_phase被調(diào)用。


3.5.10 config_db的調(diào)試

print_config(1):參數(shù)1表示遞歸的查詢,參數(shù)0只顯示當(dāng)前component的信息。

print_config會(huì)遍歷整個(gè)驗(yàn)證平臺(tái)的所有節(jié)點(diǎn),找出哪些被設(shè)置過(guò)的信息對(duì)于它們是可見(jiàn)的。

命令行參數(shù):

? ? ? ? ? ? <sim command> +UVM_CONFIG_DB_TRACE

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容