Verilog構文マスター:重要ルールとベストプラクティス
Verilogの字句規則はC言語と似ており、トークンのストリームで構成されます。字句トークンは1文字以上で構成され、コメント、キーワード、数値、文字列、空白があります。すべての行はセミコロン ; で終了する必要があります。
var_a と var_A は別物です。コメント
Verilogには2種類のコメントがあります:
- 単一行コメント:
//で始まり、行末までをコメントとして扱う - 複数行コメント:
/*で始まり*/で終わり、ネスト不可
ただし、単一行コメントを複数行コメント内にネストすることは可能です。
// これは単一行コメント
integer a; // 整数変数aを作成、//以降はコメント
/* これは複数行/ブロックコメント */
/* これは /* 無効なネストされたブロックコメント */ */
/* しかし、// これはOK */
// これもOK
///////////// これもOK
空白文字
空白文字(スペース、タブ、改行、改ページ)は、トークンを区切る場合を除きVerilogでは無視されます。実際、これはコードのインデントを助け、可読性を高めます。
module dut; // 'module'はキーワード、'dut'は識別子
reg [8*6:1] name = "Hello!"; // 行頭の2スペースは無視される
ただし、文字列内ではスペースとタブは無視されません。以下の例では、文字列変数 addr に "Earth " (末尾にスペース)が格納されます。
// 行頭にスペースなしだが、文字列内にスペースあり
reg [8*6:1] addr = "Earth ";
endmodule
演算子
演算子は3種類:単項、二項、三項(条件)。
- 単項演算子はオペランドの左に配置
- 二項演算子は2つのオペランドの間に配置
- 条件演算子は2つの演算子で3つのオペランドを区切る
x = ~y; // ~は単項演算子、yはオペランド
x = y | z; // |は二項演算子、yとzがオペランド
x = (y > 5) ? w : z; // ?:は三項演算子、(y>5)、w、zがオペランド
式 (y > 5) が真なら変数 x は w の値を、偽なら z の値を取ります。
数値形式
数値は通常10進数で表現しますが、2進数、8進数、16進数 でも表現可能です。デフォルトではVerilogシミュレータは数値を10進数として扱います。異なる基数で表現するにはルールに従う必要があります。
16 // 10進数の16
0x10 // 16進数の16
10000 // 2進数の16
20 // 8進数の16
サイズ指定付き数値
サイズ指定付き数値は以下の形式で表現し、size はビット数を10進数で指定します:
[size]'[base_format][number]
- base_format:10進数('d/'D)、16進数('h/'H)、8進数('o/'O)を指定。number 部分の基数を示す
- number:連続する数字。10進数なら0-9、16進数なら0-9,A-F
3'b010; // サイズ3、2進数、値2
3'd2; // サイズ3、10進数、値2
8'h70; // サイズ8、16進数、0x70(10進数112)
9'h1FA; // サイズ9、16進数、0x1FA(10進数506)
4'hA = 4'd10 = 4'b1010 = 4'o12 // 10を4形式で表現
8'd234 = 8'D234 // 基数指定は大文字小文字どちらも可
32'hFACE_47B2; // アンダースコアで16ビット区切り可(可読性向上)
16'hcafe; // 小文字 OK
16'hCAFE; // 大文字 OK
32'h1D40_CAFE; // アンダースコア区切り OK
サイズ指定なし数値
base_format 指定なしはデフォルトで10進数。size 指定なしは、シミュレータとマシン依存のデフォルトビット数になります。
integer a = 5423; // 基数指定なし → 10進数5423
integer a = 'h1AD7; // サイズ指定なし → int(32ビット)なので 32'h0000_1AD7
負の数値
マイナス記号 - をサイズの前に置いて指定。base_format と number の間にマイナスを置くのは違法。
-6'd3; // 6ビット負数、3の2の補数
-6'sd9; // 符号付き演算用
8'd-4; // 違法
文字列
ダブルクォート " " で囲まれた文字列。複数行に分割不可。文字1つにつき1バイト必要。
"Hello World!" // 12文字 → 12バイト
"x + z" // 5文字
"How are you feeling today ?" // 複数行に分割不可 → 違法
識別子
識別子 は変数名で、後から参照するために使います。英数字 [a-z][A-Z][0-9]、アンダースコア _、ドル記号 $ で構成され、大文字小文字を区別。数字やドル記号で開始不可。
integer var_a; // 英字とアンダースコア → 合法
integer $var_a; // $で開始 → 違法
integer v$ar_a; // 英字と$を含む → 合法
integer 2var; // 数字で開始 → 違法
integer var23_g; // 英数字とアンダースコア → 合法
integer 23; // 数字のみ → 違法
キーワード
キーワードは言語構造を定義するために予約された特殊な識別子で、小文字です。主要なキーワード一覧は以下の通り。
Verilogの改訂履歴
Verilogは数回の改訂を経ており、1995年から2001年にかけて機能追加が行われました。
Verilog
- Verilogマスター:デジタル回路設計のための完全チュートリアル
- Verilog連結マスター:実践ガイド
- Verilog代入文の理解:種類、構文、ベストプラクティス
- Verilogブロッキング代入とノンブロッキング代入:違いを徹底解説
- Verilog関数のマスター:効率的なRTL設計のために
- Verilogタスクの理解:関数との違い、構文、使用法
- Verilogクロックジェネレータ:設計と実装ガイド
- Verilog数学関数のマスター:効率的なハードウェア設計のために
- Verilog $timeformatのマスター:精度と表示制御
- 任意のスコープでのVerilog timescale理解と表示
- VerilogファイルI/Oの完全ガイド:オープン、読み取り、書き込み、クローズ