1. 程式人生 > >verilog之四位全加器的編譯及仿真(用開源免費的軟件——iverilog+GTKWave)

verilog之四位全加器的編譯及仿真(用開源免費的軟件——iverilog+GTKWave)

mage test anti ria inb timescale 向上 技術分享 完成

verilog之四位全加器的編譯及仿真(用開源免費的軟件——iverilog+GTKWave)

四位全加器的verilog的代碼比比皆是,這裏上一個比較簡單的:

技術分享圖片
/*
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文件如下:

技術分享圖片
/*
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的編譯和查看仿真波形”的博文裏去看看吧。。這裏就不多說了。

技術分享圖片
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的截圖:

圖一:

技術分享圖片

圖二:

技術分享圖片

我想說就一般的練習,iverilog+GTKWave足以應付,感謝網上的牛人們!!

轉載:https://www.cnblogs.com/CodeWorkerLiMing/archive/2012/04/18/2455945.html

verilog之四位全加器的編譯及仿真(用開源免費的軟件——iverilog+GTKWave)