taki["blog"] = "200 OK"

社会人3年目の日常

2018/5/5 子

祝日なので映画を見に行く前はぐーたら過ごしている(GWずっとだけど・・・)。以前から読んでいるFPGA本を読んだり、普通の本(技術書でも何でもない)を読んだり、相変わらずな生活。Qiitaを見ていたら、Verilog HDLの波形シミュレーションがMacで出来るっぽかったので環境を構築してみた。

sudo port install iverilog

f:id:takilog:20180505102124p:plain

イマイチ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になっている。

f:id:takilog:20180505113835p:plain

ご飯食べたら青い鳥見に行く予定。