HDL(ハードウェア記述言語)の一種、Verilog HDLの進化系?サブセット?
VHDLとは別物
- そもそもVerilogとの違いは?
- データ型:enum・多次元配列など
- .* で同じ名前のものを勝手に繋いでくれる
always_ffなど
わかりやすい記事とかはこのあたり
- Verilog - HLDL 簡易文法書
- 初めての System Verilog
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はプログラミング言語のブロック
{}と同等
- begin~endはプログラミング言語のブロック
always_ff <条件>と書くと、条件が満たされた際に実行される- Verilog HDLは
alwaysだった? @(posedge in1)や@(negedge in2)など- posedgeは信号の立ち上がり、negedgeは逆(
[positive/negative] edgeというわけ)
- Verilog HDLは
- assignは見ての通り
- 正直よくわかってない
- outputがwireだと直接書き換えられないっぽいので、regを生やしてassignし、regの方を変更する
- 代入文はブロッキング代入
=とノンブロッキング代入<=- Verilog HDL 文法 ブロッキングとノンブロッキングの論理合成の違い
- ブロッキング代入はシーケンシャルで、逐一処理が行われる つまり順番が大事
- ノンブロッキング代入は正反対
always_combでは=を、always_ffでは<=を使うと良い
実際に書いてみたものがこちら(幅8bit、深さ1024段のFIFO seccamp2022課題)