system verilog - program - Indexación de vectores y matrices con+:
systemverilog hierarchy (2)
Esta es otra forma de especificar el rango del vector de bits.
x +: N, la posición de inicio del vector está dada por x y usted cuenta hacia arriba desde x por N.
También hay
x -: N, en este caso, la posición de inicio es x y usted cuenta hacia atrás desde x por N.
N es una constante y x es una expresión que puede contener iteradores.
Tiene un par de beneficios -
Hace que el código sea más legible.
Puede especificar un iterador al hacer referencia a segmentos de bits sin obtener un error "no puede tener un valor no constante".
Estoy viendo un código en SystemVerilog que tiene algo como esto:
if(address[2*pointer+:2])
do_something;
¿Cómo debo entender el +:
al indexar este vector?
Descubrí que se llama rebanar un poco, pero no puedo encontrar una explicación al respecto.
La descripción y los ejemplos se pueden encontrar en IEEE Std 1800-2012 § 11.5.1 "Selección de bits de vector y direccionamiento de parte de selección". La primera aparición de IEEE es IEEE 1364-2001 (Verilog) § 4.2.1 "Direccionamiento de bits y selección de bits de vector". Aquí hay un ejemplo directo del 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
es 0, entonces dword[8*(0) +: 8] == dword[7:0]
Si sel
es 7, entonces dword[8*(7) +: 8] == dword[63:56]
El valor a la izquierda siempre es el índice de inicio. El número a la derecha es el ancho y debe ser una constante positiva. el +
y -
indica que se seleccionan los bits de un valor de índice más alto o más bajo y luego el índice de inicio.
Suponiendo que la address
está en formato little endian ([msb: lsb]), entonces if(address[2*pointer+:2])
es el equivalente de if({address[2*pointer+1],address[2*pointer]})