Declarar cola en verilog

Escribí un código simple para declarar una cola y usarlo en verilog, pero siempre da un error cuando uso la herramienta de síntesis ISE 14.6.

module queues; 
byte qu [$] ;

initial
begin
qu.push_front(2);
qu.push_front(12);
qu.push_front(22);
qu.push_back(11);
qu.push_back(99);
$display(" %d ",qu.size() );
$display(" %d ",qu.pop_front() );
$display(" %d ",qu.pop_back() );
qu.delete(3);
$display(" %d ",qu.size() );
end
endmodule

Estos son los errores:

  1. Error de sintaxis cerca de "$"
  2. byte es un tipo desconocido
  3. Módulo ignorado debido a errores anteriores.

Entonces, ¿cuál será el problema? ¿Hay alguna biblioteca que debería incluirse?

¿Debería declarar la longitud real del búfer en lugar de usar el signo de dólar?
no, quiero decir con eso "es una cola no limitada, no una matriz estática"
Si fueran las síntesis, ¿cómo harían para crear una memoria de tamaño dinámico en hardware?

Respuestas (1)

Las colas son SystemVerilog y no son sintetizables. Las colas están destinadas únicamente a ser utilizadas en simulación para verificación y modelado de comportamiento.

Si desea sintetizar una funcionalidad de cola, debe crear una matriz de tamaño fijo y administrar los punteros.

SystemVerilog y Verilog tienen características que solo se pueden usar en simulación. El lenguaje en sí proporciona requisitos sobre lo que debe y no debe ser sintetizable. Depende del creador del sintetizador decidir que puede soportar. La mayoría de los sintetizadores tienen un soporte muy similar (nadie quiere ser superado por un competidor). Pero algunas cosas son inherentemente difíciles o poco prácticas de sintetizar. En general, para ser sintetizable, la definición y los atributos deben ser estáticos. Una cola tiene un tamaño dinámico, por lo tanto, no es sintetizable.

Una cola limitada declarada con un tamaño máximo como byte [7:0] qu[$:255];fue diseñada para ser sintetizable. Puede haber una herramienta que lo soporte.