概述
SystemVerilog Interface是modport的一種,但比簡單的輸入、輸出或輸入輸出端口的功能更多。在其最簡單的形式中,Interface端口將相關(guān)的信號捆綁在一起作為一個單一的復(fù)合端口。例如,構(gòu)成AMBA AXI總線的所有單個信號都可以被歸納為一個Interface端口。一個Interface可以做的不僅僅是封裝總線信號。SystemVerilog Interface為設(shè)計者提供了一種集中總線功能的方法,而不是將功能分散在設(shè)計中的幾個模塊中。這就模擬了設(shè)計工程師在RTL層面的工作,并讓綜合工作在整個設(shè)計中適當(dāng)?shù)胤峙溟T級總線硬件。
當(dāng)遵循特定的建模準則和限制時,Interface是可以綜合的。Interface也可以用在不可綜合級別的建模,并作為驗證測試平臺的一部分。先進的驗證方法,如UVM 、OVM和VMM,都使用Interface。
Interface端口的概念
對于可綜合的RTL建模,Interface的主要目的是將多信號總線的聲明和一些協(xié)議功能信號封裝在一個單獨的定義中。然后,這個Interface定義可以在任何的模塊中使用,而不必重復(fù)聲明總線信號。
一個Interface是在關(guān)鍵字interface和end interface之間定義的。一個可綜合的RTL Interface定義可以包含:
帶有數(shù)據(jù)類型和向量寬度的變量(Variable)和wire聲明。
modport定義,給出信號的方向。可以為將使用該Interface的不同模塊指定不同的定義。
Interface也可以包含不可綜合的事務(wù)級功能和驗證代碼,包括初始程序、always程序、任務(wù)和斷言 。本文沒有討論Interface的這些不可綜合的方面。
本章的例子使用AMBAAHB總線的簡化版本,被稱為"simple AHB",在主模塊和從模塊之間進行通信。這個簡化版本只使用了構(gòu)成完整AMBA AHB總線的19個信號中的8個。簡單的AHB信號是:
表10-1:簡化的AMBA AHB信號
信號名 | 位寬 | 備注 |
---|---|---|
hclk | 1-bit | 總線傳輸時鐘,外部產(chǎn)生 |
hresetN | 1-bit | 有源低電平總線復(fù)位,外部產(chǎn)生 |
haddr | 32-bit | 轉(zhuǎn)移地址 |
hwdata | 32-bit | 從主機發(fā)送至從機的數(shù)據(jù)值(有些例子增加了一個1位奇偶位) |
hrdata | 32-bit | 從機發(fā)回給主機的數(shù)據(jù)值(有些例子增加了一個1位的奇偶位) |
hsize | 3-位 | 指示傳輸規(guī)模的控制信號 |
hwrite | 1-bit | 從主機向從機轉(zhuǎn)移方向控制(1為寫,0為讀) |
hready | 1-bit | 從機的響應(yīng),表明傳輸已經(jīng)完成 |
這種簡單的AHB總線在單個主機和單個從機模塊之間進行通信,因此不需要完整的AMBA AHB總線所需要的總線仲裁器和解碼器模塊。
傳統(tǒng)的Verilog總線連接
如果沒有Interface,構(gòu)成通信總線的信號必須在每個使用總線的模塊中作為單獨的端口來聲明。這些端口的聲明必須在每個使用總線的模塊中重復(fù)進行,并在連接總線和其他模塊的網(wǎng)表模塊中作為wire再次重復(fù)進行。
圖10-1顯示了將主模塊和從模塊連接在一起的框圖,使用了簡化版的AMBA AHB總線的8個信號。圖中還顯示了四個與簡單的AHB總線無關(guān)的額外信號。使用某種形式的總線協(xié)議進行通信的模塊,除了構(gòu)成總線的那些信號外,通常還有其他的輸入和輸出。
圖10-1:使用獨立interface連接主機和從機的方框圖
例10-1顯示了連接圖10-1中的主模塊和從模塊的代碼。請注意,構(gòu)成簡單AHB總線的8個信號的聲明是重復(fù)的。同樣的信號必須在主模塊、從模塊、連接主模塊和從模塊以及主模塊和從模塊實例的連接中聲明。例10-1是用傳統(tǒng)的Verilog-2001風(fēng)格和數(shù)據(jù)類型建模的。
例10-1:使用單獨的端口連接主模塊和從模塊
/////////////////////////////////////////////////////////// //MasterModulePortList--Verilog-2001style /////////////////////////////////////////////////////////// //`begin_keywords"1364-2001" modulemaster( //simplifiedAHBbussignals inputwirehclk,//bustransferclk inputwirehresetN,//busreset,activelow outputreg[31:0]haddr,//transferstartaddress outputreg[31:0]hwdata,//datasenttoslave outputreghwrite,//returndatafromslave outputreg[2:0]hsize,//transfersize inputwire[31:0]hrdata,//1forwrite,0forread inputwirehready,//1fortransferfinished //othersignals inputwirem_clk,//masterclock inputwirerstN,//reset,activelow inputwire[7:0]thing1,//miscsignal;notpartofbus outputreg[7:0]thing2//miscsignal;notpartofbus ); //...//mastermodulefunctionalitynotshown endmodule:master //`end_keywords /////////////////////////////////////////////////////////// //SlaveModulePortList--Verilog-2001style /////////////////////////////////////////////////////////// //`begin_keywords"1364-2001" moduleslave( //simplifiedAHBbussignals inputwirehclk,//bustransferclk inputwirehresetN,//busreset,activelow inputwire[31:0]haddr,//transferstartaddress inputwire[31:0]hwdata,//datasenttoslave inputwirehwrite,//returndatafromslave inputwire[2:0]hsize,//transfersize outputreg[31:0]hrdata,//1forwrite,0forread outputreghready,//1fortransferfinished //othersignals inputwires_clk,//slaveclock inputwirerstN,//reset,activelow outputreg[7:0]thing1,//misc.signal;notpartofbus inputwire[7:0]thing2//misc.signal;notpartofbus ); //...//slavemodulefunctionalitynotshown endmodule:slave //`end_keywords /////////////////////////////////////////////////////////// //Top-levelNetlistModule--Verilog-2001style /////////////////////////////////////////////////////////// //`begin_keywords"1364-2001" modulechip_top; //SimplifiedAHBbussignals wirehclk;//bustransferclk wirehresetN;//busreset,activelow wire[31:0]haddr;//transferstartaddress wire[31:0]hwdata;//datasenttoslave wirehwrite;//returndatafromslave wire[2:0]hsize;//transfersize wire[31:0]hrdata;//1forwrite,0forread wirehready;//1fortransferfinished //Othersignals wirem_clk;//masterclock wires_clk;//slaveclock wirechip_rstN;//reset,activelow wire[7:0]thing1;//miscsignal;notpartofbus wire[7:0]thing2;//miscsignal;notpartofbus masterm(//simplifiedAHBbusconnections .hclk(hclk), .hresetN(hresetN), .haddr(haddr), .hwdata(hwdata), .hsize(hsize), .hwrite(hwrite), .hrdata(hrdata), .hready(hready), //0therconnections .m_clk(m_clk), .rstN(chip_rstN), .thing1(thing1), .thing2(thing2) ); slaves(//simplifiedAHBbusconnections .hclk(hclk), .hresetN(hresetN), .haddr(haddr), .hwdata(hwdata), .hsize(hsize), .hwrite(hwrite), .hrdata(hrdata), .hready(hready), //0therconnections .s_clk(s_clk), .rstN(chip_rstN), .thing1(thing1), .thing2(thing2) ); //...//remainingchip-levelcodenotshown endmodule:chip_top //`end_keywords
與主端口的連接必須再次復(fù)制簡化的AHB信號(SystemVerilog的點名或如果所有的名字都匹配,點星的快捷方式可以減少這種冗余。正是如此。
「離散的輸入和輸出modport的缺點」。為總線信號使用單獨的modport,描述設(shè)計中各塊之間的互連提供了一種簡單而直觀的方法。獨立的端口準確地模擬了構(gòu)成總線物理實現(xiàn)的信號。然而,在大型復(fù)雜的設(shè)計中,使用單個modport有幾個缺點。其中一些缺點是:
聲明必須在多個模塊中重復(fù)進行。
通信協(xié)議,如握手順序,必須在七個模塊中重復(fù)使用。
在不同的模塊中存在著不匹配聲明的風(fēng)險。
設(shè)計規(guī)范的改變可能需要在多個模塊中同步進行修改。
在前面的例子中,構(gòu)成簡化AHB總線的信號必須在每個使用總線的模塊中聲明,以及在將主模塊和從模塊連接在一起的頂層網(wǎng)表中聲明。即使是上面列出的簡化AHB總線例子--它只使用了19個AHB總線信號中的8個,并且只有一個從屬模塊--名稱的重復(fù)也是很明顯的。每個AHB信號總共被命名了7次!
這種重復(fù)不僅需要輸入大量的代碼行,而且很有可能出現(xiàn)編碼錯誤。在一個地方輸入錯誤的名稱或不正確的矢量大小可能會導(dǎo)致設(shè)計中的功能錯誤,直到設(shè)計過程的后期,當(dāng)模塊被連接在一起進行完整的驗證時才會被發(fā)現(xiàn)。
復(fù)制的端口聲明也意味著,如果在設(shè)計過程中(或在下一代設(shè)計中)總線的規(guī)格發(fā)生變化,每一個共享總線的模塊都必須被改變。用于連接使用該總線的模塊的網(wǎng)表也必須改變。這種大范圍的改變效果是與良好的編碼風(fēng)格相違背的。好的編碼的一個目標是將代碼結(jié)構(gòu)化,使一個地方的小變化不需要改變代碼的其他區(qū)域。使用離散的輸入和輸出端口的一個弱點是,一個模塊中的端口的改變通常需要其他文件的改變。
使用離散的輸入和輸出modport的另一個缺點是,通信協(xié)議必須在每個利用模塊之間相互連接的信號的模塊中重復(fù)進行。例如,如果有三個模塊從一個共享的存儲器設(shè)備上進行讀寫,那么讀寫控制邏輯必須在每個模塊中重復(fù)進行。
SystemVerilog Interface定義
SystemVerilog給Verilog增加了一個強大的新端口類型,稱為Interface端口。一個Interface允許一些信號被組合在一起,并被表示為一個單一的端口。構(gòu)成Interface的信號的聲明被封裝在關(guān)鍵字interface和end interface之間。每個使用這些信號的模塊都有一個Interface類型的單一端口,而不是許多不相干的信號的端口。
圖10-2顯示了一個Interface如何將幾個單獨的端口組綜合成一個單一的端口,連接到一個Interface。
例10-3顯示了主模塊和從模塊的定義。主模塊上用于簡單AHB總線的8個獨立端口已經(jīng)被單個Interface端口所取代。這個Interface端口沒有被聲明為輸入、輸出或inout,而是被聲明為simple_ahb,也就是例10-2中定義的Interface的名稱。當(dāng)使用傳統(tǒng)的單獨的輸入和輸出端口時,Interface端口消除了主從模塊內(nèi)多余的簡單AHB信號聲明,如例10-1中的情況。
例10-4顯示了連接主模塊和從模塊的高層網(wǎng)表。不再有24行的代碼來聲明8個獨立的總線信號和然后將這8個信號連接到例10-1中列出的主模塊和從模塊的端口。相反,simple_ahb Interface的實例化方式與模塊相同,實例名稱與主模塊和從模塊實例的Interface端口相連。
圖10-2:使用Interface端口連接主機和從機的方框圖
下面的三個例子顯示了使用Interface如何減少為上面所示的簡單AHB通信總線建模所需的代碼量。
例10-2顯示了一個Interface端口的定義,它將構(gòu)成簡單AHB的信號封裝為一個Interface。
例10-2:簡單AMBA AHB總線的Interface定義
/////////////////////////////////////////////////////////// //SimpleAMBAAHBInterface--SystemVerilog-2012style /////////////////////////////////////////////////////////// //`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 //mastermoduleportdirections modportmaster_ports( outputhaddr,hwdata,hsize,hwrite,//toAHBslave inputhrdata,hready,//fromAHBslave inputhclk,hresetN//fromchiplevel ); //slavemoduleportdirections modportslave_ports( outputhrdata,hready,//toAHBmaster inputhaddr,hwdata,hsize,hwrite,//fromAHBmaster inputhclk,hresetN//fromchiplevel ); endinterface:simple_ahb //`end_keywords
「Interface上的端口。」一個Interface就像一個模塊一樣可以有輸入、輸出和inout端口。例10-2中所示的簡單AHB Interface有兩個輸入端口,hc1k和hresetN,這些信號是在Interface之外產(chǎn)生的,通過兩個輸入端口傳入Interface。Interface上的端口的聲明與模塊上的端口相同。
一個Interface可以連接到另一個Interface。例如,一個設(shè)計的主總線可能有一個或多個子總線。主總線和它的子總線都可以被建模為Interface,而子總線的Interface可以被用作主總線Interface的端口。
上面的Interface定義包括兩個mod端口的定義,名字分別是master_ports和slave_ports。關(guān)鍵字modport是"模塊的端口"的縮寫,它定義了一個模塊是否將Interface中的信號視為模塊的輸入或模塊的輸出。Interface的一個好處是,總線協(xié)議中使用的信號的數(shù)據(jù)類型和矢量大小是一次性定義的。modport的定義只是從模塊的角度為Interface中定義的信號增加一個方向。
下面是一個主模塊和從模塊的例子,說明使用simple_ahb Interface作為每個模塊的端口。觀察一下這個單一的Interface端口是如何取代主模塊中顯示的8個離散的輸入和輸出端口,以及從屬模塊中的另外8個端口.
例10-3:帶有Interface端口的主模塊和從模塊
/////////////////////////////////////////////////////////// //MasterModulePortList--SystemVerilog-2012style /////////////////////////////////////////////////////////// //`begin_keywords"1800-2012" modulemaster (simple_ahb.master_portsahb,//interfaceport&modport //otherports inputlogicm_clk,//masterclock inputlogicrstN,//reset,activelow inputlogic[7:0]thing1,//miscsignal;notpartofbus outputlogic[7:0]thing2//miscsignal;notpartofbus ); //...//mastermodulefunctionalitynotshown endmodule:master //`end_keywords /////////////////////////////////////////////////////////// //SlaveModulePortList--SystemVerilog-2012style /////////////////////////////////////////////////////////// //`begin_keywords"1800-2012" moduleslave (simple_ahb.slave_portsahb,//interfaceport&modport //otherports inputlogics_clk,//slaveclock inputlogicrstN,//reset,activelow outputlogic[7:0]thing1,//miscsignal;notpartofbus inputlogic[7:0]thing2//miscsignal;notpartofbus ); //...//slavemodulefunctionalitynotshown endmodule:slave ///////versionwithnomodportselection/////// //moduleslave //(simple_ahbahb,//interfaceportwithoutmodport ////otherports //inputlogics_clk,//slaveclock //inputlogicrstN,//reset,activelow //outputlogic[7:0]thing1,//miscsignal;notpartofbus //inputlogic[7:0]thing2//miscsignal;notpartofbus //); //////...//slavemodulefunctionalitynotshown //endmodule:slave //`end_keywords
對于傳統(tǒng)的modport,頂層模塊必須為總線信號聲明單獨的網(wǎng)絡(luò),然后為每個單獨的信號與每個模塊實例的端口做單獨的連接。
當(dāng)一個帶有Interface端口的模塊被實例化時,一個Interface的實例被連接到Interface端口。
下面的代碼實例化了simple_ahb Interface并給它一個實例名ahbl。然后這個實例名被用于主模塊和從模塊實例的端口連接。
例10-4:連接主Interface和從Interface的網(wǎng)表
/////////////////////////////////////////////////////////// //Top-levelNetlistModule--SystemVerilog-2012style /////////////////////////////////////////////////////////// //`begin_keywords"1800-2012" modulechip_top; logicm_clk;//masterclock logics_clk;//slaveclock logichclk;//AHBbusclock logichresetN;//AHBbusreset,activelow logicchip_rstN;//reset,activelow logic[7:0]thing1;//miscsignal;notpartofbus logic[7:0]thing2;//miscsignal;notpartofbus // //instantiatetheinterface //(usingsamesyntaxasamoduleinstance) simple_ahbahb1(.hclk(hclk), .hresetN(hresetN) ); //instantiatemasterandconnecttheinterfaceinstance //totheinterfaceport masterm(.ahb(ahb1),//connectinterfaceport .rstN(chip_rstN), .m_clk,//dot-nameconnectionshortcut .thing1,//fortheotherports .thing2 ); //instantiateslaveandconnecttheinterfaceinstance //totheinterfaceport slaves(.ahb(ahb1),//connectinterfaceport .rstN(chip_rstN), .*//wildcardconnectionshortcut );//fortheotherports //instantiateslaveandpickmodportintheconnection //slaves(.ahb(ahb1.slave_ports),//selectslavemodport //.rstN(chip_rstN), //.*//wildcardconnectionshortcut //); //...//remainingchip-levelcodenotshown endmodule:chip_top //`end_keywords
在上面的例子中,構(gòu)成簡單AHB總線協(xié)議的所有信號都被封裝在simple_ahbInterface中。主模塊、從模塊和頂層模塊并不重復(fù)聲明這些總線信號。相反,主模塊和從模塊只是使用該Interface作為模塊之間的連接。該Interface消除了獨立modport的冗余聲明。
注意事項 |
---|
一個模塊的Interface端口不能不連接。 |
一個模塊的輸入、輸出或輸入輸出端口可以在一個模塊實例上不連接。Interface端口則不是這樣。一個interface必須連接到一個模塊上。如果一個Interface端口沒有被連接,將發(fā)生一個闡述錯誤。 |
在一個Interface內(nèi)引用信號
Interface端口是一個復(fù)合端口,端口內(nèi)部有信號。在一個有Interface端口的模式中,通過使用端口名稱來訪問Interface內(nèi)部的信號,使用的語法如下。
. 。
上面的simple_ahbInterface包含一個叫做hc1k 的信號,master有一個名為ahb的Interface端口 。主控模塊可以通過使用ahb.hclk訪問hclk。
always_ff@(posedgeahb.hclk)
最佳實踐指南10-1 |
---|
在RTL模型中,使用簡短的名稱作為Interface端口名稱。端口名稱在RTL代碼中需要經(jīng)常被引用。 |
由于Interface內(nèi)的信號是通過在信號名稱前加上Interface端口名稱來訪問的,所以使用短名稱作為Interface端口名稱是很方便的。
模塊和Interface之間的區(qū)別
Interface和模塊之間有三個基本區(qū)別。首先,一個Interface不能包含設(shè)計層次。與模塊不同,Interface不能包含模塊或基元的實例,這將創(chuàng)造一個新的實現(xiàn)層次結(jié)構(gòu)。第二,Interface可以作為modport使用,這就是允許Interface代表模塊之間的通信渠道。在端口列表中使用一個模塊是非法的。第三,一個Interface可以包含Interface,它允許連接到該Interface的每個模塊以不同的方式看到該Interface。
源代碼聲明順序
一個Interface的名字在兩種情況下被引用:作為一個模塊的端口,以及作為一個Interface的實例。Interface可以作為模塊的端口被實例化和使用,而不需要考慮文件順序的依賴性。就像模塊一樣,Interface的名稱可以在軟件工具讀入包含Interface定義的源代碼之前被引用。這意味著任何模塊都可以使用一個Interface作為模塊的端口,而不必擔(dān)心源代碼的編譯順序。
審核編輯:劉清
-
AMBA總線
+關(guān)注
關(guān)注
0文章
35瀏覽量
9565 -
Verilog
+關(guān)注
關(guān)注
28文章
1351瀏覽量
110122 -
RTL
+關(guān)注
關(guān)注
1文章
385瀏覽量
59814 -
AHB總線
+關(guān)注
關(guān)注
0文章
18瀏覽量
9486
原文標題:數(shù)字硬件建模SystemVerilog-通信總線建模 --Interface端口的概念
文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論