第三章 UVM基礎(chǔ)

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)。



UVM中常用類的繼承關(guā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樹

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末到千,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子赴穗,更是在濱河造成了極大的恐慌憔四,老刑警劉巖膀息,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異了赵,居然都是意外死亡潜支,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門柿汛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冗酿,“玉大人,你說我怎么就攤上這事络断〔锰妫” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵貌笨,是天一觀的道長弱判。 經(jīng)常有香客問我,道長锥惋,這世上最難降的妖魔是什么昌腰? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮膀跌,結(jié)果婚禮上遭商,老公的妹妹穿的比我還像新娘。我一直安慰自己淹父,他們只是感情好株婴,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著暑认,像睡著了一般困介。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蘸际,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天座哩,我揣著相機(jī)與錄音,去河邊找鬼粮彤。 笑死根穷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的导坟。 我是一名探鬼主播屿良,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惫周!你這毒婦竟也來了尘惧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤递递,失蹤者是張志新(化名)和其女友劉穎喷橙,沒想到半個(gè)月后啥么,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贰逾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年悬荣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疙剑。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡氯迂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出核芽,到底是詐尸還是另有隱情囚戚,我是刑警寧澤酵熙,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布轧简,位于F島的核電站,受9級特大地震影響匾二,放射性物質(zhì)發(fā)生泄漏哮独。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一察藐、第九天 我趴在偏房一處隱蔽的房頂上張望皮璧。 院中可真熱鬧,春花似錦分飞、人聲如沸悴务。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讯檐。三九已至,卻和暖如春染服,著一層夾襖步出監(jiān)牢的瞬間别洪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工柳刮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挖垛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓秉颗,卻偏偏與公主長得像痢毒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子蚕甥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容