概述
SystemVerilog Interface是modport的一種,但比簡單的輸入、輸出或輸入輸出端口的功能更多。在其最簡單的形式中,Interface端口將相關的信號捆綁在一起作為一個單一的復合端口。例如,構成AMBA AXI總線的所有單個信號都可以被歸納為一個Interface端口。
一個Interface可以做的不僅僅是封裝總線信號。SystemVerilog Interface為設計者提供了一種集中總線功能的方法,而不是將功能分散在設計中的幾個模塊中。這就模擬了設計工程師在RTL層面的工作,并讓綜合工作在整個設計中適當地分配門級總線硬件。
當遵循特定的建模準則和限制時,Interface是可以綜合的。Interface也可以用在不可綜合級別的建模,并作為驗證測試平臺的一部分。先進的驗證方法,如UVM 、OVM和VMM,都使用Interface。
使用Interface作為modport
interface:定義interface模塊以關鍵字interface和endinterface結尾,內部通過定義輸入輸出信號和對應的logic信號,注意,雙態信號不可以定義為logic。定義好了interface后,需要在top層將interface進行例化。
modport:使用modport來對上述信號接口進行一個分組和方向指定,這樣會使得接口更加條理清晰。在頂層top中例化test時參數還是接口(模塊內部是modport)
一個模塊的端口可以被聲明為一個Interface類型,而不是傳統的輸入、輸出或inout端口。一個模塊可以有任意數量的interface,interface可以與其他端口以任意順序連接。本書中的例子將Interface端口列在前面,只是為了強調Interface端口的作用。
有兩種風格的Interface端口聲明--通用和特定類型。這兩種風格都是可以綜合的。
通用Interface端口
一個通用的Interface端口通過使用關鍵字interface來定義端口的類型。而不是使用一個特定的Interface類型的名稱。語法是:
module(Interface )
當module被實例化時,任何類型的Interface都可以被連接到通用Interface端口。這就提供了靈活性,同一個模塊可以用多種方式使用,不同的Interface連接到模塊上。在下面的例子中,模塊bridge被定義為有兩個通用Interface端口。每個通用Interface端口可以有一個ahb_bus Interface實例或一個Interface端口。
特定類型的Interface端口
一個modport可以被明確地聲明為一個特定類型的Interface。一個特定類型的接口端口是通過使用一個Interface的名稱作為端口類型來聲明的。語法是:
module( )。
比如說:
一個特定類型的Interface端口只能連接到同一類型的Interface實例上。在上面的例子中,高層網表可以實例化CACHE模塊并連接一個ahb_bus Interface的實例,但不能連接一個usb_bus Interface的實例。如果錯誤的Interface實例類型被連接到特定類型的Interface端口,仿真器或綜合工具將發出一個闡述錯誤。特定類型的Interface端口確保錯誤的Interface不會被無意中連接到端口上。明確命名可以連接到端口的Interface類型,也使端口類型對其他需要審查或維護模塊的人更加明顯。有了特定類型的Interface端口,就更容易看清端口的確切使用方式。
最佳實踐指南10-2 |
---|
為RTL模型使用特定類型的Interface端口。不要在設計模塊中使用通用的interface。 |
一個模塊的功能需要引用Interface內的信號。對于特定類型的Interface,Interface內的信號名稱在編寫模塊的時候就已經知道了,可以毫無顧慮地引用。對于通用Interface端口,不能保證連接到模塊Interface端口的每個Interface實例都有相同的信號名稱。
Interface modports
Interface為簡化模塊間的連接提供了一種實用而直接的方法。然而,連接到一個Interface的每個模塊可能需要看到Interface內信號的獨特視圖。例如,在AHB總線上,hwdata信號是主模塊的輸出,而同樣的hwdata是同一總線上從屬模塊的輸入。
SystemVerilog Interface提供了一種方法來定義Interface信號的不同視圖,這樣每個模塊都能看到具有正確端口方向的Interface端口。這個定義是在Interface中使用modport關鍵字進行的。Modport描述了Interface所代表的modport。一個Interface可以有任意數量的modport定義,每個定義都描述了一個或多個其他模塊如何看待Interface內的信號。
一個modport定義了模塊在Interface中看到的信號的端口方向。modport的定義并不重復已經在Interface信號聲明中定義的向量大小和類型信息。一個modport只定義連接模塊是否將一個信號視為輸入、輸出、inout端口。
下面的界面中顯示了兩個modport聲明的例子。
指定使用哪種modport
SystemVerilog提供了兩種方法來指定一個模塊Interface端口應該使用哪種modport。
作為模塊定義中Interface端口聲明的一部分
作為與模塊實例的接口連接的一部分
這兩種方式都是可以綜合的,但將modport作為modport定義的一部分來指定有一些優勢,這將在下面幾段中討論。
在模塊的interface聲明中選擇modport。要從一個Interface使用的特定調制端口可以直接指定為模塊內Interface端口聲明的一部分。要連接到Interface的modport被指定為:
.
比如說。
只有特定類型的Interface端口可以指定一個modport作為端口聲明的一部分。通用Interface端口不能指定一個modport。
在實例化和連接這個主模塊的上級模塊,Interface的一個實例被連接到modport,而不指定modport的名稱。例如:
在module實例中選擇modport。另一種編碼方式是不在模塊定義中選擇modport,而是將modport的選擇推遲到模塊實例化時進行。下面的例子聲明了第一個從屬模塊的端口作為simple_ahb Interface端口,但沒有指定使用哪個modport定義。
然后可以在模塊實例化時指定Interface的具體模口,將一個Interface的實例連接到一個模塊實例。該連接被指定為:
.
比如說。
當在模塊實例中指定要使用的modport時,模塊定義可以使用特定類型的Interface端口或通用Interface端口類型。
注意事項 |
---|
一個modport可以在模塊端口定義或模塊實例中選擇,但不能同時選擇。 |
最佳實踐指南10-3 |
---|
選擇模塊使用的modport作為模塊的Interface端口聲明的一部分。不要在網表級別選擇modport。 |
將modport作為端口聲明的一部分來指定,還可以使模塊獨立于其他模塊進行綜合。它還有助于使模塊更加自我記錄。閱讀或維護該模塊的工程師可以立即看到哪一個modport將被用于該模塊。
在不指定modport的情況下連接到Interface。模塊Interface端口可以連接到一個Interface實例,而不需要指定具體的modport定義。當沒有指定modport時,Interface中的所有wire都被假定為有一個雙向的inout方向。在仿真中,Interface中的變量被假定為ref類型。(ref端口允許端口的兩邊都可以讀取和修改變量。ref端口是不可綜合的,在本書中沒有討論)。綜合編譯器將沒有指定modport的Interface端口中的所有信號視為inout雙向端口。
使用modports來定義不同的連接集
在一個由幾個不同模塊使用的比較復雜的Interface中,可能不是每個模塊都需要看到Interface中的同一組信號。Modports使得為每個使用該Interface的模塊創建一個自定義的Interface視圖成為可能。
一個模塊只能訪問其modport定義中列出的信號。這使得Interface中的一些信號有可能被完全隱藏,不被某些模塊看到。例如,Interface可能包含一些信號,只有通過master_portsmodport連接到Interface的模塊才能使用,而通過s1ave_ports modport連接的模塊不能使用。
完整的AMBA AHB總線有19個信號,其中有幾個信號只由總線主機使用,而不是由總線從機使用。
下面的例子說明了一個自定義版本的simple_ahb Interface,增加了3個額外的AMBAAHB信號-hprot,hburst和htrans,只被主模塊使用。master_ports和slave_ports的modport聲明確保主模塊和從模塊看到各自模塊的正確信號集。
例10-5: 用modports的Interface來定制Interface信號的視圖
/////////////////////////////////////////////////////////// //SimpleAMBAAHBInterface /////////////////////////////////////////////////////////// //`begin_keywords"1800-2012" interfacesimple_ahb( inputlogichclk,//bustransferclk inputlogichresetN//busreset,activelow ); logic[31:0]haddr;//transferstartaddress logic[31:0]hwdata;//datasenttoslave logic[31:0]hrdata;//returndatafromslave logic[2:0]hsize;//transfersize logichwrite;//1forwrite,0forread logichready;//1fortransferfinished //additionalAHBsignalsonlyusedbybusmaster logic[3:0]hprot;//tranferprotectionmode logic[2:0]hburst;//transferburstmode logic[1:0]htrans;//transfertype //mastermoduleportdirections modportmaster_ports( outputhaddr,hwdata,hsize,hwrite,//toAHBslave inputhrdata,hready,//fromAHBslave inputhclk,hresetN,//fromchiplevel //additionalAHBsignalsonlyusedbybusmaster outputhprot,hburst,htrans ); //slavemoduleportdirections modportslave_ports( outputhrdata,hready,//toAHBmaster inputhaddr,hwdata,hsize,hwrite,//fromAHBmaster inputhclk,hresetN//fromchiplevel ); endinterface:simple_ahb //`end_keywords
使用 simple_ahb .master_ports modport 的模塊可以使用 hprot, hburst和htrans信號。一個使用simple_ahb.slave_ports modport的模塊不能訪問這3個信號。因為這些信號沒有在slave_ports modport中列出,就好像這些信號根本不存在一樣。
也有可能在一個Interface內有內部信號,這些信號通過任何modport都不可見。這些內部信號可能被lint檢查器或Interface中的其他功能所使用。
審核編輯:劉清
-
仿真器
+關注
關注
14文章
1017瀏覽量
83724 -
AHB總線
+關注
關注
0文章
18瀏覽量
9480 -
Verilog設計
+關注
關注
0文章
20瀏覽量
6517 -
cache技術
+關注
關注
0文章
41瀏覽量
1062
原文標題:數字硬件建模SystemVerilog-通信總線建模 --Interface和modport
文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論