四位全加器的verilog的代碼比比皆是,這裏上一個比較簡單的:html
/* 4位全加器全加器須要有輸入輸出,須要有下級向上進位的輸入, 須要有向上一位進位的輸出。你們看一下,這個模塊已經包含所有的輸入輸出信息。 你們都知道,N位加法器得出來的出來的和最可能是N+1位 所以能夠清晰從下面代碼中看到相關信息。 而後assign用的是阻塞賦值。相加即知足相關的需求。 */ module adder4(cout,sum,ina,inb,cin); output[3:0] sum; output cout; input[3:0] ina,inb; input cin; assign {cout,sum}=ina+inb+cin; endmodule
在寫testbeach文件以前,先普及一點testbeach的知識:
通常來說,在數據類型聲明時,和被測模塊的輸入端口相連的信號定義爲reg類型,這樣便於在initial語句和always語句塊中對其進行賦值;和被測模塊輸出端口相連的信號定義爲wire類型,便於進行檢測。Testbench模塊最重要的的任務就是利用各類合法的語句,產生適當的時序和數據,以完成測試,並達到覆蓋率要求。
那麼testbeach文件以下:windows
/* File Name : test_adder4.v Description : The testbench of the adder_4.v Written By : LiMing Data : 2011/04/18 20:13 modefied : 在仿真的時候,把延時從10ns改成5ns : cout顯示爲2位 */ //test_adder4 (top-level module) `timescale 1ns/1ns module test_adder4; //Declare variables wire[3:0] sum; wire cout; reg[3:0] ina,inb; reg cin; //Instantiate the module adder4 adder4 adder4_1(cout,sum,ina,inb,cin); //Stimulate the inputs, Finish the stimulation at 90 time units initial begin #0 ina = 4'b0001; inb = 4'b1010; cin = 1'b0; #5 ina = 4'b0010; inb = 4'b1010; cin = 1'b1; #5 ina = 4'b0010; inb = 4'b1110; cin = 1'b0; #5 ina = 4'b0011; inb = 4'b1100; cin = 1'b1; #5 ina = 4'b0111; inb = 4'b1001; cin = 1'b0; #5 ina = 4'b0001; inb = 4'b1100; cin = 1'b1; #5 ina = 4'b0011; inb = 4'b1100; cin = 1'b0; #5 ina = 4'b0111; inb = 4'b1111; cin = 1'b1; #5 $finish; end initial $monitor("At time %t, ina(%b) + inb(%b) + cin(%b) = sum(%b)(%2d),cout(%b)",$time, ina, inb, cin, sum, sum, cout); initial begin $dumpfile("test.vcd"); $dumpvars(0,test_adder4); end endmodule
因爲是在windows的cmd下進行命令行的運行,因此有時候每次輸入一個命令顯得很費時間,因此我這裏又寫了一個(批處理文件)bat文件:go.bat工具
ECHO OFF ECHO ********************************* ECHO * Batch file ECHO ********************************* ECHO * ECHO ON iverilog -o test adder4.v test_adder4.v vvp -n test -lxt2 cp test.vcd test.lxt gtkwave test.lxt
(說明一下,我在windows下安裝了gnuwin的軟件,即能在windows下用gnu的一些小的實用的工具!)哈哈,這裏就能夠一鍵運行了,上面的一些命令的解釋能夠到個人「wndows下如何用Iverilog+GTKWave進行verilog的編譯和查看仿真波形」的博文裏去看看吧。。這裏就很少說了。post
G:\Verilog HDL\examples\Verilog135\01>go.bat G:\Verilog HDL\examples\Verilog135\01>ECHO OFF ********************************* * Batch file ********************************* * G:\Verilog HDL\examples\Verilog135\01>iverilog -o test adder4.v test_adder4.v G:\Verilog HDL\examples\Verilog135\01>vvp -n test -lxt2 LXT2 info: dumpfile test.vcd opened for output. At time 0, ina(0001) + inb(1010) + cin(0) = sum(1011)(11),cout(0) At time 5, ina(0010) + inb(1010) + cin(1) = sum(1101)(13),cout(0) At time 10, ina(0010) + inb(1110) + cin(0) = sum(0000)( 0),cout(1) At time 15, ina(0011) + inb(1100) + cin(1) = sum(0000)( 0),cout(1) At time 20, ina(0111) + inb(1001) + cin(0) = sum(0000)( 0),cout(1) At time 25, ina(0001) + inb(1100) + cin(1) = sum(1110)(14),cout(0) At time 30, ina(0011) + inb(1100) + cin(0) = sum(1111)(15),cout(0) At time 35, ina(0111) + inb(1111) + cin(1) = sum(0111)( 7),cout(1) G:\Verilog HDL\examples\Verilog135\01>cp test.vcd test.lxt G:\Verilog HDL\examples\Verilog135\01>gtkwave test.lxt
note:在monitor裏面的(%2d)就是輸出位寬爲2的十進制數。其餘同理哦!~~~測試
記下來來幾張GTKWave的截圖:url
圖一:spa
圖二:命令行
我想說就通常的練習,iverilog+GTKWave足以應付,感謝網上的牛人們!!code
轉載:https://www.cnblogs.com/CodeWorkerLiMing/archive/2012/04/18/2455945.htmlhtm