桂林手機(jī)網(wǎng)站建設(shè)seo推廣經(jīng)驗(yàn)
文章目錄
- 前言
- 一、代碼
- 二、錯(cuò)誤
- 1.地址范圍
- 2. 并行執(zhí)行線程中變量覆蓋的情況
- 3.有關(guān)incr的beat
前言
- 來源路科驗(yàn)證
- 本節(jié)搞定
T3.3
AHB
總線協(xié)議的覆蓋:AHB_PROTOCOL_COVER
即測(cè)試ahb slave
接口和master
接口支持(盡可能)全部的ahb
協(xié)議傳輸場(chǎng)景,主要是支持burst
傳輸 (并行發(fā)送) - 重點(diǎn)在于如何給地址
- 注意該
test
不是測(cè)試映射的完整性的;所以不需要關(guān)心整個(gè)地址是不是更加完備:即不是把所有的地址都測(cè)試完 - 關(guān)心的是協(xié)議的完整性;只需要保證從三個(gè)
master
到三個(gè)slave
的訪問地址之間沒有重合;如果重合會(huì)給接下來的數(shù)據(jù)檢查的帶來問題;如果同一個(gè)地址被兩個(gè)master
的寫所覆蓋的話;時(shí)序上面的延遲會(huì)對(duì)預(yù)測(cè)帶來障礙 - 可以加一些約束,讓波形是自己所期望的;加的約束越少越好,這樣的話協(xié)議上各種時(shí)序出現(xiàn)的可能性更大;前提是設(shè)計(jì)沒問題,要是設(shè)計(jì)有問題的話,約束一開始不可以放的太開,那么就要從
singl-----burst------wrap
一步一步來
一、代碼
- 思路:先搞定其中的一次并行發(fā)送:多個(gè)
master
到多個(gè)slave
,穩(wěn)點(diǎn)后,外部套一個(gè)repeat
,讓其多次發(fā)送 - 具體代碼
--------------------------AHB_PROTOCOL_COVER_seq------------------
virtual task body();super.body();`uvm_info("body", "Entered...", UVM_LOW)cfg.enable_scb = 0;cfg.enable_cov = 0;repeat(loop_count) beginfor(int i=0; i< cfg.mst_num; i++) beginautomatic slv_addr_range_t rng = cfg.addrmap.get_addr_range($random_range(0, cfg.slv_num-1));automatic int mid = i;forkmem_check(mid, rng.addr_start + 'h1000*(mid+cfg.mst_num*$random_range(1, 4)));join_noneendwait fork; //等第一次傳輸完以后,在repeat第二次end`uvm_info("body", "Exiting...", UVM_LOW)
endtask
automatic int mid = i;
mid
是在循環(huán)體內(nèi)部使用automatic
關(guān)鍵字聲明的變量。這種方式會(huì)為每次循環(huán)迭代創(chuàng)建一個(gè)獨(dú)立的mid
變量副本。所以每次循環(huán)迭代中mid
的值都是動(dòng)態(tài)的,不會(huì)相互干擾。loop_count
別忘記在掛載sequence
之前隨機(jī)
seq
中的代碼
loop_count
設(shè)置多少以功能覆蓋率能不能達(dá)到為準(zhǔn)
-
如何保證三個(gè)
master
給同一個(gè)slave
寫的話,地址不重合?
這里給的地址是rng.addr_start + 'h1000*(mid+cfg.mst_num*$random_range(1, 4)
,可以看作是基地址+偏移地址,目前的burst_size=32bit
,地址需要以4
字節(jié)為單位進(jìn)行遞增;只要給master
一個(gè)不一樣的地址,后面加4
都會(huì)不一樣,這樣就保證了地址的不一樣,所以重點(diǎn)在于如何設(shè)置偏移地址 -
將一塊地址按照
h'1000
(32‘h0200_0000---32‘h0200_FFFF
)分的話,共15個(gè)區(qū)間;32‘h0200_0000---32‘h0200_1000
是4KB
,burst
傳輸要求的地址邊界不超過1KB
,所以他會(huì)完美的去匹配,無論落到哪一個(gè)區(qū)間,master
哪怕是incr
他也不會(huì)越界,這樣就保證了地址的不重合 -
mid+cfg.mst_num*$random_range(1, 4)
這塊的取值要保證最大值不可以超過14(E)(2+3*4)=14
-
上面的
4
的值與mst_num
變大和mid都有關(guān)
二、錯(cuò)誤
1.地址范圍
- 出現(xiàn)不應(yīng)該有的地址范圍
- 原因:在隨機(jī)產(chǎn)生數(shù)值時(shí),發(fā)生了錯(cuò)誤,如果隨機(jī)到5,最大是
2+3*5=17>>14
,將一塊地址按照h'1000
(32‘h0200_0000---32‘h0200_FFFF
)分的話,最后一個(gè)值是
E=15`,共15個(gè)區(qū)間;所以將隨機(jī)值區(qū)間最大改為4
mem_check(mid, rng.addr_start + 'h1000*(mid+cfg.mst_num*$random_range(1, 5)));
2. 并行執(zhí)行線程中變量覆蓋的情況
- 這個(gè)錯(cuò)誤意味著在并行執(zhí)行多個(gè)序列時(shí),存在某些序列提前完成的情況,導(dǎo)致其他序列的項(xiàng)目無法正常處理。
- 原因:當(dāng)缺少
automatic int mid = i;
時(shí),i
產(chǎn)生的新的數(shù)會(huì)將原先的覆蓋,導(dǎo)致i
只能是3
,原先的依次被覆蓋掉了;
--------------------------AHB_PROTOCOL_COVER_seq------------------
virtual task body();
super.body();
`uvm_info("body", "Entered...", UVM_LOW)
cfg.enable_scb = 0;
cfg.enable_cov = 0;for(int i=0; i< cfg.mst_num; i++) beginslv_addr_range_t rng = cfg.addrmap.get_addr_range($random_range(0, cfg.slv_num-1));//automatic int mid = i;forkmem_check(mid, rng.addr_start + 'h1000*(mid+cfg.mst_num*$random_range(1, 4)));join_none
end
`uvm_info("body", "Exiting...", UVM_LOW)
endtask
- 解決之道:添加
automatic int mid = i;
,最好將rng
也添加automatic
3.有關(guān)incr的beat
- 這里的錯(cuò)誤提示數(shù)據(jù)對(duì)比出了問題,到底哪兒出了問題,看的不是很清楚,所以在做有關(guān)動(dòng)態(tài)數(shù)組對(duì)比時(shí),先比較動(dòng)態(tài)數(shù)組的
size
,然后在比較里面的內(nèi)容,比較每一個(gè)數(shù)據(jù), - 詳細(xì)顯示的話,會(huì)發(fā)現(xiàn)是兩邊的
size
不一樣
定位會(huì)發(fā)現(xiàn)錯(cuò)誤的前面是incr
傳輸,他的地址只要不跨越1KB
邊界即可,到底傳了多少拍,不大清楚;不像incr4
之類的,他的拍數(shù)是固定的在每一次傳輸?shù)倪^程中
可以通過該參數(shù)記錄,在寫數(shù)據(jù)時(shí)記錄下來,傳遞給讀數(shù)據(jù)時(shí)的約束
如果給的類型是incr
。沒有給data.size
的話會(huì)出問題;incr
不限定;;;也就是說如果給的burst_type
是incr
的話,要限定burst_type
的長(zhǎng)度