1、interface:
interface 中的信號必須聲明為logic,因為reg只允許在always塊中賦值,wire至允許assign賦值,bit是兩態,logic是四態的,且可以阻塞賦值也可以非阻塞賦值。
1、clocking block
clocking規定了信號之間的時序關系。
// To wait for posedge of clock @busIf.cb_clk; // To use clocking block signals busIf.cb_clk.enable = 1;
2、modport
modport明確了站在不同的角度對應信號的輸入輸出方向。
3. parametered interface
interface myBus #(parameter D_WIDTH=31) (input clk); logic [D_WIDTH-1:0] data; logic enable; endinterface
2、interface中定義task和function
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
接口可以直接調用task,來完成信號的賦值。
3、interface中定義always塊
8bit到10bit的轉換有專門的算法encode_8b10b完成。通常來說,可以在driver中完成這種轉換,並將串行的數據驅動到接口上:
==================================================================================================
由於8b10b轉換的動作適用於任意要驅動的數據,換言之,這是一個“always”的動作,因此可以在interface中使用always語句:
相應的,數據在driver中可以只驅動到interface的並行接口上即可:
==================================================================================================
4、interface中定義initial 塊
interface clk_rst_if(); logic clk; logic rstn; initial begin clk <= 0; forever begin #5ns clk <= !clk; end end initial begin #20ns ; rstn <= 1; #40ns ; rstn <= 0; #20ns ; rstn <= 1; end endinterface
5、使用interface替代driver部分功能
上面的uvm實戰中的代碼用interface代替driver部分功能的舉例說明
第一個好處是可以讓driver從底層繁雜的數據處理中解脫出來,更加專注於處理高層數據。
第二個好處是有更多的數據出現在interface中,這會對調試起到很大的幫助。 interface可以查看信號的波形,但是uvm component中很難查看信號波形。