隨着IC設計復雜度的提高,模塊間互聯變得復雜,SV引入接口,代表一捆連線的結構。
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則明確了站在不同的角度對應信號的輸入輸出方向。通過虛擬接口的定義將以上內容封裝起來。
接口interface與module,program一樣,都是層次化結構,主要用來完成設計module和驗證program之間的連接。interface中有兩個重要的功能塊clocking block和modport。
clocking block,用來對同步信號進行采樣和驅動,可以避免設計和驗證的競爭。clocking block需要指定一個時間,通常是posedge或negedge,同時還可以為塊中信號設置建立保持時間,在默認建立保持時間均為1ns。
如下面的例子所示:
...
clocking msclk_cb @(posedge clk); //clocking block塊定義
default intput #setup output #holdtime; //輸入建立時間,輸出保持時間設定
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