ゲートレベルモデリング:ハードウェア回路図からVerilogコードへ
ほとんどのデジタル設計はRTLのようなより高い抽象化レベルで行われますが、andやorのような組み合わせ要素を使用して、より低いレベルで小さな決定論的回路を構築する方が直感的な場合もあります。このレベルでのモデリングは通常、ゲートレベルモデリングと呼ばれ、ゲートを扱い、ハードウェア回路図とVerilogコードの間に一対一の関係があります。
Verilogは、プリミティブと呼ばれるいくつかの基本論理ゲートをサポートしています。これらはモジュールのようにインスタンス化できるため、プリミティブと呼ばれます(事前に定義済みだからです)。
AND/OR/XORゲート
これらのプリミティブは、複数のスカラ入力を受け取り単一のスカラ出力を提供するANDゲートとORゲートを実装します。これらのプリミティブへの引数リストの最初の端子が出力であり、入力のいずれかが変化するたびに更新されます。
module gates (
input a, b,
output c, d, e
);
and (c, a, b); // cが出力、aとbが入力
or (d, a, b); // dが出力、aとbが入力
xor (e, a, b); // eが出力、aとbが入力
endmodule
module tb;
reg a, b;
wire c, d, e;
integer i;
gates u0 (
.a(a), .b(b),
.c(c), .d(d), .e(e)
);
initial begin
{a, b} = 0;
$monitor ("[T=%0t a=%0b b=%0b c(and)=%0b d(or)=%0b e(xor)=%0b", $time, a, b, c, d, e);
for (i = 0; i < 10; i = i+1) begin
#1 a <= $random; b <= $random;
end
end
endmodule
ncsim> run [T=0 a=0 b=0 c(and)=0 d(or)=0 e(xor)=0 [T=1 a=0 b=1 c(and)=0 d(or)=1 e(xor)=1 [T=2 a=1 b=1 c(and)=1 d(or)=1 e(xor)=0 [T=4 a=1 b=0 c(and)=0 d(or)=1 e(xor)=1 [T=5 a=1 b=1 c(and)=1 d(or)=1 e(xor)=0 [T=6 a=0 b=1 c(and)=0 d(or)=1 e(xor)=1 [T=7 a=1 b=0 c(and)=0 d(or)=1 e(xor)=1 [T=10 a=1 b=1 c(and)=1 d(or)=1 e(xor)=0 ncsim: *W,RNQUIE: Simulation is complete.
NAND/NOR/XNORゲート
上記すべてのゲートの逆も、nand、nor、xnorの形で利用可能です。上記と同じ設計を、プリミティブをそれらの逆版に切り替える例外を除いて再利用します。
module gates (
input a, b,
output c, d, e
);
// この例ではand, or, xorの代わりに
// nand, nor, xnorを使用
nand (c, a, b); // cが出力、aとbが入力
nor (d, a, b); // dが出力、aとbが入力
xnor (e, a, b); // eが出力、aとbが入力
endmodule
module tb;
reg a, b;
wire c, d, e;
integer i;
gates u0 (
.a(a), .b(b),
.c(c), .d(d), .e(e)
);
initial begin
{a, b} = 0;
$monitor ("[T=%0t a=%0b b=%0b c(nand)=%0b d(nor)=%0b e(xnor)=%0b", $time, a, b, c, d, e);
for (i = 0; i < 10; i = i+1) begin
#1 a <= $random; b <= $random;
end
end
endmodule
ncsim> run [T=0 a=0 b=0 c(nand)=1 d(nor)=1 e(xnor)=1 [T=1 a=0 b=1 c(nand)=1 d(nor)=0 e(xnor)=0 [T=2 a=1 b=1 c(nand)=0 d(nor)=0 e(xnor)=1 [T=4 a=1 b=0 c(nand)=1 d(nor)=0 e(xnor)=0 [T=5 a=1 b=1 c(nand)=0 d(nor)=0 e(xnor)=1 [T=6 a=0 b=1 c(nand)=1 d(nor)=0 e(xnor)=0 [T=7 a=1 b=0 c(nand)=1 d(nor)=0 e(xnor)=0 [T=10 a=1 b=1 c(nand)=0 d(nor)=0 e(xnor)=1 ncsim: *W,RNQUIE: Simulation is complete.
これらのゲートは2つ以上の入力を持つことができます。
module gates (
input a, b, c, d,
output x, y, z
);
and (x, a, b, c, d); // xが出力、a,b,c,dが入力
or (y, a, b, c, d); // yが出力、a,b,c,dが入力
nor (z, a, b, c, d); // zが出力、a,b,c,dが入力
endmodule
module tb;
reg a, b, c, d;
wire x, y, z;
integer i;
gates u0 (
.a(a), .b(b), .c(c), .d(d),
.x(x), .y(y), .z(z)
);
initial begin
{a, b, c, d} = 0;
$monitor ("[T=%0t a=%0b b=%0b c=%0b d=%0b x=%0b y=%0b x=%0b", $time, a, b, c, d, x, y, z);
for (i = 0; i < 10; i = i+1) begin
#1 a <= $random; b <= $random; c <= $random; d <= $random;
end
end
endmodule
ncsim> run [T=0 a=0 b=0 c=0 d=0 x=0 y=0 x=1 [T=1 a=0 b=1 c=1 d=1 x=0 y=1 x=0 [T=2 a=1 b=1 c=1 d=0 x=0 y=1 x=0 [T=3 a=1 b=1 c=0 d=1 x=0 y=1 x=0 [T=4 a=1 b=0 c=1 d=0 x=0 y=1 x=0 [T=5 a=1 b=0 c=1 d=1 x=0 y=1 x=0 [T=6 a=0 b=1 c=0 d=0 x=0 y=1 x=0 [T=7 a=0 b=1 c=0 d=1 x=0 y=1 x=0 [T=8 a=1 b=1 c=1 d=0 x=0 y=1 x=0 [T=9 a=0 b=0 c=0 d=1 x=0 y=1 x=0 [T=10 a=0 b=1 c=1 d=1 x=0 y=1 x=0 ncsim: *W,RNQUIE: Simulation is complete.
BUF/NOTゲート
これらのゲートは1つのスカラ入力と1つ以上の出力のみを持ちます。bufはバッファを表し、極性を変えずに入力から出力へ値を単純に転送します。notはインバータを表し、入力の信号極性を反転させます。したがって、入力が0なら1を、1なら0を出力します。
module gates (
input a,
output c, d
);
buf (c, a); // cが出力、aが入力
not (d, a); // dが出力、aが入力
endmodule
module tb;
reg a;
wire c, d;
integer i;
gates u0 (
.a(a), .c(c), .d(d)
);
initial begin
a = 0;
$monitor ("[T=%0t a=%0b c(buf)=%0b d(not)=%0b", $time, a, c, d);
for (i = 0; i < 10; i = i+1) begin
#1 a <= $random;
end
end
endmodule
xcelium> run [T=0 a=0 c(buf)=0 d(not)=1 [T=2 a=1 c(buf)=1 d(not)=0 [T=8 a=0 c(buf)=0 d(not)=1 [T=9 a=1 c(buf)=1 d(not)=0 xmsim: *W,RNQUIE: Simulation is complete.
ポートリストの最後の端子がゲートの入力に接続され、他のすべての端子がゲートの出力ポートに接続されます。複数出力バッファの例を示します(滅多に使用されません)。
module gates (
input a,
output c, d
);
not (c, d, a); // c,dが出力、aが入力
endmodule
xcelium> run [T=0 a=0 c=1 d=1 [T=2 a=1 c=0 d=0 [T=8 a=0 c=1 d=1 [T=9 a=1 c=0 d=0 xmsim: *W,RNQUIE: Simulation is complete.
BUFIF/NOTIF
出力をイネーブルする追加の制御信号を持つバッファとインバータは、bufifとnotifプリミティブで利用可能です。これらのゲートは、制御信号がイネーブルの場合のみ有効な出力を持ち、そうでなければ出力はハイインピーダンスになります。これらには2つのバージョンがあり、制御の正極性を1で示すbufif1とnotif1、制御の負極性を0で示すbufif0とnotif0です。
Verilog
- 4011 ICによる基本NANDゲート回路の設計と検証
- 接合型電界効果トランジスタ (JFET) の理解:ゲート電流方向とN/Pチャネル
- 集積回路:デジタル論理ゲートの基礎
- TTL回路におけるNOTゲート(インバータ)の理解
- レベルスタッフ(水準標尺)の理解:定義、用途、種類
- 精密な旋盤レベリング:プロフェッショナルガイド
- C# 変数のスコープを理解する:クラス、メソッド、ブロックレベル
- 設計抽象化レイヤー:チップアーキテクチャを理解するための明確なガイド
- 実践Verilogゲートレベル設計:AND/OR/NOTゲートと2×1マルチプレクサ
- Verilogゲート遅延の理解:信頼性の高いデジタル設計のための正確なタイミング
- Verilogスイッチレベルモデリングの高度な活用