工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Verilog

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

  1. Verilogマスター:デジタル回路設計のための完全チュートリアル
  2. Verilog連結マスター:実践ガイド
  3. Verilog代入文の理解:種類、構文、ベストプラクティス
  4. Verilogブロッキング代入とノンブロッキング代入:違いを徹底解説
  5. Verilog関数のマスター:効率的なRTL設計のために
  6. Verilogタスクの理解:関数との違い、構文、使用法
  7. Verilogインターバル遅延とイントラ代入遅延の理解
  8. Verilogクロックジェネレータ:設計と実装ガイド
  9. Verilog数学関数のマスター:効率的なハードウェア設計のために
  10. Verilog $timeformatのマスター:精度と表示制御
  11. 任意のスコープでのVerilog timescale理解と表示