【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】
在前面的一篇部落格中,我們說到可以使用modelsim對verilog進行測試和模擬。事實上,還有很多開源的工具可以使用,比如說iverilog+gtkwave,大家如果有興趣,可以在網上尋找相關的內容。現在的晶片設計越來越複雜,如果按照基本的門電路設計,那麼效率是非常低的。恰當地使用硬體描述語言,可以有效地提高我們工作效率。同時,如果深入瞭解了verilog,對於我們瞭解晶片的設計流程也非常有益。在購物網站上,有這麼一本書,書名為《電腦原理與設計-Verilog HDL版》,它從另外一個角度幫我們描述了電腦到底是怎麼一回事,個人感覺內容非常好,也非常實在。
當然,回到今天的內容。有過軟體開發經驗的朋友都知道,我們編寫代碼的時候經常需要編寫測試案例對代碼功能進行測試。其實編寫verilog代碼也是一樣的。最簡單的verilog代碼也需要兩部分的內容,一部分就是實現模組功能,另外一部分就是實現testbench功能,也就是測試我們設計的模組是否滿足需求。verilog代碼和C語言很相似,大家不需要有什麼顧慮。首先,我們還是看看verilog module的代碼內容,
module add(a, b, c); input a; input b; output c; assign c = a & b;endmodule
工科的同學都學過數字電路,一般來說數字電路包括邏輯電路和時序電路。上面的代碼實現就是一個最簡單的邏輯功能,也就是與功能。其中a、b為輸入訊號,c為輸出訊號。那麼testbench代碼是什麼樣的呢?我們接著看,
`timescale 1ns/1nsmodule add_t; reg a; reg b; wire c; add t(a,b,c); initial begin #10 a = 1; b = 0; #10 a = 0; b = 1; #10 a = 0; b = 0; #10 a = 1; b = 1; #50 $finish; end initial $monitor("a = %d, ", a, " b = %d, ", b, "c = %d\n", c);endmodule
從代碼中,大家可以看到initial的內容,也可以看到add的內容。add模組表示當前實現了一個add執行個體,名稱為t。initial模組中的內容是測試內容,從10ns開始,a為高電平、b為低電平;再過10ns,a為低電平、b為高電平;依次類推,直到訊號finish為止。在每一次訊號翻轉的時候,我們都會利用monitor列印相關資料資訊。當然,這些都是一些代碼的內容,大家可以在modelsim實踐一下,看一下wave或者是dataflow,會有更多的收穫。