1.為什么在TOP里面uvm_config_db set的時(shí)候都需要用到uvm_test_top罐呼,它針對(duì)不同的case產(chǎn)生的實(shí)例名字是一樣的嗎鞠柄?
是一樣的。對(duì)于+UVM_TESTNAME=example_case_(0…n)嫉柴,UVM驗(yàn)證平臺(tái)會(huì)創(chuàng)建一個(gè)example_case_(0…n)的實(shí)例厌杜,他們的實(shí)例有一個(gè)共同的名字:uvm_test_top,所以你在top中congig_db的時(shí)候都會(huì)自上而下指定UVM component的路徑计螺,UVM樹的最高就是uvm_test_top
2.怎么可以更好的理解uvm_object,uvm_component,sequence,sequence_item以及config夯尽?
我覺(jué)得zhangqiang寫得《UVM1.1應(yīng)用指南及源代碼分析》一書中比喻的很通俗,原文如下:
uvm_object是一分子登馒,用這個(gè)分子可以搭建成許許多多的東西匙握,如既可以搭建成動(dòng)物,還可以搭建成植物陈轿,更加可以搭建成沒(méi)有生命意識(shí)的巖石圈纺,空氣等秦忿。uvm_component就是由uvm_object搭建成的一種高級(jí)有生命體或者無(wú)生命體,而sequence_item則是由其搭建成的血液或者其他蛾娶,它流通在各個(gè)(uvm_component)之間灯谣,sequence則是眾多sequence_item的組合,config則是由其搭建的用于規(guī)范生命體或者無(wú)生命體(uvm_component)行為方式的準(zhǔn)則蛔琅。
3.new和create一個(gè)類的實(shí)例時(shí)有什么區(qū)別么胎许?
當(dāng)你使用了uvm_component_utils注冊(cè)了之后就可以使用類似于A=example::type_id::create(“a”,this)的形式,create其實(shí)是factory重載了new函數(shù)罗售,是factory方式實(shí)例化;如果你沒(méi)有使用uvm_component_utils去注冊(cè)辜窑,則只能使用systemverilog的new函數(shù)去實(shí)例化了,但是使用create產(chǎn)生的實(shí)例可以使用uvm的很多功能寨躁,比如overide功能(set_type_override_by_type(a1::get_type(),a2::get_type()))谬擦。使用上的區(qū)別可以這樣簡(jiǎn)單理解,但是朽缎,如果覺(jué)得還想深入了解請(qǐng)閱讀uvm factory源碼。
4.UVM常用的phase有哪些?
uvm常用的phase谜悟,其實(shí)我經(jīng)常用到的就是build_phase例化话肖,connect_phase連接,run_phase(main_phase)以及report_phase葡幸,如果你要使用report_phase最筒,那么建議你最好把要report的變量定義為全局類型的。
5.uvm不同components的同一phase的執(zhí)行順序是怎樣的蔚叨?
???uvm中對(duì)于build_phase是自父類到子類的自上而下的方式去執(zhí)行的床蜘,否則你都沒(méi)有執(zhí)行agent的build_phase就去執(zhí)行driver或者monitor的build_phase那會(huì)報(bào)錯(cuò)的,因?yàn)樗麄兌歼€沒(méi)有在agent的build_phase中實(shí)例化蔑水。除了build_phase邢锯,其他的function phase(注意這個(gè)地方)都是自下而上的方式,比如connect_phase搀别,都是先執(zhí)行driver或者monitor的connect_phase再執(zhí)行agent的connect_phase丹擎,以此類推。如果是同一層次的driver和monitor是按照實(shí)例化之后的名字的字典順序執(zhí)行的歇父,比如driver實(shí)例化為“A”蒂培,monitor實(shí)例化為“B”,那么就先執(zhí)行driver的phase榜苫。對(duì)于需要消耗仿真時(shí)間的task phase則是自下而上的啟動(dòng)护戳,同時(shí)在運(yùn)行,不存在“等”的情況存在垂睬。
6.如果一個(gè)component中需要get的變量個(gè)數(shù)比較多時(shí)媳荒,怎么可以減少這種uvm_config_db #(type)::get()的工作量呢抗悍?
可以你只要在你的component中使用field_automation把需要get的變量都要注冊(cè)了factory機(jī)制,在當(dāng)前component的build_phase()中調(diào)用super.build_phase()就可以了肺樟,但是set()中中的第三個(gè)和第四個(gè)變量名需要一致檐春。
比如
class my_driver extends uvm_driver;
??int num_0;
??int num_1;
??`uvm_component_utils_begin(my_driver)
?????`uvm_field_int(num_0,UVM_ALL_ON)
?????`uvm_field_int(num_1,UVM_ALL_ON)
??`uvm_component_utils_end
??function void build_phase(uvm_phase phase)
Super.build_phase(phase)
(此處就不需要一一get()了啊)
endfunction
endclass
7.寄存器訪問(wèn)為什么要有BACKDOOR的存在呢么伯?
因?yàn)橛袝r(shí)候用frontdoor是沒(méi)有辦法改變某些寄存器的值的疟暖。如在DUT中有一個(gè)寫清的計(jì)數(shù)器,當(dāng)DUT內(nèi)部發(fā)生改變時(shí)田柔,這寄存器的值會(huì)一直增加俐巴。對(duì)于用戶來(lái)說(shuō),可以對(duì)此寄存器做兩種操作硬爆,一是通過(guò)總線frontdoor來(lái)讀取這個(gè)寄存器的值欣舵,二是通過(guò)寫操作把這個(gè)寄存器清零,假設(shè)現(xiàn)在要測(cè)試一下這個(gè)寄存器的進(jìn)位功能缀磕,也即要寫入16’hFFFF等值缘圈,此時(shí)只有通過(guò)backdoor的方式來(lái)進(jìn)行。另外袜蚕,backdoor相對(duì)frontdoor來(lái)說(shuō)糟把,是不消耗仿真時(shí)間的(即backdoor前后$time的返回值不會(huì)改變),backdoor的速度比f(wàn)rontdoor也快的多牲剃。
8.寄存器模型是怎么去操作的frontdoor的遣疯?
說(shuō)白了,其實(shí)是通過(guò)default_map去進(jìn)行frontdoor操作的
9.常用操作對(duì)register model的鏡像值和期望值的影響有哪些凿傅?
? read&write:使用BACKDOOR或FRONTDOOR的方式從DUT中讀取或者寫入指定寄存器的值缠犀,當(dāng)操作完成后,會(huì)根據(jù)讀寫的結(jié)果更新register model中的渴望值和鏡像值(二者相等)聪舒。
peek&poke:peek幾乎等同于使用BACKDOOR方式的read,poke幾乎等同于BACKDOOR方式的write辨液,與read和write的區(qū)別是peek和poke不會(huì)模仿寄存器的行為。如對(duì)于一個(gè)讀清的寄存器來(lái)說(shuō)箱残,進(jìn)行read操作室梅,那么無(wú)論BACKDOOR還是FRONTDOOR,那么DUT中寄存器的值依然保持不變疚宇。peek和poke操作之后亡鼠,register model中的渴望值和鏡像值都會(huì)更新(二者一致)。
get&set:這兩個(gè)操作都是只針對(duì)渴望值的敷待。只有渴望值會(huì)改變间涵,鏡像值不會(huì)改變。
? randomize:randomize之后榜揖,渴望值將會(huì)隨機(jī)出來(lái)的數(shù)值勾哩,鏡像值不會(huì)改變抗蠢。
? update:這個(gè)操作會(huì)檢查寄存器的渴望值和鏡像值是否一致,如果不一致就會(huì)把渴望值寫入到DUT中思劳,并且更新新鏡像值迅矛,使其與渴望值一致。每個(gè)由uvm_reg派生出來(lái)的類都會(huì)有update操作潜叛。另外秽褒,每個(gè)由uvm_reg_block派生出來(lái)的類也有update操作,它將會(huì)調(diào)用加入到此block中的所有寄存器的update威兜。
mirror:它將會(huì)讀取DUT销斟,并且更新鏡像值和渴望值。讀取的方式可以選擇BACKDOOR或者FRONTDOOR椒舵。與update類似蚂踊,每個(gè)uvm_reg派生來(lái)的類都有mirror操作,每個(gè)由uvm_reg_blcok派生出來(lái)的類也有mirror操作笔宿。mirror操作可以指定是否報(bào)告DUT中寄存器的值與register model中鏡像值不一樣犁钟。如果選擇了這一項(xiàng),那么就可以檢查某些計(jì)數(shù)器的值是否DUT中相應(yīng)計(jì)數(shù)器的值一致泼橘。
predict:它將會(huì)把register model中的鏡像值和渴望值都更新為要設(shè)置的值涝动。它與set的區(qū)別是后者只更新渴望值而不更新鏡像值。這個(gè)操作非常有用侥加。假如DUT中有一個(gè)寄存器用于統(tǒng)計(jì)包的數(shù)量,當(dāng)收到一個(gè)包時(shí)粪躬,DUT中寄存器的數(shù)值加1担败,而驗(yàn)證平臺(tái)中要想同步的更新register model中相關(guān)寄存器的值就要用到predict操作。
10.如果我們的環(huán)境不在Makefile腳本里面設(shè)置打印級(jí)別镰官,那么默認(rèn)的打印severity是什么?
如果我們的環(huán)境中不設(shè)置打印級(jí)別提前,那么將會(huì)直接返回m_max_verbosity_level,它是int整型變量,系統(tǒng)在初始化的時(shí)候設(shè)置為UVM_MEDIUM泳唠。