icarus-verilog使ってみた

シミュレーション結果が出るところまでは動いたのでまとめでも...
半加算器とテストベンチをverilogで書いてiverilogに食わせる。

#半加算器 ha.v
module ha(a,b,s,c);
            input       a,b;
            output      s,c;
            
            assign s=a^c;
            assign c=a&b;
endmodule
#半加算器haのテストベンチ ha_tb.v
`timescale 1ns/1ns
module ha_tb;
        reg     a,b;
        wire    s,c;

        ha ha_i(.a(a), .b(b), .s(s), .c(c));

        initial begin
                $dumpfile("out.vcd");
                $dumpvars(0,s);
        end

        initial begin
                        a=1'b0;
                        b=1'b0;
               #10      a=1'b1;
               #10      b=1'b1;
               #10      a=1'b0;
               #10      $finish;
        end
endmodule

書き方が綺麗なのかどうかは置いといて、iverilogで特殊なのはたぶんテストベンチの方の$dumpfileと$dumpvars。
$dumpfile(シミュレーション結果の出力ファイル)、$dumpvars(シミュレーション開始時間, シミュレーション出力信号名)と書く。
iverilogの実行は

$ iverilog -o ha.vpp -s ha_tb ha_tb.v ha.v
$ ./ha.vpp

iverilogの-oオプションで指定したファイルを実行すると$dumpfileで指定したファイルが作られる。
実行結果(out.vcd)を抜粋すると

#0
$dumpvars
0!
$end
#10
1!
#20
0!
#40

こんな感じで、ちゃんとシミュレーションはできてそう。
論理合成って本当にできるのかな...もう少し遊ぶか...