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