數(shù)字硬件建模SystemVerilog(三)-仿真
數(shù)字仿真是一種軟件程序,它將邏輯值變化(稱為激勵(lì))應(yīng)用于數(shù)字電路模型的輸入,以實(shí)際硅傳播這些邏輯值變化的相同方式通過模型傳播該激勵(lì),并提供觀察和驗(yàn)證該激勵(lì)結(jié)果的機(jī)制。
SystemVerilog是一種使用0和1的數(shù)字仿真語言。該語言不表示仿真電壓、電容和電阻。SystemVerilog提供的編程結(jié)構(gòu),用于對(duì)數(shù)字電路建模、對(duì)激勵(lì)發(fā)生器建模以及對(duì)驗(yàn)證檢查器建模。
示例1.4說明了一個(gè)可以仿真的簡(jiǎn)單數(shù)字電路模型。這與前面示例1.3所示的電路相同。
示例1-4:帶有輸入和輸出端口的設(shè)計(jì)模型(32位加法器/減法器)在本例中,請(qǐng)注意模型具有輸入端口和輸出端口。為了仿真該模型,必須提供將邏輯值應(yīng)用于輸入端口的激勵(lì),并且必須提供響應(yīng)檢查器以觀察輸出端口。
使用testbench封裝激勵(lì)生成和響應(yīng)驗(yàn)證。在SystemVerilog中有許多方法可以對(duì)測(cè)試臺(tái)進(jìn)行建模,測(cè)試臺(tái)中的代碼可以是簡(jiǎn)單的編程語句,也可以是復(fù)雜的面向?qū)ο?、事?wù)級(jí)編程,示例1-5說明了32位加法器/減法器設(shè)計(jì)的簡(jiǎn)單testbench。
示例1-5:32位加法器/減法器模型的testbench例1-5中的主要代碼塊是一個(gè)初始化過程,它是一種過程塊,過程塊包含編程語句和時(shí)序信息,用于指示仿真器做什么以及什么時(shí)候做。SystemVerilog有兩種主要類型的程序塊:initial procedures and always procedures。
初始過程是用關(guān)鍵字initial定義的。初始過程,不管其名稱如何,都不用于初始化設(shè)計(jì)。相反,初始過程只執(zhí)行一次編程語句。當(dāng)?shù)竭_(dá)最后一條語句時(shí),對(duì)于給定的仿真運(yùn)行,不會(huì)再次執(zhí)行初始過程。初始過程不可綜合,也不用于RTL建模。本系列著重于編寫用于仿真和合成的RTL模型,因此不再深入討論初始過程。
Always過程是用關(guān)鍵字always、always_comb、always_ff和always_latch定義的,Always過程是一個(gè)無限循環(huán),當(dāng)過程完成過程中最后一條語句的執(zhí)行時(shí),過程自動(dòng)返回到開頭,并再次啟動(dòng)過程。對(duì)于RTL建模,Always程序必須以靈敏度列表開始;例如示例1-4)中所示的@(posedge clk)定義。后面將更詳細(xì)地討論各種形式的always程序。
過程塊可以包含一條語句,也可以包含一組語句。過程塊中的多個(gè)語句在關(guān)鍵字begin和end之間分組(驗(yàn)證代碼還可以在關(guān)鍵字fork和join、join_any或join_none之間分組語句)。begin和end之間的語句按其列出的順序執(zhí)行,即:從第一條語句開始,到最后一條語句結(jié)束。
示例1-5中的初始過程包含一個(gè)重復(fù)循環(huán)。這個(gè)循環(huán)被定義為執(zhí)行10次。循環(huán)的每個(gè)過程:
- l、 延遲到c1k信號(hào)的下降沿。
-
- 為設(shè)計(jì)的a、b和mode輸入生成隨機(jī)值。
-
- 延遲到clk的下一個(gè)下降沿,然后調(diào)用檢查結(jié)果任務(wù)(子例程)以驗(yàn)證設(shè)計(jì)輸出是否與計(jì)算的預(yù)期結(jié)果匹配。
該設(shè)計(jì)在其時(shí)鐘輸入的上升沿工作。測(cè)試臺(tái)使用同一時(shí)鐘的相對(duì)邊緣,以避免在設(shè)計(jì)使用的時(shí)鐘邊緣上驅(qū)動(dòng)輸入和讀取設(shè)計(jì)的輸出。如果測(cè)試臺(tái)在時(shí)鐘的下降沿驅(qū)動(dòng)值,則在設(shè)計(jì)使用輸入之前,這些輸入的穩(wěn)定設(shè)置時(shí)間為零。同樣,如果測(cè)試臺(tái)在時(shí)鐘的下降沿驗(yàn)證設(shè)計(jì)結(jié)果,那么這些設(shè)計(jì)輸出穩(wěn)定的時(shí)間將為零。
在同一時(shí)刻修改和讀取值被稱為simulation競(jìng)爭(zhēng)條件。使用設(shè)計(jì)時(shí)鐘的相對(duì)邊緣來驅(qū)動(dòng)激勵(lì)是測(cè)試臺(tái)避免設(shè)計(jì)仿真競(jìng)爭(zhēng)條件的一種簡(jiǎn)單方法,例如滿足設(shè)計(jì)設(shè)置和保持時(shí)間要求。
測(cè)試臺(tái)被建模為具有輸入和輸出端口的模塊,類似于正在驗(yàn)證的設(shè)計(jì)。最后一步是將測(cè)試臺(tái)端口連接到設(shè)計(jì)端口,并生成時(shí)鐘。這是在頂級(jí)模塊中完成的。示例1-6顯示了這方面的代碼。
示例1-6:將測(cè)試臺(tái)連接到設(shè)計(jì)的頂層模塊# 系統(tǒng)Verilog仿真器
所有SystemVerilog仿真器都有很多共同點(diǎn),這對(duì)于理解如何編寫能夠正確仿真的SystemVerilog RTL模型至關(guān)重要。這些功能包括:編譯、精化、仿真時(shí)間和仿真事件調(diào)度(compilation elaboration simulation time and simulation event scheduling),下面將討論仿真的這些方面。
編譯和精化Compilation and elaboration
SystemVerilog源代碼需要編譯和詳細(xì)說明才能進(jìn)行仿真。編譯包括根據(jù)IEEE SystemVerilog標(biāo)準(zhǔn)中定義的規(guī)則檢查SystemVerilog源代碼,以確保其語法和語義正確。精化將構(gòu)成設(shè)計(jì)和測(cè)試臺(tái)的模塊和組件綁定在一起。精化還解析可配置代碼,例如常量的最終值、向量大小和仿真時(shí)間縮放。
IEEE SystemVerilog標(biāo)準(zhǔn)沒有定義精確的編譯和精化過程。標(biāo)準(zhǔn)允許每個(gè)仿真器供應(yīng)商以供應(yīng)商認(rèn)為最適合該產(chǎn)品的方式定義該過程以及編譯和精化之間的劃分。一些仿真器將編譯和精化過程作為單個(gè)步驟進(jìn)行組合,而其他仿真器將這些過程劃分為單獨(dú)的步驟。一些仿真器可能在編譯階段捕獲源代碼中某些類型的錯(cuò)誤,而其他仿真器在精化階段捕獲這些錯(cuò)誤。這些差異不會(huì)影響本系列中討論的RTL編碼風(fēng)格和指南,但了解所使用的仿真器如何處理RTL源代碼的編譯和精化是有幫助的。請(qǐng)參閱特定仿真器的文檔,了解該產(chǎn)品如何處理編譯和精化。
源代碼順序
SystemVerilog語言,與大多數(shù)語言一樣;如果不是所有編程語言在源代碼順序上都有一定的依賴關(guān)系,那么在引用這些定義之前,必須編譯用戶定義的類型聲明和聲明包。用戶定義的類型聲明和包通常與使用聲明的RTL代碼位于不同的文件中。這意味著設(shè)計(jì)者必須注意這些文件是按正確的順序編譯的,因此聲明是common的,在被引用之前堆積起來.
并非所有聲明都是順序相關(guān)的,例如,SystemVerilog允許在編譯模塊之前引用模塊名稱。在模塊內(nèi),任務(wù)和函數(shù)可以在定義之前調(diào)用,只要定義在模塊內(nèi)。
全局聲明和$unit聲明空間
SystemVerilog允許在名為unit中的聲明可以由多個(gè)文件共享,全局聲明依賴于編譯順序,必須在引用之前編譯,全局unit添加定義,這可能會(huì)導(dǎo)致隨意的全局定義,從而難以確保在引用定義之前對(duì)其進(jìn)行編譯.
SystemVerilog編譯器指令,如“定義文本宏和”時(shí)間刻度時(shí)間縮放,也屬于$unit space,全局聲明必須在受指令影響的代碼之前編譯。
最佳做法準(zhǔn)則1-1
將包用于全局聲明,而不是$unit聲明空間。
單文件和多文件編譯
當(dāng)涉及多個(gè)文件時(shí),IEEE SystemVerilog標(biāo)準(zhǔn)定義了兩種編譯/精化范例的規(guī)則:多文件編譯和單文件編譯。
多文件編譯范例允許同時(shí)編譯多個(gè)源代碼文件。一個(gè)文件中的全局聲明和編譯器指令對(duì)于在聲明和指令之后編譯的其他文件中的源代碼是可見的。
單文件編譯范例允許獨(dú)立編譯每個(gè)文件。一個(gè)文件中的任何全局聲明或編譯器指令僅在該文件中可見。無論文件的編譯順序如何,其他文件都不會(huì)看到這些聲明或指令。
所有仿真器和合成編譯器都支持多文件范例,但并非所有工具都支持單文件編譯,但是,默認(rèn)情況下,支持兩種范例的工具不一定使用相同的范例。默認(rèn)情況下,某些工具使用單文件編譯,多文件編譯需要特定于工具的調(diào)用選項(xiàng)。默認(rèn)情況下,其他工具使用多文件編譯,并且需要調(diào)用選項(xiàng)進(jìn)行單文件編譯或增量重新編譯。
關(guān)于仿真或者驗(yàn)證方面,還有很多很多內(nèi)容,但是不是本系列重點(diǎn),所以這里推薦《systemverilog驗(yàn)證》了解更多關(guān)于SV的仿真和驗(yàn)證知識(shí)。
-
數(shù)字電路
+關(guān)注
關(guān)注
193文章
1630瀏覽量
80859 -
模型
+關(guān)注
關(guān)注
1文章
3351瀏覽量
49277 -
數(shù)字仿真
+關(guān)注
關(guān)注
0文章
17瀏覽量
8104
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
使用ADS和VSA(89600)進(jìn)行數(shù)字仿真錯(cuò)誤怎么辦?
什么是全數(shù)字仿真平臺(tái)
什么是全數(shù)字仿真平臺(tái)
使用Pulseview***數(shù)字設(shè)計(jì)仿真協(xié)議解碼
高精度游移方位捷聯(lián)慣導(dǎo)系統(tǒng)的數(shù)字仿真
基于LabVIEW的數(shù)字仿真實(shí)驗(yàn)平臺(tái)的設(shè)計(jì)
基于實(shí)時(shí)數(shù)字仿真的保護(hù)校驗(yàn)與評(píng)估系統(tǒng)
![基于實(shí)時(shí)<b class='flag-5'>數(shù)字</b><b class='flag-5'>仿真</b>的保護(hù)校驗(yàn)與評(píng)估系統(tǒng)](https://file.elecfans.com/web2/M00/49/03/pYYBAGKhtDOATHJxAAAJJum0OQk703.jpg)
異步電動(dòng)機(jī)直接轉(zhuǎn)矩控制及其數(shù)字仿真
異步電動(dòng)機(jī)直接轉(zhuǎn)矩控制及其數(shù)字仿真(本科畢業(yè)設(shè)計(jì))
簡(jiǎn)單數(shù)字鐘仿真電路圖大全(五款數(shù)字鐘仿真電路圖)
![簡(jiǎn)單<b class='flag-5'>數(shù)字</b>鐘<b class='flag-5'>仿真</b>電路圖大全(五款<b class='flag-5'>數(shù)字</b>鐘<b class='flag-5'>仿真</b>電路圖)](https://file.elecfans.com/web1/M00/45/63/o4YBAFpqmmWAdBZ_AAAqLFUutqw478.jpg)
HLA雷達(dá)對(duì)抗數(shù)字仿真系統(tǒng)的應(yīng)用
![HLA雷達(dá)對(duì)抗<b class='flag-5'>數(shù)字</b><b class='flag-5'>仿真</b>系統(tǒng)的應(yīng)用](https://file.elecfans.com/web1/M00/4F/7B/pIYBAFrdOAqAGVZyAAB_74SAyJE629.png)
MATLAB教程之控制系統(tǒng)數(shù)字仿真的實(shí)現(xiàn)詳細(xì)資料說明
![MATLAB教程之控制系統(tǒng)<b class='flag-5'>數(shù)字</b><b class='flag-5'>仿真</b>的實(shí)現(xiàn)詳細(xì)資料說明](https://file.elecfans.com/web1/M00/9E/5F/o4YBAF05bvCAV_hBAAXXzEpywi0034.png)
8X8LED點(diǎn)陣屏顯示數(shù)字的仿真電路圖免費(fèi)下載
![8X8LED點(diǎn)陣屏顯示<b class='flag-5'>數(shù)字</b>的<b class='flag-5'>仿真</b>電路圖免費(fèi)下載](https://file.elecfans.com/web1/M00/B2/80/o4YBAF4S0XqAZY2MAAOM8YzvKGE484.png)
評(píng)論