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.
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]})
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 -
Cela rend le code plus lisible.
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".