組み込みゲートプリミティブ
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 39/90。
Verilogには、実際のゲート記号を使用して論理回路を記述できる組み込みのゲートプリミティブがあります。これは構造モデリングと呼ばれます。回路図を描くのと同じように、ゲートを接続して回路を構築します。
ゲートプリミティブは、基本的な論理ゲートをモデル化する、事前に定義されたキーワードです。assign out = a & b のような式を書く代わりに、次のようにゲートをインスタンス化します:
and(out, a, b); // 出力 out、入力 a および b を持つ AND ゲート一般的な構文
gate_type (output, input1, input2, ...);- 第1引数は常に出力となります
- 後続の引数は入力です(ゲートに応じて1つ以上)
利用可能なゲートプリミティブ
| ゲートタイプ | キーワード | 入力数 |
|---|---|---|
| AND | and | 2以上 |
| OR | or | 2以上 |
| NOT | not | 1 |
| NAND | nand | 2以上 |
| NOR | nor | 2以上 |
| XOR | xor | 2以上 |
| XNOR | xnor | 2以上 |
ゲートプリミティブの仕組み
and(out, a, b) と記述すると、Verilogは a & b の結果で out を継続的に駆動するANDゲートを作成します。a または b が変化するたびに、実際のゲートと同じように out が即座に更新されます。
ゲートプリミティブ vs 継続的代入
どちらの方法も同じハードウェアを生成します:
// ゲートプリミティブ
and(out, a, b);
// 継続的代入(同じ結果)
assign out = a & b;ゲート・プリミティブは、回路をゲートの集合(構造スタイル)として記述したい場合に有用です。継続的代入は、動作スタイル(式)に適しています。
チャレンジ
実行すること:
- この回路を動作させるために、正しいゲートプリミティブを追加してください。モジュールは入力
aとbの AND を出力する必要があります。出力ポートの名前は既にcとなっています。
チートシート
Verilogのゲートプリミティブを使用すると、論理ゲートを直接インスタンス化することで構造モデリングを行うことができます。
構文: 最初の引数は常に出力で、その後に入力が続きます。
gate_type(output, input1, input2, ...);利用可能なプリミティブ:
| ゲート | キーワード | 入力数 |
|---|---|---|
| AND | and | 2以上 |
| OR | or | 2以上 |
| NOT | not | 1 |
| NAND | nand | 2以上 |
| NOR | nor | 2以上 |
| XOR | xor | 2以上 |
| XNOR | xnor | 2以上 |
ゲートプリミティブとassignは、同等のハードウェアを生成します。
and(out, a, b); // 構造的 (ゲートプリミティブ)
assign out = a & b; // 振る舞い的 (継続的代入)自分で試してみよう
module gate_challenge (
input a,
input b,
output c
);
// TODO: 適切なゲート・プリミティブを追加してください
// 出力 c は a AND b である必要があります
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。