概述
SystemVerilog Interface是modport的一種,但比簡(jiǎn)單的輸入、輸出或輸入輸出端口的功能更多。在其最簡(jiǎn)單的形式中,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方法(任務(wù)和函數(shù))
SystemVerilog Interface的作用不僅僅是將相關(guān)的信號(hào)組合在一起。Interface還可以封裝模塊間的通信功能。通過(guò)將通信功能添加到Interface中,每個(gè)使用該Interface的模塊可以簡(jiǎn)單地引用該功能,而不必在每個(gè)模塊中重復(fù)該功能。Interface中的封裝功能也可以獨(dú)立于使用該Interface的模塊進(jìn)行驗(yàn)證。
Interface中封裝的功能可以通過(guò)使用任務(wù)和函數(shù)來(lái)定義。Interface中的任務(wù)和函數(shù)被稱為Interface方法(interface methods)。Interface方法(任務(wù)和函數(shù))可以通過(guò)在模塊的modport定義中使用導(dǎo)入語(yǔ)句被導(dǎo)入到需要它們的模塊中。在modport中導(dǎo)入函數(shù)類似于從包中導(dǎo)入函數(shù)。
下面的例子給簡(jiǎn)單的AHB Interface增加了兩個(gè)函數(shù)--一個(gè)是生成奇偶校驗(yàn)位值(使用奇數(shù)校驗(yàn)),另一個(gè)函數(shù)是檢查數(shù)據(jù)是否與計(jì)算出的奇偶校驗(yàn)相符。hwdata和hrdata向量被聲明為比以前的例子寬1位,額外的位被用作奇偶校驗(yàn)位。
例10-6:帶有奇偶性邏輯Interface方法(函數(shù))的Interface
/////////////////////////////////////////////////////////// //SimpleAHBInterfacewithparitymethods /////////////////////////////////////////////////////////// //`begin_keywords"1800-2012" interfacesimple_ahb( inputlogichclk,//bustransferclk inputlogichresetN//busreset,activelow ); logic[31:0]haddr;//transferstartaddress logic[32:0]hwdata;//datatoslave,withparitybit logic[32:0]hrdata;//datafromslave,withparitybit logic[2:0]hsize;//transfersize logichwrite;//1forwrite,0forread logichready;//1fortransferfinished functionautomaticlogicparity_gen(logic[31:0]data); return(^data);//calculateparityofdata(oddparity) endfunction functionautomaticlogicparity_chk(logic[31:0]data, logicparity); return(parity===^data);//1=OK,0=parityerror endfunction //mastermoduleportdirections modportmaster_ports( outputhaddr,hwdata,hsize,hwrite,//toAHBslave inputhrdata,hready,//fromAHBslave inputhclk,hresetN,//fromchiplevel importparity_gen,parity_check//functionimport ); //slavemoduleportdirections modportslave_ports( outputhrdata,hready,//toAHBmaster inputhaddr,hwdata,hsize,hwrite,//fromAHBmaster inputhclk,hresetN,//fromchiplevel importparity_check//functionimport ); //slavemoduleportdirections modportslave_ports_alt( outputhrdata,hready,//toAHBmaster inputhaddr,hwdata,hsize,hwrite,//fromAHBmaster inputhclk,hresetN,//fromchiplevel importfunctionlogicparity_chk(logic[31:0]data, logicparity) ); endinterface:simple_ahb //`end_keywords
在這個(gè)例子中,master_ports 的modport定義同時(shí)導(dǎo)入了parity_gen 和 parity_chk。modport從主模塊的角度定義了端口方向和導(dǎo)入。因此,一個(gè)使用master_portsmodport的模塊正在導(dǎo)入這些函數(shù),類似于一個(gè)模塊從包中導(dǎo)入函數(shù)的方式。
slave_portsmodport只導(dǎo)入parity_chk。一個(gè)使用slave_ports modport的模塊不能訪問(wèn)parity_gen。因?yàn)檫@個(gè)方法沒(méi)有被包含在modport 的導(dǎo)入中,所以從 slave_ports 提供的Interface來(lái)看,這個(gè)方法就好像不存在一樣。
使用方法原型導(dǎo)入方法。作為選擇,modport導(dǎo)入聲明可以指定任務(wù)或函數(shù)參數(shù)的完整原型。而不是僅僅導(dǎo)入方法名,導(dǎo)入關(guān)鍵字后面是實(shí)際方法定義的聲明行。這種風(fēng)格的導(dǎo)入聲明的基本語(yǔ)法是:
modport(import task( ))。 modport(importfunction ( ))。
比如說(shuō)。
函數(shù)原型不包括automatic關(guān)鍵字,即使實(shí)際的函數(shù)被聲明為automatic(這是綜合所需要的)。
使用完整的原型來(lái)導(dǎo)入一個(gè)方法并沒(méi)有什么好處。一些工程師認(rèn)為,完整的原型可以直接記錄任務(wù)或函數(shù)的參數(shù),作為??诼暶鞯囊徊糠帧.?dāng)實(shí)際的任務(wù)或函數(shù)被定義在一個(gè)包中,并被導(dǎo)入到Interface中時(shí),這種額外的代碼記錄會(huì)很方便。原型使方法類型和參數(shù)在Interface定義中可見(jiàn),這樣工程師就不需要到包含包的文件中去看方法類型和參數(shù)。
調(diào)用Interface中定義的方法
導(dǎo)入的方法是Interface的一部分,通過(guò)使用Interface端口名稱來(lái)調(diào)用,與引用Interface中的信號(hào)的方式相同。語(yǔ)法是
. 。
前面展示的主模塊有一個(gè)名為ahb 的 Interface端口 。因此,主模塊可以通過(guò)引用ahb.parity_gen來(lái)調(diào)用Interface parity_gen方法。例如:
always_ff@(posedgeahb.hclk) ahb.hwdata[32]<= ahb.parity_gen(ahb.hwdata[31:0])。
綜合Interface方法
從概念上講,綜合編譯器通過(guò)在模塊中創(chuàng)建該方法的本地副本來(lái)替換導(dǎo)入的方法,然后對(duì)該本地副本進(jìn)行綜合。綜合后的模塊版本將包含導(dǎo)入方法的邏輯,而不再?gòu)腎nterface中獲取該功能。
最佳實(shí)踐指南10-4 |
---|
對(duì)于可綜合的RTL Interface,只在Interface中使用函數(shù)和無(wú)效函數(shù)。不要使用任務(wù)或always程序。 |
綜合編譯器對(duì)放置在模塊中的Interface內(nèi)容施加了同樣的RTL編碼限制。這些限制之一是,任務(wù)必須在零時(shí)間內(nèi)執(zhí)行。使用void函數(shù)而不是任務(wù)來(lái)執(zhí)行這個(gè)綜合限制。
注意事項(xiàng) |
---|
導(dǎo)入的函數(shù)或任務(wù)必須被聲明為automatic,并且不能包含靜態(tài)聲明,以便被綜合。這與模塊從包中導(dǎo)入函數(shù)或任務(wù)時(shí)的同義詞規(guī)則相同。 |
一個(gè)automatic函數(shù)或任務(wù)在每次被調(diào)用時(shí)都會(huì)分配新的存儲(chǔ)空間。當(dāng)一個(gè)模塊調(diào)用一個(gè)導(dǎo)入的方法時(shí),所有內(nèi)部存儲(chǔ)的新副本被分配。這允許綜合處理該方法,就好像它是模塊內(nèi)的一個(gè)本地副本。
抽象的、不可綜合的Interface
SystemVerilog Interface能夠以比RTL綜合編譯器所支持的更高的抽象水平來(lái)表示總線協(xié)議。例如,一個(gè)Interface任務(wù),可能需要多個(gè)時(shí)鐘周期來(lái)執(zhí)行,可以代表一個(gè)完整的主從握手協(xié)議。該協(xié)議可以從主機(jī)發(fā)出傳輸請(qǐng)求開始,仲裁哪個(gè)從機(jī)收到請(qǐng)求,等待從機(jī)的反饋,傳輸數(shù)據(jù),并收到數(shù)據(jù)被接收的確認(rèn)信息。
這些Interface功能對(duì)抽象的事務(wù)級(jí)建模很有用,但目前的RTL綜合編譯器不支持。目前的SystemVerilog綜合工具要求將Interface中編碼的功能限制為零延遲和零時(shí)鐘周期模型。這些綜合限制可以通過(guò)將Interface中定義的功能代碼限制為函數(shù)來(lái)滿足。SystemVerilog的語(yǔ)法規(guī)則要求函數(shù)必須在零模擬時(shí)間內(nèi)執(zhí)行,這就要求綜合器對(duì)零延遲Interface功能的要求。
一個(gè)Interface也可以包含驗(yàn)證程序和斷言。這些驗(yàn)證代碼可以通過(guò)將其包含在pragma中而隱藏起來(lái)。
//synthesistranslateoffand//synthesistranslateon.
Interface程序代碼
除了任務(wù)和函數(shù)方法,Interface還可以包含初始和always程序塊和assign。程序代碼可以用來(lái)在一個(gè)Interface內(nèi)建立功能模型,這些功能會(huì)影響到在Interface所代表的總線上交流的信息。
例10-7為簡(jiǎn)單AHB總線增加了一個(gè)時(shí)鐘發(fā)生器hclk,為總線增加了一個(gè)復(fù)位同步器hresetN。在這個(gè)Interface的前幾個(gè)例子中,這些信號(hào)是在Interface的外部產(chǎn)生的,并作為簡(jiǎn)單AHB Interface的輸入端口傳入。這個(gè)例子用芯片(或系統(tǒng))級(jí)的時(shí)鐘和復(fù)位取代了這些輸入,并使用這些芯片級(jí)的信號(hào)來(lái)產(chǎn)生本地總線時(shí)鐘和總線復(fù)位。這個(gè)本地功能然后成為主模塊和從模塊之間封裝的總線通信的一部分。
例10-7:與內(nèi)部程序代碼的Interface,生成總線功能
/////////////////////////////////////////////////////////// //SimpleAHBInterfacewithclockgeneratorandreset //synchronizerproceduralcode /////////////////////////////////////////////////////////// //`begin_keywords"1800-2012" interfacesimple_ahb( inputlogicchip_clk,//externalclockfromthechip inputlogicchip_rstN//busreset,activelow ); logichclk;//localbustransferclk logichresetN;//localbusreset,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 //generateAHBclock(divide-by-twoofchip_clk) always_ff@(posedgechip_clkornegedgechip_rstN) if(!chip_rstN)hclk<=?'0; ????else????????????hclk?<=?~hclk; ??//?sync?trailing?edge?of?hresetN?to?hclk ??logic?rstN_tmp;?//?temp?variable?used?inside?the?interface ??always_ff?@(posedge?hclk?or?negedge?chip_rstN) ????if?(!chip_rstN)?begin???//?asynchronous?active-low?reset ??????rstN_tmp?<=?'0; ??????hresetN??<=?'0; ????end? ????else?begin? ??????rstN_tmp?<=?'1;???????//?begin?end?of?reset ??????hresetN??<=?rstN_tmp;?//?stabilize?reset ????end? ??//?master?module?port?directions ??modport?master_ports?( ????output?haddr,?hwdata,?hsize,?hwrite,?//?to?AHB?slave ????input??hrdata,?hready,???????????????//?from?AHB?slave ????input??hclk,?hresetN?????????????????//?from?chip?level ??); ??//?slave?module?port?directions ??modport?slave_ports?( ????output?hrdata,?hready,???????????????//?to?AHB?master ????input??haddr,?hwdata,?hsize,?hwrite,?//?from?AHB?master ????input??hclk,?hresetN?????????????????//?from?chip?level ??); endinterface:?simple_ahb //`end_keywords?
綜合Interface程序。綜合編譯器如何處理Interface中的程序代碼并沒(méi)有很好的定義,這與Interface方法(任務(wù)和函數(shù))的情況不同。方法的綜合是通過(guò)在概念上將方法代碼復(fù)制到具有Interface端口的模塊中,并對(duì)本地副本進(jìn)行綜合。這可以做到,因?yàn)榉椒ㄊ菑哪K內(nèi)調(diào)用的,執(zhí)行起來(lái)就像方法是該模塊的一部分。然而,程序代碼是從Interface內(nèi)執(zhí)行的,并影響到所有使用該Interface的模塊。Interface中的程序代碼類似于全局功能,綜合編譯器并不支持這種功能,如果有的話。
最佳實(shí)踐指南10-5 |
---|
使用函數(shù)來(lái)模擬Interface內(nèi)的功能。不要在可綜合的RTL Interface中使用初始程序、always程序或assign賦值。 |
綜合編譯器對(duì)Interface內(nèi)的程序代碼的支持并不充分。如果支持的話,不同的綜合編譯器對(duì)程序性代碼的處理方式也可能大相徑庭。
參數(shù)化的Interface
Interface可以用與模塊相同的方式使用參數(shù)重定義。這使得Interface模型可以被配置,因此Interface的每個(gè)實(shí)例可以有不同的配置。通過(guò)使用SystemVerilog的參數(shù)重定義結(jié)構(gòu),參數(shù)可以在Interface中使用,使向量大小和Interface中的其他聲明可以重新配置。當(dāng)Interface被實(shí)例化時(shí),Interface的參數(shù)值可以被重新細(xì)化,這與模塊重新定義的方式相同。
下面是簡(jiǎn)單AHB例子的變化,增加了參數(shù),使數(shù)據(jù)矢量寬度在Interface實(shí)例化時(shí)可以配置。任何與Interface實(shí)例相連的模塊間面端口將使用該Interface實(shí)例的向量大小。
例10-8:具有可配置總線數(shù)據(jù)字大小的參數(shù)化Interface
/////////////////////////////////////////////////////////// //SimpleAHBInterfacewithpareterizedbuswidths /////////////////////////////////////////////////////////// //`begin_keywords"1800-2012" interfacesimple_ahb #(parameterDWIDTH=32)//Databuswidth ( inputlogichclk,//bustransferclk inputlogichresetN//busreset,activelow ); logic[31:0]haddr;//transferstartaddress logic[DWIDTH-1:0]hwdata;//datasenttoslave logic[DWIDTH-1: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
下面的代碼片斷將例10-8中Interface的數(shù)據(jù)字大小重新定義為64位字大小。
simple_ahb#(.DWIDTH(64)) ahbl(.hclk, .hresetN );
綜合Interface
Interface是SystemVerilog在原有的Verilog HDL中加入的一個(gè)強(qiáng)大的建模結(jié)構(gòu)。Interface端口是從傳統(tǒng)的Verilog模型中抽象出來(lái)的,在傳統(tǒng)的Verilog模型中,一組相關(guān)的信號(hào)必須每次都要聲明一個(gè)信號(hào)。這些單獨(dú)的聲明必須在每個(gè)使用相關(guān)信號(hào)的模塊以及連接模塊的塊級(jí)中重復(fù)進(jìn)行。
在其最基本的形式中,SystemVerilog Interface將相關(guān)信號(hào)封裝在一起,作為一個(gè)可重復(fù)使用的建模組件。然后,該Interface可以作為模塊上的一個(gè)端口,取代一組相關(guān)信號(hào)的多個(gè)單獨(dú)端口。Interface所提供的建模抽象可以成為RTL設(shè)計(jì)工程師的強(qiáng)大工具。設(shè)計(jì)師可以一次性定義一組相關(guān)的信號(hào),作為一個(gè)Interface,然后可以多次使用這些信號(hào),而不必重復(fù)定義。
綜合編譯器能很好地處理使用Interface來(lái)封裝相關(guān)信號(hào)的問(wèn)題。設(shè)計(jì)工程師可以在更高的抽象水平上工作--具有抽象的所有優(yōu)點(diǎn)--綜合編譯器將信號(hào)的抽象封裝轉(zhuǎn)化為各個(gè)模塊的端口,工程師不需要為各個(gè)端口的聲明而煩惱,并確保多個(gè)模塊中冗余的聲明完全匹配。
綜合編譯器支持兩種方式,即在端口聲明中指定與模塊一起使用的modport,或者在模塊例化時(shí)指定modport。然而,如果一個(gè)模塊是獨(dú)立于其他模塊綜合的,則必須在端口聲明中指定modport。
當(dāng)一個(gè)模塊獨(dú)立于其他模塊進(jìn)行綜合時(shí),或者在綜合編譯器配置為保留RTL模塊層次的情況下綜合多個(gè)模塊時(shí),綜合編譯器將把一個(gè)模塊的Interface端口擴(kuò)展為modport定義中代表的各個(gè)端口。大多數(shù)綜合編譯器將使用Verilog-1995的端口聲明風(fēng)格,其中端口列表包含端口名稱和順序,而端口大小和數(shù)據(jù)類型在模塊內(nèi)部聲明,而不是在端口列表中。一個(gè)模塊可以有任意數(shù)量的Interface端口,Interface端口可以與其他端口以任意順序指定。本文中的例子將Interface端口列在前面,只是為了強(qiáng)調(diào)Interface端口的作用。
下面的代碼片斷顯示了一個(gè)主模塊可能的綜合前和綜合后的模塊定義,該模塊使用簡(jiǎn)單ahb Interface。
預(yù)綜合modport列表,有一個(gè)Interface端口。
綜合后模型,使用Verilog-1995編碼風(fēng)格。下面的綜合后例子說(shuō)明了一個(gè)Interface端口如何綜合的典型結(jié)果。
如果指定了一個(gè)modport的定義,綜合將使用modport中指定的方向。如果在模型綜合時(shí)沒(méi)有指定modport,那么在綜合的模塊中,Interface內(nèi)的所有信號(hào)都會(huì)成為雙向的inout端口。
可配置的Interface與可配置的模塊一樣,都是可綜合的。Interface可以使用參數(shù)來(lái)配置總線寬度和數(shù)據(jù)類型。Interface也可以用同樣的方式進(jìn)行配置。
Interface也可以通過(guò)使用方法(任務(wù)和函數(shù))和程序代碼來(lái)封裝與這些信號(hào)有關(guān)的功能。Interface中的函數(shù)是可以綜合的。這可能很有用,RTL設(shè)計(jì)工程師應(yīng)該利用這種綜合能力。將函數(shù)與它們所操作的信號(hào)封裝在一起,是編寫穩(wěn)健、可重復(fù)使用的代碼的最佳實(shí)踐編碼方式。
最佳實(shí)踐指南10-6 |
---|
將Interface的功能限制在可以用函數(shù)建模的范圍內(nèi)。 |
在編寫本文時(shí),現(xiàn)有的RTL綜合編譯器在支持使用Interface來(lái)封裝使用任務(wù)和程序代碼的功能方面有些局限。
例如,有可能在一個(gè)Interface內(nèi)封裝FIFO的全部功能,這將允許使用封裝信號(hào)的模塊在不同的時(shí)鐘速度下運(yùn)行而不損失任何數(shù)據(jù)。完整的糾錯(cuò)功能以及與一組信號(hào)相關(guān)的其他復(fù)雜操作也可以與這些信號(hào)捆綁在一起。這種更高級(jí)的封裝水平不被大多數(shù)綜合編譯器所支持,或只有有限的支持。這些限制限制了程序性代碼在Interface中的實(shí)用性。
Interface也可以捆綁驗(yàn)證代碼,例如為封裝的信號(hào)和功能提供斷言和自我檢查程序。Interface中的驗(yàn)證相關(guān)代碼可以被綜合編譯器使用綜合translate_off和trans1ate_on pragmas或'if def條件編譯忽略。
審核編輯:劉清
-
時(shí)鐘發(fā)生器
+關(guān)注
關(guān)注
1文章
203瀏覽量
67421 -
RTL
+關(guān)注
關(guān)注
1文章
385瀏覽量
59989 -
UVM
+關(guān)注
關(guān)注
0文章
182瀏覽量
19236 -
Verilog語(yǔ)言
+關(guān)注
關(guān)注
0文章
113瀏覽量
8310
原文標(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)推薦
SystemVerilog 的VMM驗(yàn)證方法學(xué)教程教材
[啟芯公開課] SystemVerilog for Verification
如何在SystemVerilog中為狀態(tài)機(jī)的命令序列的生成建模
數(shù)字硬件建模SystemVerilog-歸約運(yùn)算符
基于SystemVerilog語(yǔ)言的驗(yàn)證方法學(xué)介紹
![基于<b class='flag-5'>SystemVerilog</b>語(yǔ)言的驗(yàn)證<b class='flag-5'>方法</b>學(xué)介紹](https://file.elecfans.com/web2/M00/48/EB/pYYBAGKhtC2AADubAAASkqXdQg4727.jpg)
基于CPLD FPGA的數(shù)字通信系統(tǒng)建模與設(shè)計(jì)
![基于CPLD FPGA的<b class='flag-5'>數(shù)字</b>通信系統(tǒng)<b class='flag-5'>建模</b>與設(shè)計(jì)](https://file.elecfans.com/web2/M00/49/79/pYYBAGKhtFOACrzWAAAKYgfTrS0357.jpg)
SystemVerilog對(duì)硬件功能如何進(jìn)行建模
數(shù)字硬件建模SystemVerilog-網(wǎng)絡(luò)
數(shù)字硬件建模SystemVerilog-結(jié)構(gòu)體
使用Verilog/SystemVerilog硬件描述語(yǔ)言練習(xí)數(shù)字硬件設(shè)計(jì)
數(shù)字硬件建模SystemVerilog-組合邏輯建模(1)連續(xù)賦值語(yǔ)句
RTL和門級(jí)建模
![RTL和門級(jí)<b class='flag-5'>建模</b>](https://file.elecfans.com/web2/M00/8F/7C/poYBAGPkkFyAXpR5AATV5hNoNUw721.png)
數(shù)字硬件建模SystemVerilog之Interface和modport介紹
![<b class='flag-5'>數(shù)字</b><b class='flag-5'>硬件</b><b class='flag-5'>建模</b><b class='flag-5'>SystemVerilog</b><b class='flag-5'>之</b><b class='flag-5'>Interface</b>和modport介紹](https://file1.elecfans.com/web2/M00/82/61/wKgaomRLZECAXoJqAAAa8KTIoxM011.png)
SystemVerilog的覆蓋率建模方式
SystemVerilog在硬件設(shè)計(jì)部分有哪些優(yōu)勢(shì)
![<b class='flag-5'>SystemVerilog</b>在<b class='flag-5'>硬件</b>設(shè)計(jì)部分有哪些優(yōu)勢(shì)](https://file1.elecfans.com/web2/M00/A9/45/wKgaomUwoFCAH2AVAAIMtBAX5n0432.jpg)
評(píng)論