¿Qué significa "+:" en Verilog?

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?

@Contrabandista de plutonio, gracias señor, pero no puedo encontrarlo.
@Contrabandista de plutonio: ¿puede proporcionar la respuesta que encontró en su enlace, por favor? ¿Qué significa en realidad? Gracias. :-)
@Carter: ¿puede proporcionar un poco más de contexto, por favor? La declaración que contiene la expresión y las líneas antes y después de la declaración, gracias. ¿Estás seguro de que no es un error tipográfico?
@Greenonline No recuerdo exactamente eso. Puedo hacer mañana.

Respuestas (2)

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 seles 0 entonces dword[8*(0) +: 8] == dword[7:0]
Si seles 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 addressestá en formato little endian ([msb:lsb]), entonces if(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.

Gracias señor, pero se usó en el vector. Pero vi en esto Para las declaraciones. No recuerdo exactamente, pero se usa así. Para~~()~~+:(~~). La declaración total no es exacta. pero +: se usó en for declaración.
@Carter edite su pregunta para incluir el código con el que tiene problemas.
entiendo. Te lo haré saber lo antes posible.
Pero, por favor, hágamelo saber. ¿Todos estos son sintetizables?
A mi me lo parece, pero no estoy seguro.
El direccionamiento de selección parcial ( +: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).
La selección de parte indexada funciona bien en un bucle for. Lo he usado de esta manera varias veces antes y xst no tiene ningún problema siempre que el lado derecho sea constante.

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.