概述
SystemVerilog Interface是modport的一種,但比簡單的輸入、輸出或輸入輸出端口的功能更多。在其最簡單的形式中,Interface端口將相關(guān)的信號(hào)捆綁在一起作為一個(gè)單一的復(fù)合端口。例如,構(gòu)成AMBA AXI總線的所有單個(gè)信號(hào)都可以被歸納為一個(gè)Interface端口。一個(gè)Interface可以做的不僅僅是封裝總線信號(hào)。SystemVerilog Interface為設(shè)計(jì)者提供了一種集中總線功能的方法,而不是將功能分散在設(shè)計(jì)中的幾個(gè)模塊中。這就模擬了設(shè)計(jì)工程師在RTL層面的工作,并讓綜合工作在整個(gè)設(shè)計(jì)中適當(dāng)?shù)胤峙溟T級(jí)總線硬件。
當(dāng)遵循特定的建模準(zhǔn)則和限制時(shí),Interface是可以綜合的。Interface也可以用在不可綜合級(jí)別的建模,并作為驗(yàn)證測(cè)試平臺(tái)的一部分。先進(jìn)的驗(yàn)證方法,如UVM 、OVM和VMM,都使用Interface。
Interface端口的概念
對(duì)于可綜合的RTL建模,Interface的主要目的是將多信號(hào)總線的聲明和一些協(xié)議功能信號(hào)封裝在一個(gè)單獨(dú)的定義中。然后,這個(gè)Interface定義可以在任何的模塊中使用,而不必重復(fù)聲明總線信號(hào)。
一個(gè)Interface是在關(guān)鍵字interface和end interface之間定義的。一個(gè)可綜合的RTL Interface定義可以包含:
帶有數(shù)據(jù)類型和向量寬度的變量(Variable)和wire聲明。
modport定義,給出信號(hào)的方向。可以為將使用該Interface的不同模塊指定不同的定義。
Interface也可以包含不可綜合的事務(wù)級(jí)功能和驗(yàn)證代碼,包括初始程序、always程序、任務(wù)和斷言 。本文沒有討論Interface的這些不可綜合的方面。
本章的例子使用AMBAAHB總線的簡化版本,被稱為"simple AHB",在主模塊和從模塊之間進(jìn)行通信。這個(gè)簡化版本只使用了構(gòu)成完整AMBA AHB總線的19個(gè)信號(hào)中的8個(gè)。簡單的AHB信號(hào)是:
表10-1:簡化的AMBA AHB信號(hào)
信號(hào)名 | 位寬 | 備注 |
---|---|---|
hclk | 1-bit | 總線傳輸時(shí)鐘,外部產(chǎn)生 |
hresetN | 1-bit | 有源低電平總線復(fù)位,外部產(chǎn)生 |
haddr | 32-bit | 轉(zhuǎn)移地址 |
hwdata | 32-bit | 從主機(jī)發(fā)送至從機(jī)的數(shù)據(jù)值(有些例子增加了一個(gè)1位奇偶位) |
hrdata | 32-bit | 從機(jī)發(fā)回給主機(jī)的數(shù)據(jù)值(有些例子增加了一個(gè)1位的奇偶位) |
hsize | 3-位 | 指示傳輸規(guī)模的控制信號(hào) |
hwrite | 1-bit | 從主機(jī)向從機(jī)轉(zhuǎn)移方向控制(1為寫,0為讀) |
hready | 1-bit | 從機(jī)的響應(yīng),表明傳輸已經(jīng)完成 |
這種簡單的AHB總線在單個(gè)主機(jī)和單個(gè)從機(jī)模塊之間進(jìn)行通信,因此不需要完整的AMBA AHB總線所需要的總線仲裁器和解碼器模塊。
傳統(tǒng)的Verilog總線連接
如果沒有Interface,構(gòu)成通信總線的信號(hào)必須在每個(gè)使用總線的模塊中作為單獨(dú)的端口來聲明。這些端口的聲明必須在每個(gè)使用總線的模塊中重復(fù)進(jìn)行,并在連接總線和其他模塊的網(wǎng)表模塊中作為wire再次重復(fù)進(jìn)行。
圖10-1顯示了將主模塊和從模塊連接在一起的框圖,使用了簡化版的AMBA AHB總線的8個(gè)信號(hào)。圖中還顯示了四個(gè)與簡單的AHB總線無關(guān)的額外信號(hào)。使用某種形式的總線協(xié)議進(jìn)行通信的模塊,除了構(gòu)成總線的那些信號(hào)外,通常還有其他的輸入和輸出。
圖10-1:使用獨(dú)立interface連接主機(jī)和從機(jī)的方框圖
例10-1顯示了連接圖10-1中的主模塊和從模塊的代碼。請(qǐng)注意,構(gòu)成簡單AHB總線的8個(gè)信號(hào)的聲明是重復(fù)的。同樣的信號(hào)必須在主模塊、從模塊、連接主模塊和從模塊以及主模塊和從模塊實(shí)例的連接中聲明。例10-1是用傳統(tǒng)的Verilog-2001風(fēng)格和數(shù)據(jù)類型建模的。
例10-1:使用單獨(dú)的端口連接主模塊和從模塊
/////////////////////////////////////////////////////////// //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信號(hào)(SystemVerilog的點(diǎn)名或如果所有的名字都匹配,點(diǎn)星的快捷方式可以減少這種冗余。正是如此。
「離散的輸入和輸出modport的缺點(diǎn)」。為總線信號(hào)使用單獨(dú)的modport,描述設(shè)計(jì)中各塊之間的互連提供了一種簡單而直觀的方法。獨(dú)立的端口準(zhǔn)確地模擬了構(gòu)成總線物理實(shí)現(xiàn)的信號(hào)。然而,在大型復(fù)雜的設(shè)計(jì)中,使用單個(gè)modport有幾個(gè)缺點(diǎn)。其中一些缺點(diǎn)是:
聲明必須在多個(gè)模塊中重復(fù)進(jìn)行。
通信協(xié)議,如握手順序,必須在七個(gè)模塊中重復(fù)使用。
在不同的模塊中存在著不匹配聲明的風(fēng)險(xiǎn)。
設(shè)計(jì)規(guī)范的改變可能需要在多個(gè)模塊中同步進(jìn)行修改。
在前面的例子中,構(gòu)成簡化AHB總線的信號(hào)必須在每個(gè)使用總線的模塊中聲明,以及在將主模塊和從模塊連接在一起的頂層網(wǎng)表中聲明。即使是上面列出的簡化AHB總線例子--它只使用了19個(gè)AHB總線信號(hào)中的8個(gè),并且只有一個(gè)從屬模塊--名稱的重復(fù)也是很明顯的。每個(gè)AHB信號(hào)總共被命名了7次!
這種重復(fù)不僅需要輸入大量的代碼行,而且很有可能出現(xiàn)編碼錯(cuò)誤。在一個(gè)地方輸入錯(cuò)誤的名稱或不正確的矢量大小可能會(huì)導(dǎo)致設(shè)計(jì)中的功能錯(cuò)誤,直到設(shè)計(jì)過程的后期,當(dāng)模塊被連接在一起進(jìn)行完整的驗(yàn)證時(shí)才會(huì)被發(fā)現(xiàn)。
復(fù)制的端口聲明也意味著,如果在設(shè)計(jì)過程中(或在下一代設(shè)計(jì)中)總線的規(guī)格發(fā)生變化,每一個(gè)共享總線的模塊都必須被改變。用于連接使用該總線的模塊的網(wǎng)表也必須改變。這種大范圍的改變效果是與良好的編碼風(fēng)格相違背的。好的編碼的一個(gè)目標(biāo)是將代碼結(jié)構(gòu)化,使一個(gè)地方的小變化不需要改變代碼的其他區(qū)域。使用離散的輸入和輸出端口的一個(gè)弱點(diǎn)是,一個(gè)模塊中的端口的改變通常需要其他文件的改變。
使用離散的輸入和輸出modport的另一個(gè)缺點(diǎn)是,通信協(xié)議必須在每個(gè)利用模塊之間相互連接的信號(hào)的模塊中重復(fù)進(jìn)行。例如,如果有三個(gè)模塊從一個(gè)共享的存儲(chǔ)器設(shè)備上進(jìn)行讀寫,那么讀寫控制邏輯必須在每個(gè)模塊中重復(fù)進(jìn)行。
SystemVerilog Interface定義
SystemVerilog給Verilog增加了一個(gè)強(qiáng)大的新端口類型,稱為Interface端口。一個(gè)Interface允許一些信號(hào)被組合在一起,并被表示為一個(gè)單一的端口。構(gòu)成Interface的信號(hào)的聲明被封裝在關(guān)鍵字interface和end interface之間。每個(gè)使用這些信號(hào)的模塊都有一個(gè)Interface類型的單一端口,而不是許多不相干的信號(hào)的端口。
圖10-2顯示了一個(gè)Interface如何將幾個(gè)單獨(dú)的端口組綜合成一個(gè)單一的端口,連接到一個(gè)Interface。
例10-3顯示了主模塊和從模塊的定義。主模塊上用于簡單AHB總線的8個(gè)獨(dú)立端口已經(jīng)被單個(gè)Interface端口所取代。這個(gè)Interface端口沒有被聲明為輸入、輸出或inout,而是被聲明為simple_ahb,也就是例10-2中定義的Interface的名稱。當(dāng)使用傳統(tǒng)的單獨(dú)的輸入和輸出端口時(shí),Interface端口消除了主從模塊內(nèi)多余的簡單AHB信號(hào)聲明,如例10-1中的情況。
例10-4顯示了連接主模塊和從模塊的高層網(wǎng)表。不再有24行的代碼來聲明8個(gè)獨(dú)立的總線信號(hào)和然后將這8個(gè)信號(hào)連接到例10-1中列出的主模塊和從模塊的端口。相反,simple_ahb Interface的實(shí)例化方式與模塊相同,實(shí)例名稱與主模塊和從模塊實(shí)例的Interface端口相連。
圖10-2:使用Interface端口連接主機(jī)和從機(jī)的方框圖
下面的三個(gè)例子顯示了使用Interface如何減少為上面所示的簡單AHB通信總線建模所需的代碼量。
例10-2顯示了一個(gè)Interface端口的定義,它將構(gòu)成簡單AHB的信號(hào)封裝為一個(gè)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上的端口?!?/strong>一個(gè)Interface就像一個(gè)模塊一樣可以有輸入、輸出和inout端口。例10-2中所示的簡單AHB Interface有兩個(gè)輸入端口,hc1k和hresetN,這些信號(hào)是在Interface之外產(chǎn)生的,通過兩個(gè)輸入端口傳入Interface。Interface上的端口的聲明與模塊上的端口相同。
一個(gè)Interface可以連接到另一個(gè)Interface。例如,一個(gè)設(shè)計(jì)的主總線可能有一個(gè)或多個(gè)子總線。主總線和它的子總線都可以被建模為Interface,而子總線的Interface可以被用作主總線Interface的端口。
上面的Interface定義包括兩個(gè)mod端口的定義,名字分別是master_ports和slave_ports。關(guān)鍵字modport是"模塊的端口"的縮寫,它定義了一個(gè)模塊是否將Interface中的信號(hào)視為模塊的輸入或模塊的輸出。Interface的一個(gè)好處是,總線協(xié)議中使用的信號(hào)的數(shù)據(jù)類型和矢量大小是一次性定義的。modport的定義只是從模塊的角度為Interface中定義的信號(hào)增加一個(gè)方向。
下面是一個(gè)主模塊和從模塊的例子,說明使用simple_ahb Interface作為每個(gè)模塊的端口。觀察一下這個(gè)單一的Interface端口是如何取代主模塊中顯示的8個(gè)離散的輸入和輸出端口,以及從屬模塊中的另外8個(gè)端口.
例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
對(duì)于傳統(tǒng)的modport,頂層模塊必須為總線信號(hào)聲明單獨(dú)的網(wǎng)絡(luò),然后為每個(gè)單獨(dú)的信號(hào)與每個(gè)模塊實(shí)例的端口做單獨(dú)的連接。
當(dāng)一個(gè)帶有Interface端口的模塊被實(shí)例化時(shí),一個(gè)Interface的實(shí)例被連接到Interface端口。
下面的代碼實(shí)例化了simple_ahb Interface并給它一個(gè)實(shí)例名ahbl。然后這個(gè)實(shí)例名被用于主模塊和從模塊實(shí)例的端口連接。
例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é)議的所有信號(hào)都被封裝在simple_ahbInterface中。主模塊、從模塊和頂層模塊并不重復(fù)聲明這些總線信號(hào)。相反,主模塊和從模塊只是使用該Interface作為模塊之間的連接。該Interface消除了獨(dú)立modport的冗余聲明。
注意事項(xiàng) |
---|
一個(gè)模塊的Interface端口不能不連接。 |
一個(gè)模塊的輸入、輸出或輸入輸出端口可以在一個(gè)模塊實(shí)例上不連接。Interface端口則不是這樣。一個(gè)interface必須連接到一個(gè)模塊上。如果一個(gè)Interface端口沒有被連接,將發(fā)生一個(gè)闡述錯(cuò)誤。 |
在一個(gè)Interface內(nèi)引用信號(hào)
Interface端口是一個(gè)復(fù)合端口,端口內(nèi)部有信號(hào)。在一個(gè)有Interface端口的模式中,通過使用端口名稱來訪問Interface內(nèi)部的信號(hào),使用的語法如下。
. 。
上面的simple_ahbInterface包含一個(gè)叫做hc1k 的信號(hào),master有一個(gè)名為ahb的Interface端口 。主控模塊可以通過使用ahb.hclk訪問hclk。
always_ff@(posedgeahb.hclk)
最佳實(shí)踐指南10-1 |
---|
在RTL模型中,使用簡短的名稱作為Interface端口名稱。端口名稱在RTL代碼中需要經(jīng)常被引用。 |
由于Interface內(nèi)的信號(hào)是通過在信號(hào)名稱前加上Interface端口名稱來訪問的,所以使用短名稱作為Interface端口名稱是很方便的。
模塊和Interface之間的區(qū)別
Interface和模塊之間有三個(gè)基本區(qū)別。首先,一個(gè)Interface不能包含設(shè)計(jì)層次。與模塊不同,Interface不能包含模塊或基元的實(shí)例,這將創(chuàng)造一個(gè)新的實(shí)現(xiàn)層次結(jié)構(gòu)。第二,Interface可以作為modport使用,這就是允許Interface代表模塊之間的通信渠道。在端口列表中使用一個(gè)模塊是非法的。第三,一個(gè)Interface可以包含Interface,它允許連接到該Interface的每個(gè)模塊以不同的方式看到該Interface。
源代碼聲明順序
一個(gè)Interface的名字在兩種情況下被引用:作為一個(gè)模塊的端口,以及作為一個(gè)Interface的實(shí)例。Interface可以作為模塊的端口被實(shí)例化和使用,而不需要考慮文件順序的依賴性。就像模塊一樣,Interface的名稱可以在軟件工具讀入包含Interface定義的源代碼之前被引用。這意味著任何模塊都可以使用一個(gè)Interface作為模塊的端口,而不必?fù)?dān)心源代碼的編譯順序。
審核編輯:劉清
-
AMBA總線
+關(guān)注
關(guān)注
0文章
35瀏覽量
9566 -
Verilog
+關(guān)注
關(guān)注
28文章
1351瀏覽量
110124 -
RTL
+關(guān)注
關(guān)注
1文章
385瀏覽量
59820 -
AHB總線
+關(guān)注
關(guān)注
0文章
18瀏覽量
9486
原文標(biāo)題:數(shù)字硬件建模SystemVerilog-通信總線建模 --Interface端口的概念
文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論