我的 FPGA 學習歷程(16)—— 區分可綜合和不可綜合的 Verilog 語法以及 Modelsim 獨立使用方法


Verilog語言的可綜合語法與不可綜合語法

Verilog HDL 大致可以分為一下幾個標准:Verilog-95,Verilog-2001 和 SystemVerilog。隨着標准版本的升級,新版本中的關鍵字越來越多,然而增加的關鍵字主要是驗證這個方向的。Verilog 標准實際包括了兩個部分,邏輯綜合和驗證,而綜合有時驗證的一個子集。以計數器作為一個簡單的例子來闡述驗證與綜合:

下面是一個計數器,4 位計數器,編寫代碼推薦是微軟的 Visual Studio Code,也可以是如何支持語法高亮的編輯器,不要用 Modelsim 自帶的編輯器,因為真的是十分難用啊😔:

“ q + 1;”這一句的綜合結果如下:

可以看到 q + 1 被綜合成了一個 4 位的組合邏輯加法器,在加法器的右側 OUT[3:0] 總是等於 A[3:0] + 1'b1 ( 圖中的B[3:0] 是個參數 4'h1)

第二部分,always 語句和 q <= q + 1 即 q 鎖存 q + 1 的值,RTL 圖如下:

可以看到 q[0]~reg[3..0] 這個 4 位觸發器生成以下邏輯,觸發器的 D 端口等於前面的 OUT[3:0],每當時鍾的上升沿觸發器的 Q端鎖存並輸出 OUT[3:0], 觸發器工作還有兩個前提:一是使能信號 en 為高電平,二是復位信號 rst_n 為 高電平。

完整的 RTL 圖如下:

它基本的滿足了我們的需求,當 復位信號 rst_n 為低電平有效時,q 輸出 4'h0,其他情況下如果 en = 0,q 永遠是上一次鎖存 OUT[3:0],有且僅有 en = 1而且 clk 處於上升沿,觸發器就會觸發,鎖存當前時間的 OUT[3:0]。

  這個電路存在一個小問題,如果 clk 的上升沿到來同時 en 為高電平,同時 復位信號有效,那么輸出到底是新的 OUT[3:0] 還是 4'h0,這種情況叫做競爭條件。硬件不同於軟件,硬件是並行執行的門電路,軟件是順序執行的。在高速信號設計中競爭必須考慮而且小心的處理,這里不再深究。所以叫做基本滿足需求(⊙﹏⊙)

首先准備好文件,如下:

這里單獨使用 Modelsim,不再使用 Quartus 來調用 Modelsim,第一步是新建一個 Modelsim 工程,如下:

接下來我們編寫測試腳本,用仿真來驗證我們的設計,下面是一段簡單的仿真代碼,也叫測試平台:

這個文件命名為 cnt4bit_test.vt,vt 是測試腳本的后綴,同樣放在剛才的 modelsim 工程目錄下,按如下步驟添加項目到工程中:

編譯工程,Modelsim 實際上將 verilog 和 verilog testbench 編譯為 x86 匯編在 PC 機上運行,速度也十分的快。

仿真結果如下:

總結一下:Verilog 語法包含很多驗證關鍵字,比如 #20、initial、forever 等等等等。不可綜合的語法被發明出來是幫助解決驗證上一些的問題,雖然用起來十分的方便但是卻並不是真正可用的電路結構。雖然仿真器會給出理想的波形,但是具體到 Quartus 的綜合器處理方式就是完全會無視任何的 #20 之類的語法。在硬件綜合器里,這兩個電路完全一樣:

綜合結果:

總之不要試圖使用軟件思維來學習 Verilog,更不能把不能綜合的語法誤認為一種更方便建模技巧。。。嗯~ o( ̄▽ ̄)o


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM