本節主要內容:testbench與design的連接,verilog連接testbench與design的方法,SV的interface,stimulus timing,clocking blocks,timing region,program block。(感覺很抽象)
一:design與testbench的連接
1:連接符號
.*
.name(wire_name) :verilog中使用方法
interface
2:verilog連接方式
3:sv連接方式
(1).* 通配符,對相同名字自動匹配
要求:有相同的名字,位寬相同
例如:
(2).name
相同名字與相同位寬,可以直接使用.name;括號內可省略
(3)interface
當名字不同時,上述方法不方便;而且若使用verilog方法,每個端口都要寫,在復雜設計中很冗余;在sv里我們引入interface的概念
二:interface
1:定義
新的端口類型,將多種信號group一起,信息封裝,重用。聲明一次即可
2:使用
在interface里面聲明信號,clk是外部輸入的信號,內部信號為logic信號,為異步信號;
在top層內例化,如上圖,現例化arbif這個interface,在使用該interface;
arbif.clk可訪問里面的clk的信號;
3:interface可用於設計
4:interface-modport
提供了另外一種interface信號,是modport的簡寫;一個interface里面可有多種modport的定義
例如:modport TEST (output request,reset,
input grant,clk );
設計中使用modport:module arb(arb_if.DUV arbif);
5:總結
可以包含function;不僅僅是線的集合;在系統集成上較方便;可加上協議檢查;
不包含hierarchy結構(不能再interface里面聲明一個module)
三:stimulus Timing & Clocking Blocks
在design與testbench之間易產生競爭冒險的情況,例如不滿足Tsetup的要求;可以通過提前驅動信號,滯后采樣信號(同步)來避免。
1:在interface里面建模,在適當時間驅動,采樣信號;驅動信號不能太晚,采樣信號不能太早;
testbench與design要分離開;
一般驅動在時鍾沿前,采樣在時鍾沿后;
2:Clocking Block模塊
為避免競爭冒險,interface里面使用clocking block模塊;
**cb(clocking block簡稱以下)模塊里的任何信號的驅動與采樣都使用了同步的思想;
**cb模塊只能用於驗證,不能用於設計
**一個interface里面可包含多個cb模塊
3:實現機理
使用cb,默認有 default input #1step output #0;(skew)
4:skew
input skew在時鍾沿前有延時,output skew在時鍾沿后有延遲
5:cb模塊的使用(偽代碼)
interface arb_if(input bit clk)
clocking cb @(posedge clk)
output request;
input grant;
endclocking //cb里面的信號都是同步信號
modport TEST(clocking cb,output reset) //表示使用cb里面的同步信號
endinterface
//使用cb信號
arb_if arbif;//聲明一個interface
arbit.cb.request <= 2'b01; //驅動一個信號使用非阻塞賦值;采樣一個信號用阻塞賦值
6:同步到信號
@arbif.cb.grant; @(posedge arbif.cb.grant); ##2 arbif.cb.request <= 0(等待2個時鍾周期);
7:驅動信號非阻塞,采樣信號阻塞
四:Timing Region
1:包含
active region:design區,design區可分為四個區(RTL的四個Time Region)
observed region:assertion區
reactive region:testbench區
postpone:sample區,采樣所有設計的信號
2:interface采樣區是在postpone,在時鍾沿后采樣時鍾前的數據
波形如下圖:
3:interface驅動,在時鍾沿前驅動,時鍾沿后得到信號的值
輸出波形,這也就是非阻塞賦值的原因
五:program block
將OOP與DUT通過interface連接起來;在program里面可以跑設計。
1:類似於module,可包含代碼,變量等;
沒有hierarchy結構
2:例子
3:總結
不能有module hierarchy,可以有class hierarchy;
代碼在initial塊中執行,不能在always塊;
在reactive區執行
六:一個完整的testbench模板
頂層設計:
子模塊:
說明:
top層在active區執行,program在reactive區執行,這樣可以避免race。