HDL(ハードウェア記述言語)の一種、Verilog HDLの進化系?サブセット?
VHDLとは別物

module test(output wire out);
  reg in1;
  reg in2;
 
  assign out = in1 & ~in2;
 
  initial begin
    $monitor($time,,
      "in1: %b | in2: %b | out: %b",
      in1, in2, out
    );
    #10; in1=0; in2=0;
    #10; in1=0; in2=0;
    #10; in1=0; in2=1;
    #10; in1=1; in2=0;
    #10; in1=1; in2=1;
    #10; $finish;
  end
endmodule
  • C言語で言うprintfは$display
    • これを$monitorにすると、引数に渡した値が変わるごとに更新される
  • 変数(?)はreg・wire・logicの3種類がある
    • Verilog HDLの名残で、SystemVerilogだと全部logicで良いらしい
  • initialの中身は一番最初に一回だけ実行される
    • begin~endはプログラミング言語のブロック{}と同等
  • always_ff <条件> と書くと、条件が満たされた際に実行される
    • Verilog HDLは always だった?
    • @(posedge in1)@(negedge in2) など
    • posedgeは信号の立ち上がり、negedgeは逆([positive/negative] edge というわけ)
  • assignは見ての通り
    • 正直よくわかってない
    • outputがwireだと直接書き換えられないっぽいので、regを生やしてassignし、regの方を変更する
  • 代入文はブロッキング代入 = とノンブロッキング代入 <=

実際に書いてみたものがこちら(幅8bit、深さ1024段のFIFO seccamp2022課題)