3.1 uvm_component與uvm_object
3.1.1 uvm_component派生自uvm_object
uvm_object是UVM中最基本的類。
uvm_component有兩大特性uvm_object所沒有的:(1)通過在new的時(shí)候指定parent參數(shù)來形成一種屬性的組織結(jié)構(gòu);(2)有phase的自動(dòng)執(zhí)行特點(diǎn)登刺。
只有基于uvm_component派生的類才可能成為UVM樹的結(jié)點(diǎn)。
3.1.2 常用的派生自uvm_object的類
除了driver, monitor, agent, model, scoreboard, env, test之外的幾乎所有的類祝闻,本質(zhì)上都是uvm_object寄疏,如sequence, sequence_item, transaction, config等瞧栗。
uvm_sequence_item:所有transaction要從uvm_sequence_iem派生伴榔。 uvm_sequence_item是從uvm_transaction派生而來的纹蝴,它相比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中兼犯,然后通過config_db的方式設(shè)置給所有需要這些參數(shù)的component。
uvm_reg_item:派生自uvm_sequence_item集漾,用于register model中切黔。
uvm_reg_map, uvm_mem, uvm_reg_field, uvm_reg, uvm_reg_file, uvm_reg_block等與寄存器相關(guān)的眾多的類都是派生自uvm_object,它們都是用于register model帆竹。
uvm_phase:派生自uvm_object绕娘,主要作用為控制uvm_component的行為方式脓规,使得uvm_component平滑地在各個(gè)不同的phase之間依次運(yùn)轉(zhuǎn)栽连。
3.1.3 常用的派生自uvm_component的類
uvm_driver:所有的driver都要派生自uvm_driver。driver的主要功能就是向sequencer索要sequence_item(transaction),并且將sequence_item里的信息驅(qū)動(dòng)到DUT的端口上秒紧,這相當(dāng)于完成了從transaction級別到DUT能接受的端口級別信息的轉(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都要派生自uvm_monitor熔恢。monitor從DUT的pin上接收數(shù)據(jù)脐湾,并且把接收到的數(shù)據(jù)轉(zhuǎn)換成transaction級別的sequence_item,再把轉(zhuǎn)換后的數(shù)據(jù)發(fā)送給scoreboard叙淌,供其比較秤掌。與uvm_component相比,uvm_monitor幾乎沒有做任何擴(kuò)充鹰霍。
uvm_sequencer:所有的sequencer都要派生自uvm_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都要派生自uvm_scoreboard渠羞。uvm_scoreboard幾乎沒有在uvm_component的基礎(chǔ)上做擴(kuò)展。
reference model:直接派生自uvm_component智哀。
uvm_agent:所有agent派生自uvm_agent次询。它把driver和monitor封裝在一起。與uvm_component相比瓷叫,uvm_agent的最大改動(dòng)在于引進(jìn)了一個(gè)變量is_active渗蟹。
uvm_env:所有的env都要派生自uvm_env。env將驗(yàn)證平臺(tái)上用到的固定不變的component都封裝在一起赞辩。uvm_env沒有在uvm_component的基礎(chǔ)上做過多擴(kuò)展雌芽。
uvm_test:所有的測試用例都要派生自uvm_test或其派生類,不同的測試用例之間差異很大辨嗽。uvm_env沒有在uvm_component的基礎(chǔ)上做任何擴(kuò)展世落。
3.1.4 與uvm_object相關(guān)的宏
在UVM中與uvm_object相關(guān)的factory宏有如下幾個(gè):
? ? ? ? ? ? uvm_object_utils:用于把一個(gè)直接或間接派生自uvm_object的類注冊到factory中。
? ? ? ? ? ? uvm_object_param_utils:用于把一個(gè)直接或間接派生自uvm_object的參數(shù)化的類注冊到factory中糟需。
? ? ? ? ? ? uvm_object_utils_begin:當(dāng)需要使用field_automation機(jī)制時(shí)屉佳,需要使用此宏。
? ? ? ? ? ? uvm_object_param_utils_begin
? ? ? ? ? ? uvm_object_utils_end:與uvm_object_*_begin成對出現(xiàn)洲押,facotry注冊的結(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來得到某些變量的值杈帐。
? ? ? ? ? ? uvm_component_param_utils_begin
? ? ? ? ? ? uvm_component_utils_end
3.1.6 uvm_component的限制
uvm_component無法使用 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的樹形結(jié)構(gòu)
3.2.1 uvm_component中的parent參數(shù)
3.2.2 UVM樹的跟
UVM中真正的樹根是一個(gè)稱為uvm_top的東西跃须。uvm_top是一個(gè)全局變量,它時(shí)uvm_root的一個(gè)實(shí)例(而且也是唯一一個(gè)實(shí)例)娃兽,而uvm_root派生自uvm_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ù)用于訪問UVM樹中的結(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è)類的實(shí)例中。
pack 函數(shù):
? ? ? ? ? ? 用于將所有的字段打包成bit流凡恍。
unpack 函數(shù):
? ? ? ? ? ? 用于將一個(gè)bit流逐一恢復(fù)到某個(gè)類的實(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ì)比較要顯示信息的冗余度級別與默認(rèn)的冗余度閾值嚼酝。如果小于等于閾值浮还,就會(huì)顯示。默認(rèn)的冗余度閾值時(shí)UVM_MEDIUM闽巩,所有低于等于UVM_MEDIUM的信息都會(huì)被打印出來钧舌。
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來設(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):對某個(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ù)通常成對出現(xiàn)十办。
3.5.3 省略get語句
在某些情況下,可以省略get語句:
(1)必須使用uvm_component_utils宏注冊超棺;(2)變量必須使用uvm_field宏注冊向族;(3)在調(diào)用set函數(shù)的時(shí)候,set函數(shù)的第三個(gè)參數(shù)必須要與get函數(shù)中的變量名字相一致棠绘。
3.5.4 跨層次的多重設(shè)置
UVM規(guī)定層次越高件相,它的優(yōu)先級越高。越靠近根結(jié)點(diǎn)uvm_top氧苍,其層次越高夜矗,set函數(shù)的優(yōu)先級也越高。
寄信人的層次相同時(shí)让虐,比較寄信的時(shí)間紊撕。
在調(diào)用set函數(shù)時(shí)其第一個(gè)參數(shù)應(yīng)該盡量使用this。在無法使用this指針的情況下(如在top_tb中)赡突,使用null或者uvm_root::get()对扶。
3.5.5 同一層次的多重設(shè)置
3.5.6 非直線的設(shè)置與獲取
非直線的設(shè)置,如在scoreboard中對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ī)制對通配符的支持
不推薦使用通配符浪南。
3.5.8 check_config_usage
如果set函數(shù)的第二個(gè)參數(shù)設(shè)置錯(cuò)誤,不會(huì)給出錯(cuò)誤信息漱受。
check_config_usage()函數(shù)可以顯示出截止到此函數(shù)調(diào)用時(shí)有哪些參數(shù)是被設(shè)置過但是卻沒有被獲取過逞泄,此函數(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è)置過的信息對于它們是可見的紧憾。
命令行參數(shù):
? ? ? ? ? ? <sim command> +UVM_CONFIG_DB_TRACE