Verilogエッセンシャル:簡潔な概要
すべての振る舞いコードは module と endmodule の内側に書きます。作成したいデジタル設計が何であれ、module ブロックの中に入ります。ポートを定義しても、しなくてもよく、信号をブロックに入れる input や、ブロックから出す output を許可します。
モジュール
以下の空のモジュールは testbench と呼ばれます。英数字と '_' を含むなら何でも命名可能です。
module testbench;
endmodule
別のモジュールを見てみましょう。いくつかの信号(d, clk, rstb)が入力として、q が出力として宣言されています。
module dff (input d, clk, rstb, output q);
endmodule
データ型
モジュールの見た目が分かったところで、モジュールの中に何を入れられるか、テストベンチモジュールを見ながら確認しましょう。Verilogには主に2つのデータ型があります:
- reg
- wire
reg データ型は変数のように値を保持するために使われ、wire は電気ワイヤと同様、継続的に駆動されなければなりません。したがって通常、wire は複数モジュール間の接続や他の信号に使われます。
module testbench;
reg d;
reg rst_b;
reg clk;
wire q;
endmodule
代入
Verilogには3つの基本ブロックがあります:
always @ (condition) | 条件が満たされるたびに常に実行 |
initial | シミュレーション開始時に1回だけ実行 |
assign [LHS] = [RHS] | RHSが変化するたびにLHSの値を更新 |
Verilogを書くときのいくつかのルール:
regにはinitialとalwaysブロックでのみ代入可能wireにはassign文でのみ値を代入可能- initial/always ブロックに複数文がある場合、
begin .. endで囲む必要あり
module testbench;
reg d;
reg rst_b;
reg clk;
wire q;
initial begin
d = 0;
rst_b = 0;
clk = 0;
#100 $finish;
end
always begin
#10 clk = ~clk;
end
endmodule
上記例から以下に注意:
initialブロックに複数行あるため begin と end を使用- 信号
d,rst_b,clkはreg型なので initialブロック内で代入 - initialブロック内のコードは0ns、すなわちシミュレーション開始時に実行
alwaysブロックに条件がないため、C言語の無限ループのように実行- # は時間遅延を表す。#10でシミュレーション時間を10単位進める
clk = ~clk;でクロック値を反転、#10 が前にあるため10時間単位ごとにトグル$finishはシミュレーション終了方法。この場合100時間単位で実行して終了
Verilog
- Verilogマスター:デジタル回路設計のための完全チュートリアル
- Verilog連結マスター:実践ガイド
- Verilog代入文の理解:種類、構文、ベストプラクティス
- Verilogブロッキング代入とノンブロッキング代入:違いを徹底解説
- Verilog関数のマスター:効率的なRTL設計のために
- Verilogタスクの理解:関数との違い、構文、使用法
- Verilog階層参照スコープのマスター:モジュールとブロックでの名前衝突回避
- Verilogクロックジェネレータ:設計と実装ガイド
- Verilog数学関数のマスター:効率的なハードウェア設計のために
- Verilog $timeformatのマスター:精度と表示制御
- 任意のスコープでのVerilog timescale理解と表示