祝日なので映画を見に行く前はぐーたら過ごしている(GWずっとだけど・・・)。以前から読んでいるFPGA本を読んだり、普通の本(技術書でも何でもない)を読んだり、相変わらずな生活。Qiitaを見ていたら、Verilog HDLの波形シミュレーションがMacで出来るっぽかったので環境を構築してみた。
sudo port install iverilog
- GTKWave: http://gtkwave.sourceforge.net/
- ダウンロードして解凍したら動いた
イマイチVerilogの文法が分かっていないけど、とりあえず半加算器を書いてみた。
半加算器自体はCとSを返せば良いかつ、全部組み合わせ論理回路なので簡単。
module half_adder(input wire A, input wire B, output wire S, output wire C); assign S = A ^ B; assign C = A & B; endmodule
シミュレーションを実行するテストベンチの方は、イマイチ描き方の作法が分からなかったのでQiitaの記事を真似して書いた。基本は半加算器の信号A,B,C,Sを与えて波形出力しているけど、AとBについて動作確認するためにAとBをクロック風に与えることにした。そのためWireではなくReg宣言にしてある(これが正しいやり方なのかは知らない)。いい感じに互い違いになるように、CLK信号の2倍と4倍周期の信号をAとBに入力した。@は条件が真のときに実行される構文で、#はその分待つ構文らしいけど、待つって何だ?組み合わせ論理回路なのでそもそもCLK/RSTはいらないけどね・・・。
module top(); reg CLK, RST; reg A; reg B; wire S; wire C; half_adder ha(A, B, S, C); initial begin CLK = 0; forever #10 CLK = ~CLK; end initial begin RST = 0; #30 RST = 1; end /* give A and B */ initial begin A = 0; forever #20 A = ~A; end initial begin B = 0; forever #40 B = ~B; end initial begin #500 $finish(); end always @(posedge CLK) begin $write("[%t] A=%b B=%b C=%b S=%b\n", $time, A, B, C, S); end initial begin $dumpfile("test.vcd"); $dumpvars(0, ha); end endmodule
GTKWaveで波形を見てみるとなんとなく動いている感じ。A xor Bがそのケタの和で、両方1の場合(A and B = 1)には桁上り信号Cが1になっている。
ご飯食べたら青い鳥見に行く予定。