轉載請標明出處
第一章 接口(interface)
1.1. 接口的概念
接口允許許多信號合成一組由一個端口表示。
1.2. 接口聲明
//接口定義
Interface main_bus (input logicsig_a, sig_b); //sig_a , sig_b是接口的輸入
Wire sig_c ;
Logic sig_d;
…
Endinterface
//頂層網表
module top (input logic clock, resetN, test_mode);
logic [15:0] program_address, jump_address;
logic [ 7:0] instruction, next_instruction;
main_bus bus ( //接口實例化
.sig_a (sig_a), //分立信號連接到接口實例
. sig_b (sig_b)
);
processor proc1 ( //模塊實例化
.bus(bus), //接口連接,
.jump_address(jump_address)); //其他接口
也可以用.name 和.* 連接
當接口定義在$unit中時,全局定義;當接口聲明在模塊內部時,局部定義
1.3. 將接口用作模塊端口(可綜合)
l 顯示命名的接口端口 module <module_name> (<interface_name> <port_name>);
l 通用接口端口 module <module_name> (interface <port_name>);
顯示命名的接口端口只可以連接到同一名稱的接口上;而任何接口可以連在通用接口端口上
1.4. 接口的實例化和連接
接口實例化的語法與模塊實例化相同;接口類型的端口如果沒有連接是非法的
接口端口可連接到另一個接口
1.5. 接口內部信號的引用
接口內部信號可以通過端口名引用:<port_name>.<internal_interface_signal_name>
1.6. 接口的modport
Module port——modport可以定義接口信號的不同接入方式(方向)
Modport定義中不包含向量位數和類型,這些信息是在接口的信號類型聲明中定義的。
Modport聲明位置:interface定義內
Modport聲明只定義 連接模塊將信號是看成input/output/inout還是ref
1.6.1. 指定使用哪種modport方式(可綜合)
l 在模塊實例的接口連接中說明 <接口實例名>.<modport_name>
//module中已實例化接口,模塊定義時端口聲明用接口名稱
l 在模塊定義的端口聲明時說明 <接口名稱>.<modport_name>
// module中已實例化接口,模塊實例化時端口連接用接口實例名
l 沒有指定modport時接口的連接:
因為本身interface的聲明是沒有內部信號的方向的,又沒有modport指明信號方向,因此此時內部信號中——線網信號默認為inout;變量默認為ref
1.6.2. 使用modport定義不同的連接
在接口中定義不同的modport,模塊訪問某個特定modport時其他接口中的信號不可見
1.7. 在接口中使用任務和函數(method)
接口可以包含功能描述,比如通信協議等。
SV可以在接口中聲明任務和函數,
這些任務和函數可以作為接口方法(Interface methods)來引用
- 接口方法的導入:(當從另一模塊到導入任務或函數時使用方法B)(可綜合)
u 使用函數和任務的名稱導入modport in ( import <任務或函數的名稱> );
u 使用函數和任務的完整原型導入(形參包含方向)
n modport modport_name(import task <任務名>(<任務的形式參數) );
n modport modport_name(import function <函數名> (<函數的形式參數>) );
u 導入的接口方法的調用:<接口的端口名>.<方法名>
- 導出任務和函數(不可綜合)
Modport modport_name(export <任務或函數的名稱>);
或通過在接口中聲明函數或任務時使用關鍵詞extern可以將他們導出到整個接口
Extern forkjoin允許導出任務的多重實例
1.8. 接口中的過程塊
接口可以包含always, always_comb, always_ff, always_latch, initial/final過程塊, assign 語句.
接口中的過程塊一般用於驗證
1.9. 可重構接口
接口可以使用參數重定義和generate語句,在接口實例化時進行重構