我們認識了數位電路設計的組合電路、循序電路,也學習了 Verilog 的語法和實際練習撰寫 Verilog 的程式碼。學習他們的最終目標到底是什麼?就是設計出 IC 裡面的電路嘛!
在繼續之前,我必須丟出一顆震撼彈:不是所有的 Verilog 程式碼都可以被合成成硬體電路。合成的英文是 Synthesis ,意思是將程式碼轉換成硬體電路,如果程式碼可以被合成為電路,則我們會稱它為 Synthesizable Code 。
你可能會好奇,不能被合成為電路的程式碼,存在的意義是什麼? Verilog 除了用於設計電路,還包含驗證電路,就是 Testbench 啦!Testbench 相對來說,需要使用的軟體設計思維還是比較高的。
在 Testbench 中,我們會使用到如 #3
, initial
等關鍵字,其實他們都不是 Synthesizable 的。可以想看看如果一個電路終其一生只被執行過一次,他的意義在哪裡?因此 initial
是不可以被合成為電路的。那麼延遲呢?#n
的出現是為了「模擬」電路在實際狀況中的延遲,我們沒有理由讓 #n
合成為的電路。
另外,Verilog 中使用迴圈也是很常見的!舉例來說:
always@* begin
for (integer i=0; i<k; i=i+1)
// some code
end
但是迴圈需要特別注意 k
是變數還是常數?如果 k
不為常數,這組程式碼是不能被合成為電路的 (Unsynthesizable) 。可以試著思考看看,電路是一旦做出來之後,就不會再新增或減少的,如果 k
是變數,也許電路在執行的過程中,會要求增減一組加法器電路,怎麼想都不合理對吧!因此如果電路需要被合成, k
必須為常數。