読者です 読者をやめる 読者になる 読者になる

Verilog環境の構築

ハードウェア実習と論理設計演習でVerilogを習ったので、自習できるように自宅に環境を構築しておこうと思います。

Verilogとは?

Verilog(ヴェリログ)は、デジタル回路の設計用の論理シミュレータであり、そこで使用するハードウェア記述言語でもある。

(Wikipediaより)
僕の学科では、論理設計演習と、ハードウェア実習で使用します。

インストールする

Ubuntu 11.10の場合を想定しています。

$sudo aptitude install iverilog

なんか書いてみる

とりあえず、授業で最初にやった、2進カウンタを書いてみましょうか。

upcount.v

module upcount(clock,reset_N,count);
    input clock;
    input reset_N;
    output [1:0] count;
    reg [1:0] count;

    always @(posedge clock or negedge reset_N)begin
        if(reset_N==0)begin
            count<=2'b00;
            end else begin
            count<=count+2'b01;
        end
    end

endmodule

上記の回路を動かすためのテストプログラムを書きます。

upcount_test.v

module UPCOUNT_TEST;

reg clock;
reg reset_N;
wire [1:0] out;

upcount test(clock,reset_N,out);
    initial begin
        $dumpfile("upcount.vcd");
    $dumpvars(0,UPCOUNT_TEST);
    $monitor("%t: clock = %b,reset_N = %b, out = %b",$time,clock,reset_N,out);
        clock=0 reset_N=0;
        #10 clock=1;
        #10 clock=0;
        reset_N=1;
        #10 clock=1;
        #10 clock=0;
        #10 clock=1;
        #10 clock=0;
        #10 clock=1;
        #10 clock=0;
        #10 clock=1;
        #10 clock=0;
        #10 clock=1;
        #10 clock=0;
        #10 clock=1;
        #10 clock=0;
        #10 clock=1;
        #10 clock=0;
        reset_N=0;
        #10 clock=1;
        #10 clock=0;
        #10 clock=1;
        #10 clock=0;
        #10 $finish;
    end
endmodule

シミュレーションしてみる

$iverilog upcount.v upcount_test.v
$vvp ./a.out

すると、実行結果が以下のように表示されるはずです。

VCD info: dumpfile upcount.vcd opened for output.
    0: clock = 0,reset_N = 0, out = 00
    10: clock = 1,reset_N = 0, out = 00
    20: clock = 0,reset_N = 1, out = 00
    30: clock = 1,reset_N = 1, out = 01
    40: clock = 0,reset_N = 1, out = 01
    50: clock = 1,reset_N = 1, out = 10
    60: clock = 0,reset_N = 1, out = 10
    70: clock = 1,reset_N = 1, out = 11
    80: clock = 0,reset_N = 1, out = 11
    90: clock = 1,reset_N = 1, out = 00
    100: clock = 0,reset_N = 1, out = 00
    110: clock = 1,reset_N = 1, out = 01
    120: clock = 0,reset_N = 1, out = 01
    130: clock = 1,reset_N = 1, out = 10
    140: clock = 0,reset_N = 1, out = 10
    150: clock = 1,reset_N = 1, out = 11
    160: clock = 0,reset_N = 0, out = 00
    170: clock = 1,reset_N = 0, out = 00
    180: clock = 0,reset_N = 0, out = 00
    190: clock = 1,reset_N = 0, out = 00
    200: clock = 0,reset_N = 0, out = 00

また、同時にupcount.vcdというシミュレーション結果を格納したファイルも生成されます。

波形ビューアを使ってみる

とりあえずインストール
$sudo aptitude install gtkwave
起動
$gtkwave upcount.vcd

起動したら、UPCOUNT_TESTと書いてあるところをクリックし、下に信号の一覧が表示されるので、各信号を選択し、appendボタンを押します。
すると、以下のように信号が時系列でグラフィカルに表示され、回路の動作が一目でわかります。
f:id:kuro_m88:20120416235811p:image