SystemVerilog に次のようなコードが表示されます。
if(address[2*pointer+:2])
do_something;
+:
このベクトルにインデックスを付けるとき、どのように理解すればよいですか?
ビットスライスと呼ばれていることがわかりましたが、それについての説明が見つかりません。
SystemVerilog に次のようなコードが表示されます。
if(address[2*pointer+:2])
do_something;
+:
このベクトルにインデックスを付けるとき、どのように理解すればよいですか?
ビットスライスと呼ばれていることがわかりましたが、それについての説明が見つかりません。
説明と例は、IEEE Std 1800-2017 § 11.5.1「Vector bit-select and part-select addressing」に記載されています。IEEE が最初に登場したのは IEEE 1364-2001 (Verilog) § 4.2.1 "Vector bit-select and part-select addressing" です。以下は、LRM からの直接的な例です。
logic [31: 0] a_vect; logic [0 :31] b_vect; logic [63: 0] dword; integer sel; a_vect[ 0 +: 8] // == a_vect[ 7 : 0] a_vect[15 -: 8] // == a_vect[15 : 8] b_vect[ 0 +: 8] // == b_vect[0 : 7] b_vect[15 -: 8] // == b_vect[8 :15] dword[8*sel +: 8] // variable part-select with fixed width
sel
0 の場合7 のdword[8*(0) +: 8] == dword[7:0]
場合sel
dword[8*(7) +: 8] == dword[63:56]
左側の値は常に開始インデックスです。右側の数字は幅で、正の定数でなければなりません。+
および-
は、開始インデックスよりも高いまたは低いインデックス値のビットを選択することを示します。
address
がリトル エンディアン ([msb:lsb]) 形式であると仮定するとif(address[2*pointer+:2])
、if({address[2*pointer+1],address[2*pointer]})