個人 FPGA 學習歷程(16)—— 區分可綜合和不可綜合的 Verilog 語法

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 圖以下:3d

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

完整的 RTL 圖以下:blog

它基本的知足了咱們的需求,當 復位信號 rst_n 爲低電平有效時,q 輸出 4'h0,其餘狀況下若是 en = 0,q 永遠是上一次鎖存 OUT[3:0],有且僅有 en = 1並且 clk 處於上升沿,觸發器就會觸發,鎖存當前時間的 OUT[3:0]。it

這個電路存在一個小問題,若是 clk 的上升沿到來同時 en 爲高電平,同時 復位信號有效,那麼輸出究竟是新的 OUT[3:0] 仍是 4'h0,這種狀況叫作競爭條件。硬件不一樣於軟件,硬件是並行執行的門電路,軟件是順序執行的。在高速信號設計中競爭必須考慮並且當心的處理,這裏再也不深究。因此叫作基本知足需求(⊙﹏⊙)

首先準備好文件,以下:io

這裏單獨使用 Modelsim,再也不使用 Quartus 來調用 Modelsim,第一步是新建一個 Modelsim 工程,以下:編譯

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

這個文件命名爲 cnt4bit_test.vt,vt 是測試腳本的後綴,一樣放在剛纔的 modelsim 工程目錄下,按以下步驟添加項目到工程中:

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

仿真結果以下:

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

綜合結果:

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