Verilogスカラとベクトル:ビット、レジスタ、ネットタイプの理解
Verilogでは個々のビットとビットグループの両方を表現する必要があります。例えば、1ビットの順序要素はフリップフロップですが、16ビットの順序要素は16ビットを保持するレジスタです。このため、Verilogにはスカラとベクトルのネットと変数があります。
スカラとベクトル
範囲指定なしで宣言されたネットまたは reg は1ビット幅の スカラ と見なされます。範囲が指定されると、そのネットまたは reg は複数ビットのエンティティである ベクトル になります。
wire o_nor; // 1ビットスカラネット
wire [7:0] o_flop; // 8ビットベクトルネット
reg parity; // 1ビットスカラ変数
reg [31:0] addr; // 32ビットベクトル変数(アドレス格納用)
範囲指定により、ベクトル内の個々のビットにアドレス指定できます。ベクトルの最上位ビット(MSB)を範囲の左側(left-hand value)に、最下位ビット(LSB)を右側に指定します。
wire [msb:lsb] name;
integer my_msb;
wire [15:0] priority; // msb=15, lsb=0
wire [my_msb: 2] prior; // 違法:msb/lsbは定数式でなければならない
上記では16ビット幅のネット priority が作成されます。msb と lsb は定数式でなければならず、変数で置き換えることはできません。ただし、正・負・ゼロのいずれの整数値も取れ、lsb が msb より大きくても、等しくても、小さくても構いません。
ビット選択
ベクトル変数の任意のビットを個別に選択し、新しい値を代入できます。これを ビット選択 と呼びます。ビット選択が範囲外、または x や z の場合、返される値は x になります。
reg [7:0] addr; // 8ビットreg変数 [7,6,5,4,3,2,1,0]
addr[0] = 1; // addrのビット0に1を代入
addr[3] = 0; // addrのビット3に0を代入
addr[8] = 1; // 違法:addrにビット8は存在しない
部分選択
連続するビット範囲を選択することを 部分選択 と呼びます。定数部分選択とインデックス付き部分選択の2種類があります。
reg [31:0] addr;
addr[23:16] = 8'h23; // ビット23〜16を'h23で置換 → 定数部分選択
変数部分選択を使えば、ループでベクトルの部分を効率的に選択できます。開始ビットは可変ですが、幅は定数でなければなりません。
[ +: ] // 開始ビットからインクリメント方向に部分選択
[ -: ] // 開始ビットからデクリメント方向に部分選択
module des;
reg [31:0] data;
int i;
initial begin
data = 32'hFACE_CAFE;
for (i = 0; i < 4; i++) begin
$display ("data[8*%0d +: 8] = 0x%0h", i, data[8*i +: 8]);
end
$display ("data[7:0] = 0x%0h", data[7:0]);
$display ("data[15:8] = 0x%0h", data[15:8]);
$display ("data[23:16] = 0x%0h", data[23:16]);
$display ("data[31:24] = 0x%0h", data[31:24]);
end
endmodule
シミュレーションログ
ncsim> run data[8*0 +: 8] = 0xfe // ~ data[8*0+8 : 8*0] data[8*1 +: 8] = 0xca // ~ data[8*1+8 : 8*1] data[8*2 +: 8] = 0xce // ~ data[8*2+8 : 8*2] data[8*3 +: 8] = 0xfa // ~ data[8*3+8 : 8*3] data[7:0] = 0xfe data[15:8] = 0xca data[23:16] = 0xce data[31:24] = 0xfa ncsim: *W,RNQUIE: Simulation is complete.
よくあるエラー
module tb;
reg [15:0] data;
initial begin
$display ("data[0:9] = 0x%0h", data[0:9]); // Error: Reversed part-select index expression ordering
end
endmodule
部分選択では、MSB:LSB の順序(左がMSB、右がLSB)を守る必要があります。逆順(LSB:MSB)で指定するとエラーになります。
Verilog
- Verilogマスター:デジタル回路設計のための完全チュートリアル
- Verilog連結マスター:実践ガイド
- Verilog代入文の理解:種類、構文、ベストプラクティス
- Verilogブロッキング代入とノンブロッキング代入:違いを徹底解説
- Verilog関数のマスター:効率的なRTL設計のために
- Verilogタスクの理解:関数との違い、構文、使用法
- Verilogインターバル遅延とイントラ代入遅延の理解
- Verilogクロックジェネレータ:設計と実装ガイド
- Verilog数学関数のマスター:効率的なハードウェア設計のために
- Verilog $timeformatのマスター:精度と表示制御
- 任意のスコープでのVerilog timescale理解と表示