隨着IC設計複雜度的提升,模塊間互聯變得複雜,SV引入接口,表明一捆連線的結構。html
Systemverilog語法標準,新引入一個重要的數據類型:interface。異步
interface主要做用有兩個:一是簡化模塊之間的鏈接;二是實現類和模塊之間的通訊;函數
接口(interface)爲硬件模塊的端口提供了一個標準化的封裝方式。
用interface來封裝接口的信號和功能。
interface的定義是獨立於模塊的,經過關鍵字interface和endinterface關鍵詞來定義。
注意:
interface裏面能夠帶時鐘、斷言、任務(task)、函數(function)等定義。
一個interface 也能夠有input,output或是inout端口。
當interface例化時,只有當變量或是線網聲明在一個interface的端口列表中才能經過名字或是位置來互連。
interface是可綜合的。
一種新加的和interface有關係的構造體是Modport 。
它提供了module的interface端口和在特定的module中控制task和function使用的方向性信息。這些端口的方向能夠在module中能夠看到。
接口使用無信號的鏈接方式。
Modport將接口中信號分組並指定方向。就像下圖中的黑色矩形塊裏面同樣,黑盒,咱們從外面看並不關心Modport的定義,只須要考慮clk。
interface membus(input logic clk, output wor status);
logic mrdy;
logic wen;
logic ren;
logic [7:0] addr;
logic [7:0] c2m_data;
logic [7:0] m2c_data;
task reply_read(input logic [7:0] data, integer delay);
#delay;
@(negedge clk)
mrdy=1'b0;
m2c_data=data;
@(negedge clk)
mrdy=1'b1;
endtask
//Task和function能夠定義在interface中,從而容許構造更抽象級的模型
task read_memory(input logic [7:0] raddr, output logic [7:0] data);
@(posedge clk);
ren=1'b0;
addr=raddr;
@(negedge mrdy);
@(posedge clk);
data=m2c_data;
ren=1'b1;
endtask
modport master(output wen, ren, addr, c2m_data, input mrdy, m2c_data, status, read_memory);
modport slave(input wen, ren, addr, c2m_data, output mrdy, m2c_data, status, reply_read);
//控制task和function使用的方向性信息,以便在下面的module中使用
endinterface
總的來講,interface指明瞭TB和DUT之間的鏈接信號,clocking規定了信號之間的時序關係,而modport則明確了站在不一樣的角度對應信號的輸入輸出方向。經過虛擬接口的定義將以上內容封裝起來。url
接口interface與module,program同樣,都是層次化結構,主要用來完成設計module和驗證program之間的鏈接。interface中有兩個重要的功能塊clocking block和modport。spa
clocking block,用來對同步信號進行採樣和驅動,能夠避免設計和驗證的競爭。clocking block須要指定一個時間,一般是posedge或negedge,同時還能夠爲塊中信號設置創建保持時間,在默認創建保持時間均爲1ns。設計
以下面的例子所示:htm
...blog
clocking msclk_cb @(posedge clk); //clocking block塊定義接口
default intput #setup output #holdtime; //輸入創建時間,輸出保持時間設定get
intput xxxxx;
output xxxx;
...
endclocking
...
modport block,對於同一個接口,不一樣的事物處理器可能會有不一樣的視角,好比對driver而言是輸出的信號,在driver_monitor看來則是輸入信號,因此能夠引入modport來聲明端口模塊。
默認狀況下interface的全部信號都是異步的
能夠經過clocking block定義一組信號與時鐘同步
modport定義與test的鏈接。
關於interface的實例化:
1,在moule中,能夠直接實例化,
即my_if input_if;
2,在class中,須要使用virtual interface來實例化。
即 class my_driver extends uvm_driver
virtual my_if vif;
XXXXX;
endclass