Usando $ floor en Verilog

0

Verilog tiene un montón de funciones del sistema matemático.

Estoy tratando de usar $ floor en mi código de Verilog pero recibo este mensaje: El piso de llamada a la función del sistema no está permitido aquí

¿Alguien sabe por qué recibo este mensaje?

Tengo que decir que antes de preguntar aquí busqué en Google y no pude encontrar ninguna solución.

Este es mi código para probar $ floor:

module floor_test();

  parameter kCols = 3;
  integer kCenterX = $floor(kCols / 2);

endmodule

Gracias de antemano

    
pregunta user204415

3 respuestas

1

Primero, tenga en cuenta que $floor es una función del sistema compatible con IEEE1364-2005 (Verilog-2005) e IEEE1800 (SystemVerilog). Las versiones anteriores de Verilog (IEEE1364-1995 e IEEE1364-2001) no tienen $floor en el idioma.

La parte sintetizable de Verilog y SystemVerilog es un subconjunto de los idiomas. Lo que se considera sintetizable no es universal, pero existe una conmoción general. Las últimas guías de síntesis oficiales que pude encontrar fueron IEC 62142-2005 (nota: cuesta dinero o IEEE Xplore membresía para leer el documento) y se basa en Verilog-2001. Incluso hoy en día no veo el pleno cumplimiento de esta norma. Por ejemplo, he visto poco soporte para (* attributes *) a pesar de que se agregó explícitamente a IEEE1364-2001 para que lo use el sintetizador. El mejor artículo de SystemVerilog que puedo encontrar es este documento y menciona varias características compatibles de semi- sintetizadores anónimos a partir de 2014. $floor no se mencionó, pero no significa que no haya soporte.

No puedo pensar en una razón técnica por la que no se deban admitir las funciones del sistema matemático. La demanda y la competencia tienden a impulsar el soporte de síntesis. Las funciones que pueden ganar o retener a los clientes que pagan tienen prioridad máxima. Por lo tanto, hay un soporte común para $bits y $clog2 . Pero hay poco soporte para (* attributes *) porque todos los proveedores ya usaron comentarios ( // y /* */ ) para los atributos como solución antes de la versión IEEE1364-2001.

No necesita $floor para 3/2 . Con la mayoría de los lenguajes de programación y HDL, una integral dividida por una integral siempre devolverá una integral que es el valor mínimo. Por otra parte, 3.0/2 o 3/2.0 activará la integral a un real y devolverá 1.5 . Este valor se redondeará cuando se asigne a una integral (.5 se redondeará hacia abajo).

Si realmente necesita $floor o $ceil , intente usarlo para asignar un parámetro. Su mensaje de error dice "no permitido aquí", por lo que existe un cambio de soporte que se limita al uso de parámetros. La conversión de tipo SytemVerilog es otra posibilidad para ayudar con la conversión (si su sintetizador lo admite); ex. int'() , 10'() , PARAM'() .

Además, tenga en cuenta que puede definir el tipo de parámetro. Si el tipo es una nota definida, entonces se asume integer . Tenga en cuenta que algunos sintetizadores no soportan parámetros reales. Otros

parameter M = 3/2; // M is an inferred integer type (signed), value 1
parameter [3:0] N = 1; // N is an explicit 4-bit type (unsigned)
parameter R0 = 3.6; // R0 is an inferred real type
parameter real R1 = 4/3; // R1 is an explicit real type, value 1.33333...
    
respondido por el Greg
0

Hay una distinción en verilog (y en la mayoría de los lenguajes de hardware) entre código sintetizable y no sintetizable.

El código sintetizable está destinado a utilizarse para definir el hardware que realmente irá a tu FPGA objetivo. Como tal, será un subconjunto de todo lo que Verilog conoce.

El código no sintetizable está diseñado para ayudar a escribir bancos de pruebas, inicialización, limpieza general, para que no tenga que abandonar otros idiomas solo para acceder a archivos o realizar cálculos de punto flotante.

¿Está feliz tu configuración de verilog de que no tienes la intención de sintetizar 'floor'?

    
respondido por el Neil_UK
0

Cambiar a System Verilog debería permitirle usar $ floor en parámetros locales, comparables a esta fuente . Como ha señalado @Neil_UK, esta es una función no sintetizable, que solo debe usarse para pruebas.

No puedo comentar, así que agregaré esto aquí: Esta fuente indica que ISE no es compatible con System Verilog. Por experiencia sé que Quartus hace.

    
respondido por el Runge Kutta

Lea otras preguntas en las etiquetas