web-dev-qa-db-ja.com

+を使用したベクトルと配列のインデックス付け:

SystemVerilogに次のようなコードがあります:

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

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

ビットスライシングと呼ばれることがわかりましたが、説明が見つかりません。

22
DOS

説明と例は、 IEEE Std 1800-2012 §11.5.1「ベクトルビット選択およびパート選択アドレッシング」にあります。 IEEEの最初の登場は、IEEE 1364-2001(Verilog)§4.2.1「ベクトルビット選択およびパート選択アドレッシング」です。 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の場合、dword[8*(0) +: 8] == dword[7:0]
selが7の場合、dword[8*(7) +: 8] == dword[63:56]

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

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

47
Greg

これは、ビットベクトルの範囲を指定する別の方法です。

x +:N、ベクトルの開始位置はxで与えられ、Nからxからpを数えます。

もあります

x-:N。この場合、開始位置はxであり、Nからxからdownをカウントします。

Nは定数で、xは反復子を含むことができる式です。

いくつかの利点があります-

  1. コードが読みやすくなります。

  2. 「非定数値を持つことはできません」というエラーが発生することなく、ビットスライスを参照するときにイテレータを指定できます。

19
shparekh