web-dev-qa-db-fra.com

Indexation des vecteurs et des tableaux avec +:

Je vois un code dans SystemVerilog qui a quelque chose comme ceci:

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

Comment dois-je comprendre le +: lors de l'indexation de ce vecteur?

J'ai trouvé que cela s'appelait le tranchage de bits, mais je ne trouve pas d'explication à ce sujet.

22
DOS

La description et des exemples peuvent être trouvés dans IEEE Std 1800-2012 § 11.5.1 "Adressage de sélection de bits de vecteur et de sélection de partie". La première apparition IEEE est IEEE 1364-2001 (Verilog) § 4.2.1 "Adressage de sélection de bits de vecteur et de sélection de partie". Voici un exemple direct du 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

Si sel vaut 0 alors dword[8*(0) +: 8] == dword[7:0]
Si sel est 7 alors dword[8*(7) +: 8] == dword[63:56]

La valeur à gauche est toujours l'indice de départ. Le nombre à droite est la largeur et doit être une constante positive. + et - indiquent de sélectionner les bits d'une valeur d'index supérieure ou inférieure puis l'index de départ.

En supposant que address est au petit format endian ([msb: lsb]), alors if(address[2*pointer+:2]) est l'équivalent de if({address[2*pointer+1],address[2*pointer]})

47
Greg

C'est une autre façon de spécifier la plage du vecteur binaire.

x +: N, La position de départ du vecteur est donnée par x et vous comptez haut à partir de x par N.

Il y a aussi

x -: N, dans ce cas la position de départ est x et vous comptez bas à partir de x par N.

N est une constante et x est une expression qui peut contenir des itérateurs.

Il présente quelques avantages -

  1. Cela rend le code plus lisible.

  2. Vous pouvez spécifier un itérateur lors du référencement de tranches de bits sans obtenir une erreur "ne peut pas avoir une valeur non constante".

19
shparekh