systemverilog program enum constraint clocking classes system-verilog

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 -

  1. Hace que el código sea más legible.

  2. 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]})