¿Es $realtobits sintetizable?

He estado tratando de averiguar por qué mi programa verilog no funciona durante horas. Para probarlo, solo agregué algunas constantes como entradas a mi módulo y estoy usando el analizador lógico integrado para verificar las salidas. Por alguna razón, todos mis valores intermedios son 0.0 (flotante de 64 bits). Luego usé el ILA para verificar las entradas u y d y sus valores son cero. En este momento estoy usando $realtobits para crear constantes a partir de valores flotantes. ¿Es esto sintetizable?

binomial_controller bc(.u($realtobits(1.0025031276057951857)),
                       .d($realtobits(0.99750312239745997367)),
                       .u_v($realtobits(1.0026284483291278971)),
                       .d_v($realtobits(0.99737844229982886013)),
                       .p_up($realtobits(0.49968750024413099986)),
                       .p_up_v($realtobits(99.500999000666340066)),
                       .p_dn($realtobits(0.50031249975586900014)),
                       .p_dn_v($realtobits(0.50035863068484875971)),
                       .int_exp($realtobits(0.99999843750122074937)),
                       .price($realtobits(100.0)),
                       .strike($realtobits(100.0)),
                       .start(start),
                       .clk(cclk),
                       .last_nine_tree_elements(r),
                       .ready(ready));

Respuestas (1)

Respuesta sencilla. No, no creo que lo sea.

Hay un documento de referencia/ayuda en línea muy útil que tiene páginas que describen las construcciones y la sintaxis de Verilog. Tiene una página sobre la $realtobitsfunción, que indica

Las funciones de conversión no son sintetizables.

No puedo garantizar la precisión de la fuente, pero tiene sentido. Las $...funciones de Verilog tienden a ser funciones de ayuda para cosas como la inicialización de la memoria, la visualización en simulación, etc. en lugar de construcciones realmente sintetizables. Este no es siempre el caso: cosas como $signedson sintetizables hasta donde yo sé.

Además, los tipos de datos complejos, como real, timey eventtampoco son sintetizables. Desde ese punto de vista, por lo tanto, tiene sentido que no se pueda sintetizar nada que implique convertirse hacia y desde ellos.


Como @PeterGreen señala en los comentarios, si una construcción es sintetizable se reduce más que nada a la herramienta de síntesis. A medida que especifica Xilinx como una etiqueta, puede consultar la Guía del usuario de XST .

La Tabla 7-33 en la página 518 de ese documento, en una sección titulada "Tareas y funciones del sistema de Verilog admitidas en XST", se indica claramente qué funciones del sistema son compatibles y cuáles se ignoran.

$realtobitsno aparece específicamente en esa tabla, por lo que se incluye en la entrada final que dice: All others: Ignored, lo que indica que no es compatible con la herramienta.

Tiene sentido, pensé que sería uno de esos casos en los que, dado que era una constante, sintetizaría.
No creo que haya un "subconjunto sintetizable" oficial nunca más y aún cuando había proveedores de herramientas a menudo ignoraban partes de él. Entonces, realmente la única respuesta es verificar la documentación de sus proveedores de herramientas.