Cuando estaba mirando el código Verilog de alguien, encontré "+:" en Verilog. Parece una función aritmética pero no estoy seguro. Nunca he visto antes. ¿Alguien conoce este uso?
Actualizar:
csum= csum + one_cnt[i* ('DPC_shift +1) +: ('DPC_shift +1)];
Tengo una consulta, ¿es esto sintetizable?
Desde https://stackoverflow.com/a/18068296/1544337 :
La descripción y los ejemplos se pueden encontrar en IEEE Std 1800-2012 § 11.5.1 "Direccionamiento de selección parcial y selección de bits de vector". La primera aparición en IEEE es IEEE 1364-2001 (Verilog) § 4.2.1 "Direccionamiento de selección parcial 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 entoncesdword[8*(0) +: 8] == dword[7:0]
Sisel
es 7 entoncesdword[8*(7) +: 8] == dword[63:56]
El valor a la izquierda siempre el índice inicial. El número a la derecha es el ancho y debe ser una constante positiva. el
+
y-
indica seleccionar los bits de un valor de índice más alto o más bajo que el índice de inicio.Suponiendo que
address
está en formato little endian ([msb:lsb]), entoncesif(address[2*pointer+:2])
es el equivalente deif({address[2*pointer+1],address[2*pointer]})
A menudo es útil buscar los nombres completos de los operadores. Encontré esto buscando 'verilog plus colon operator'.
Consulte también https://stackoverflow.com/a/17779414/1544337 , que está vinculado a la pregunta citada.
+:
y -:
) se puede sintetizar en cualquier sintetizador moderno. Hacer que el sintetizador lo trate como un caso completo / caso paralelo es algo que debe consultar en el manual. +:
no debe estar en un bucle for. La selección parcial dentro de un bucle for no se sintetizará porque no puede desenrollarse estáticamente (a menos que la matriz que se está cortando sea un parámetro).Actualizar:
csum= csum + one_cnt[i* ('DPC_shift +1) +: ('DPC_shift +1)];
Tengo una consulta, ¿es esto sintetizable?
Al menos en la versión de quartus que uso si es una señal, entonces no se sintetizará. Descubrí esto de la manera difícil. Se queja de que la indexación no es constante a pesar de que el ancho es constante y del hecho de que está bastante feliz de realizar una selección de un solo bit con un índice variable.
Encuentro esto muy molesto, ya que si la herramienta lo admitiera, sería una herramienta útil para extraer subpalabras de palabras más grandes.
No he probado con otras herramientas ni con i como contador de bucles.
Carretero
Verde en línea
Verde en línea
Carretero