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...