systemverilog驗(yàn)證學(xué)習(xí)筆記_第1頁
systemverilog驗(yàn)證學(xué)習(xí)筆記_第2頁
systemverilog驗(yàn)證學(xué)習(xí)筆記_第3頁
systemverilog驗(yàn)證學(xué)習(xí)筆記_第4頁
systemverilog驗(yàn)證學(xué)習(xí)筆記_第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、=阻塞串行<=非阻塞并行1)時序邏輯-使用非阻塞賦值2)鎖存器-使用非阻塞賦值3)用always塊生成的組合邏輯-用阻塞賦值4)在同一個always塊中既有時序邏輯又有組合邏輯- 用非阻塞賦值5)在同一個always塊中不要既用阻塞賦值又用非阻塞賦值6)不要在一個以上的always塊中對同一個變量賦值7)用$strobe顯示用非阻塞賦值指定的變量值8)不要用 0 過程性賦值Modport將信號分組并指明方向函數(shù)不能消耗時間,不能有#100(posedge clk)wait之類的阻塞語句Interface arb_if(input bit clk); Logic 1:0 a,b; Logi

2、c rst;Modport test(output a,rst,Input b,clk);EndinterfaceModule arb(arb_if.test arbif);Endmodule數(shù)組定位Int tq$,d=9,1,8,3,4,4;Tq=d.find_index(x) with (item>3); /0,2,4,5得到的是腳標(biāo)Tq=d.find with (item>3); /9,8,4,4數(shù)組求和Int count,total;Count=d.sum with(item>7); /2:9,8 返回結(jié)果為元素與7比較表達(dá)式返回1為真或者零這里面返回 ,1,0,1,

3、0,0,0求和得2Total=d.sum with (item>7)*item) ; /1,0,1,0,0,0和對應(yīng)元素相乘求和得17=9加8數(shù)組排序d.reverse(); /逆序d.sort(); /從小到大d.rsotr(); /從大到小d.shuffle(); 時鐘塊指定同步信號相對于時鐘的時序Interface arb_if(input bit clk); Logic 1:0 a,b; Logic rst;Clocking cb (posedge clk); Output a; Input b;Modport test(output rst,Clocking cb);Endin

4、terfaceModule arb(arb_if.test arbif);Initial beginArbif.cb.a<=0;arbif.cb;$dispiay(.)Endmodule斷言A1:assert(bus.cb.a=2b01)Else $error(“grant not asserted”);四種有輸出消息的函數(shù)可在斷言內(nèi)部使用$info$waring$error$fatal要驗(yàn)證這樣一個屬性:“當(dāng)信號a在某一個時鐘周期為高電平時,那么在接下來的24個時鐘周期內(nèi),信號b應(yīng)該為高電平”。用Verilog語言描述這樣一個屬性需要一大段代碼,而用SVA描述就只需要幾行代碼。下面的代

5、碼為SVA。 例1: property a2b_p; (posedge sclk) $rose(a) |-> 2:4 $rose(b); endproperty a2b_a: assert property(a2b_p); a2b_c: cover property(a2b_p);并發(fā)斷言并發(fā)斷言的計(jì)算基于時鐘周期,在時鐘邊沿根據(jù)變量的采樣值計(jì)算表達(dá)式。它可以放在過程塊(procedural block)、模塊(module)、接口(interface)或一個程序塊(program)的定義中。并發(fā)斷言可以在靜態(tài)(形式化)驗(yàn)證工具和動態(tài)(仿真)驗(yàn)證工具中使用。上面的例子就是并發(fā)斷

6、言SVA提供了3個內(nèi)嵌函數(shù),用于檢查信號的邊沿變化。 $rose(布爾表達(dá)式或信號名) 當(dāng)信號/表達(dá)式的最低位由0或x變?yōu)?時返回真值。 $fell(布爾表達(dá)式或信號名) 當(dāng)信號/表達(dá)式的最低位由1變?yōu)?或x時返回真值。 $stable(布爾表達(dá)式或信號名) 當(dāng)信號/表達(dá)式的最低位不發(fā)生變化時返回真值。斷言的建立過程“編寫布爾表達(dá)式 > 編寫序列(sequence)> 編寫屬性(property)> 編寫斷言(assert property)和覆蓋語句(cover property)”唯一性和優(yōu)先級決定語句 在Verilog中,如果沒有遵循嚴(yán)格的編碼風(fēng)格,它的if-else和

7、case語句會在RTL仿真和RTL綜合間具有不一致的結(jié)果。如果沒有正確使用full_case和parallel_case綜合指令還會引起一些其它的錯誤。 SystemVerilog能夠顯式地指明什么時候一條決定語句的分支是唯一的,或者什么時候需要計(jì)算優(yōu)先級。我們可以在if或case關(guān)鍵字之前使用unique或requires關(guān)鍵字。這些關(guān)鍵字可以向仿真器、綜合編譯器、以及其它工具指示我們期望的硬件類型。工具使用這些信息來檢查if或case語句是否正確建模了期望的邏輯。例如,如果使用unique限定了一個決定語句,那么在不希望的case值出現(xiàn)的時候仿真器就能夠發(fā)布一個警告信息bit 2:0 a;

8、 unique if (a=0) | (a=1) y = in1; else if (a=2) y = in2; else if (a=4) y = in3; / 值3、5、6、7會引起一個警告 priority if (a2:1=0) y = in1; / a是0或1 else if (a2=0) y = in2; / a是2或3 else y = in3; / 如果a為其他的值unique case (a) 0, 1: y = in1; 2: y = in2; 4: y = in3; endcase / 值3、5、6、7會引起一個警告類Class trans;Endclasstrans a

9、;聲明一個句柄(指針)a=new();/為一個trans對象分配空間用戶定義的new()函數(shù)Class trans;Logic 31:0 addr,crc,data8;Function new;Addr=3;Foreach (datai) Datai=5;EndfunctionEndclass隨機(jī)化Class packetRand bit 31:0 a,b,c8;Randc bit7:0 k;Constraint da>10;a<15;endclasspacket p;initial beginp=new();assert (p.randomize();transmit(p);en

10、d指示通過引用傳遞的參數(shù),參數(shù)聲明需要以ref關(guān)鍵字開始線程always_comb過程來建模組合邏輯行為 在0時刻結(jié)束時自動觸發(fā)一次always_latch過程來建模鎖存邏輯行為 always_ff過程可以用來建??删C合的時序邏輯行為它僅能包含一個事件控制過程并且沒有阻塞定時控制always_comb過程提供了不同于正常always過程的功能:· 具有一個推斷的敏感列表 · 賦值語句左側(cè)的變量不應(yīng)該被任何其它進(jìn)程寫入。 · 在所有的initial和always塊被啟動以后,過程在時間0處被自動地觸發(fā)一次,因此過程的輸出與輸入一致。 SystemVerilog的al

11、ways_comb過程在下述幾個方面上不同于Verilog-2001的always *:· always_comb在時間0處自動執(zhí)行,而always *直到推斷的敏感列表中的一個信號發(fā)生變化的時候才會執(zhí)行。 · always_comb敏感于一個函數(shù)內(nèi)容內(nèi)部的改變,而always *僅敏感于一個函數(shù)自變量的改變。 · 在always_comb內(nèi)部賦值左側(cè)的變量(包括來自被調(diào)用函數(shù)內(nèi)容中的變量)不應(yīng)該被其它進(jìn)程寫入,而always *則允許多個進(jìn)程寫入相同的變量。 · always_comb中的語句不應(yīng)該包含阻塞語句、具有阻塞定時或事件控制的語句,或者for

12、k.join語句。 如果always_comb過程內(nèi)的行為沒有代表組合邏輯,例如推斷出了鎖存器,軟件工具執(zhí)行額外的檢查來發(fā)布警告信息。Forkjoin所有并行語句執(zhí)行完畢才執(zhí)行后續(xù)Fork.join_none 執(zhí)行塊兒內(nèi)語句的同時父線程后面的程序繼續(xù)進(jìn)行Fork.join_any當(dāng)塊內(nèi)第一個語句完成后,父線程才繼續(xù)執(zhí)行。停止單個線程Parameter timeout=1000;Task check(trans tr); Fork beginFork: check_stop Begin Wait(tbus.cb.addr=tr.addr); $display(“.”); End#timeout

13、$display(“.”);Join_anyDisable check_stop;EndJoin_noneEndtask事件信箱擴(kuò)展的類Class badtr extands transaction;Rand bit bad_crc;Virtual function void calc_crc; Super.calc_crc();/super調(diào)用基類里面的函數(shù) .EndfunctionEndclass:badtr回調(diào)測試程序在不修改原始累得情況下注入新代碼可以用來注入錯誤放棄事務(wù)延遲事務(wù)將事務(wù)放入記分板收集功能覆蓋率等等記分板保存期望事務(wù),找出測試平臺接收到的實(shí)際事務(wù)相匹配的期望事務(wù)。Clas

14、s scorebroad; Transaction scb$;Function void save_expect(transaction tr); Scb.push_back(tr);EndfunctionFunction void compare_actual(transation tr); Int b$;B=scb.find_index(x) with (x.src=tr.src);Case(b.size()0:$display(“no match find”);1:scb.delete(q0);Default: $display(“error,multiple matches found

15、”);EndcaseEndfunction: compare_actualEndclass功能覆蓋率Program automatic test(busifc.TB.ifc);Class transaction;Rand bit31:0data;Rand bit2:0port;EndclassCovergroup covport; Coverpoint tr.port;EndgroupInitial beginTransaction tr;Covport ck; Tr=new(); Ck=new();Repeat(32)begin Assert(tr.randomize); Ifc.cb.po

16、rt<=tr.port; Ck.sample(); /收集覆蓋率,觸發(fā)覆蓋組ifc.cb;EndEndEndprogramAuto_bin_max指明了自動創(chuàng)建倉的最大值Covergroup CovPort; Option. Auto_bin_max=2; Coverpoint tr.port;Endgroup分成兩個倉bit2:0portauto0:3auto4:7兩個倉倉Covergroup Covport; Kind: Coverpoint tr.kind; bins zero=0; Bins lo=1:3,5; /1:3和5是一個倉 Bins hi=8:$; /8到最大值15,8

17、個獨(dú)立的倉,hi_0,hi_1. Bins misc=deflaut; /一個倉代表剩余的值 Bins t1=(1,2=>3,4); /翻轉(zhuǎn)覆蓋率,表示自重翻轉(zhuǎn)過程 Ignore_bins h2=6,7; /被忽略的倉 Illegal_bins h3=6,7; /非法的倉,出現(xiàn)會報(bào)錯Port:coverpoint tr.port;Cross kind,port; /交叉覆蓋率Endgroup測試發(fā)生器代理驅(qū)動器計(jì)分板檢測器斷言監(jiān)視器待測設(shè)計(jì)功能覆蓋率 發(fā)生器Class generationUNI_cell blueprint;/定義的需要測試的對象的藍(lán)圖,可以通過修改起約束或者擴(kuò)展替換他

18、mailbox gen2drv; /信箱event drv2gen; /drive 完成時的事件int ncells;Function new(Input mailbox gen2drv, Input event drv2gen, .) This.gen2drv=gen2drv; This.drv2gen=drv2gen;This.ncell=ncell;.Blueprint=new();Endfunction:newTask run(); UNI_cell cell;Repeat(ncells)beginAssert(blueprint.randomize();$cast(cell,blue

19、print.copy(); /基類句柄指向拓展對象Gen2drv.put(cell); /事務(wù)放進(jìn)信箱發(fā)送給驅(qū)動器drv2gen;end Endtask:runEndclass:generation驅(qū)動類Typedef class Drive_cbs;Class driveMailbox gen2drv;Event drv2gen;vUtopiaRx Rx; /發(fā)送的數(shù)據(jù)的接口Drive_cbs cbs$; /回調(diào)隊(duì)列Int portid;Extern function new(Input Mailbox gen2drv,InputEvent drv2gen, Input vUtopiaRx

20、Rx, Input Int portid;)Extern task run();Extern task send();Endclass:driveTask drive:run() UNI_cell cell; Bit drop=0; Rx.cbr.data<=0;. /初始化端口Forever beginGen2drv.peek(); /從信箱中讀取一個數(shù)據(jù)/發(fā)送前回調(diào)begin:tx Foreach(cbsi);Cbsi.pre_tx(this,cell,drop);If (drop) disable tx; /不發(fā)送這個數(shù)據(jù)EndSend(cell);/發(fā)送后的回調(diào)Foreach(c

21、bsi);Cbsi.post_tx(this,cell,drop);End:txGen2drv.get(cell); /刪除數(shù)據(jù)->drv2gen;Endtask:runTask drive:send(input UNI_cell cell) . Rx.cbr.data<=cell.data /數(shù)據(jù)發(fā)送給接口時鐘塊 rx.cbr.EndtaskFactory機(jī)制uvm_componet_utils(my_driver);Run_test(“my_driver”);Factory集中在一個宏uvm_componet_utils中這個宏將類my_driver登記在uvm內(nèi)部一張表中,在定義一個新的類時使用這個宏,就相當(dāng)于把這個類注冊到了這張表中。Run_test語句會創(chuàng)建一個my_driver實(shí)例,然后自動調(diào)用其中的main_phase.uvm_object_utils(my_transaction);My_transaction有生命周期,用uvm_object_utils實(shí)現(xiàn)factory機(jī)制。而整個仿真中一直存在的用uvm_componet_utils注冊只

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論