¿Cómo configura la resolución de tiempo en Synplify?

3

Estoy generando un pulso de 1 khz desde un reloj de 32 MHz, naturalmente a través de un contador. No es una tarea difícil, así que puedes imaginar mi sorpresa cuando el resultado se ejecuta a 992Hz ...

Simulando el modelo de comportamiento de este contador, puedo ver el comportamiento correcto o incorrecto sin ningún cambio en el código fuente.

El quid del código es este:

constant Clock_Frequency : natural := 32_000_000;
constant Clock_Period : time := 1 sec / Clock_Frequency;
subtype DelayType is natural range 0 to Clock_Frequency;

constant Period : DelayType := 1 ms / Clock_Period;
report "Delay " & DelayType'image(Period) severity NOTE;

que informa (en simulación) como sigue:

(Xilinx ISIM: como se esperaba)

  

a 125 ns: Nota: Demora 32000 (/ testbench / UUT / UUT /).

(Modelsim: ¡sorpresa!)

  

** Nota: Retraso 32258
      Tiempo: 128 ns Iteración: 0 Instancia: / testbench / uut / uut

Y 32MHz dividido por 32258 sí da la señal de 992Hz que estaba observando. Cambiar la resolución de tiempo de Modelsim de su valor predeterminado (probablemente 1ns) a 1ps, da el resultado esperado. Por lo tanto, el período correcto (31,25 ns) se redondea a 31 ns, lo que da como resultado un cálculo incorrecto del valor de carga del contador de demoras.

Pero la implicación es que Synplify (específicamente, Actel Edition de MicroSemi Libero 9.1) usa la resolución 1ns como su valor predeterminado para la resolución de la unidad de tiempo.

Entonces, ¿cómo cambio esto a 1ps o 1 fs para cálculos más precisos que involucren tiempo? No puedo encontrar ninguna información de este tipo en las fuentes obvias.

    
pregunta Brian Drummond

2 respuestas

1

La respuesta (para la versión completa de Synplify al menos) es configurar la opción para "Características Beta para VHDL" en las opciones de implementación de VHDL. O a través de tcl con set_option -beta_vhfeatures 1 .

He probado esto con I-2014.03-SP1 en un caso de prueba muy simple que consiste en una arquitectura de una sola línea que afirma la igualdad de tiempo. Los activadores de afirmación hacen que la síntesis falle cuando la resolución de tiempo es incorrecta.

entity test is
  port (a : in bit);
end test;

architecture RTL of test is
begin
  assert 0.1 ns = 100 ps severity failure;
end RTL;

El archivo de registro ahora informa:

@W: :  | : Beta Features have been turned ON by enabling the beta features in the project ... 
@N: :  | : Features turned ON: Large Time Resolution 

y la afirmación no se activa.

(También he probado 0.1 ps = 100 fs y eso todavía falla, por lo que todavía no estamos completamente allí ...)

    
respondido por el Martin Thompson
1

(Podría decirse que esto no es una respuesta, más una "confirmación de la pregunta" utilizando la versión completa de la herramienta). Lo eliminaré si la gente prefiere ...

El manual de referencia para mi versión de Synplify Pro (I-2014.03-SP1) tiene esta declaración:

  

El soporte de tipos de tiempo físicos predefinidos incluye el expandido   van desde –2147483647 a +2147483647 con unidades que van desde   Los femtosegundos, y las unidades secundarias que van hasta una hora. Predefinido   Los tipos de tiempo físicos permiten la selección de un amplio rango de números   Representante del tipo de tiempo.

Y algún código de ejemplo ...

 entity test is
    generic (INTERVAL1 : time := 1000 fs;
    INTERVAL2 : time := 1 ps;
    INTERVAL3 : time := 1000 ps;
    INTERVAL4 : time := 1 ns
    );
 -- etc - comparing those values
se da

Esto implica que es posible!

Sin embargo, cuando se intenta un testcase basado en dicho código, este informe

  

@N: CD720: "C: \ Synopsys \ fpga_I-2014.03-SP1 \ lib \ vhd \ std.vhd": 123: 18: 123: 21 | Configuración de la resolución de tiempo en ns

Y un testcase muy simple falla esta afirmación:

assert 1 ns = 1000 ps severity failure;

Que coincide con el tipo de cosas que estás viendo.

Y no puedo ver cómo cambiar la resolución en cualquier lugar.

    
respondido por el Martin Thompson

Lea otras preguntas en las etiquetas