29

SystemVerilog に次のようなコードが表示されます。

if(address[2*pointer+:2])
  do_something;

+:このベクトルにインデックスを付けるとき、どのように理解すればよいですか?

ビットスライスと呼ばれていることがわかりましたが、それについての説明が見つかりません。

4

2 に答える 2

65

説明と例は、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

sel0 の場合7 のdword[8*(0) +: 8] == dword[7:0]
場合seldword[8*(7) +: 8] == dword[63:56]

左側の値は常に開始インデックスです。右側の数字は幅で、正の定数でなければなりません。+および-は、開始インデックスよりも高いまたは低いインデックス値のビットを選択することを示します。

addressがリトル エンディアン ([msb:lsb]) 形式であると仮定するとif(address[2*pointer+:2])if({address[2*pointer+1],address[2*pointer]})

于 2013-08-05T21:44:08.513 に答える