Verilog スカラーおよびベクトル
Verilog では、個々のビットとビットのグループを表す必要があります。たとえば、単一ビットの順次要素はフリップフロップです。ただし、16 ビットのシーケンシャル エレメントは、16 ビットを保持できるレジスタです。この目的のために、Verilog には scalar があります。 そしてベクトル ネットと変数。
スカラーとベクトル
ネットまたは reg
範囲指定のない宣言は 1 ビット幅と見なされ、スカラーとなります .範囲が指定されている場合、net または reg
ベクトルとして知られるマルチビットエンティティになります .
wire o_nor; // single bit scalar net
wire [7:0] o_flop; // 8-bit vector net
reg parity; // single bit scalar variable
reg [31:0] addr; // 32 bit vector variable to store address
この範囲により、ベクトル内の個々のビットをアドレス指定できます。ベクトルの最上位ビットは範囲の左側の値として指定する必要があり、ベクトルの最下位ビットは右側で指定する必要があります。
wire [msb:lsb] name;
integer my_msb;
wire [15:0] priority; // msb = 15, lsb = 0
wire [my_msb: 2] prior; // illegal
上記の例では、priority と呼ばれる 16 ビット幅のネットが作成されます。 msb と lsb は定数式である必要があり、変数に置き換えることはできません。ただし、正、負、またはゼロなどの任意の整数値にすることができます。と lsb 値は、msb 値より大きい、等しい、または小さい場合があります。
ビット選択
以下に示すように、ベクトル化された変数の任意のビットを個別に選択し、新しい値を割り当てることができます。これは、ビット選択と呼ばれます .ビット選択が範囲外であるか、ビット選択が x の場合 または z の場合、返される値は x になります .
reg [7:0] addr; // 8-bit reg variable [7, 6, 5, 4, 3, 2, 1, 0]
addr [0] = 1; // assign 1 to bit 0 of addr
addr [3] = 0; // assign 0 to bit 3 of addr
addr [8] = 1; // illegal : bit8 does not exist in addr
部分選択
連続したビットの範囲を選択することができ、部分選択として知られています。 .部分選択には 2 つのタイプがあり、1 つは定数部分選択、もう 1 つはインデックス付き部分選択です。
reg [31:0] addr;
addr [23:16] = 8'h23; // bits 23 to 16 will be replaced by the new value 'h23 -> constant part-select
可変部分選択を使用すると、ループ内で効果的に使用してベクトルの部分を選択できます。開始ビットは変更できますが、幅は一定でなければなりません。
[<start_bit> +: <width>] // part-select increments from start-bit [<start_bit> -: <width>] // part-select decrements from start-bit
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
Verilog