Para algunas combinaciones de parámetros, simuladores y estilos de codificación RTL, la latencia de este bloque en simulación se desvía de la latencia esperada en , - un reloj. El hardware real presenta la latencia esperada.
Este comportamiento se verá, por ejemplo, si el reloj que impulsa el bloque DSP es una versión retardada del reloj que genera los datos de entrada, lo que presenta más retraso de simulación para el reloj de entrada que para los datos de entrada.
Para evitar este problema, usted debe asegurarse de que las demoras entre el reloj que genera datos de entrada al bloque DSP y el reloj de entrada del bloque DSP, estén equilibradas por las demoras en los datos de entrada. Alternativamente, asegúrese de que los datos de entrada lleguen a un tiempo absoluto posterior o a un tiempo de retraso delta de simulación posterior, en comparación con el reloj de entrada del bloque DSP.
Tenga en cuenta que, como más declaraciones de asignación en la ruta de reloj en comparación con la ruta de datos, se producirán diferencias de demora delta de simulación entre esas rutas.
Para lograrlo, modifique el nivel de prueba para:
- Asegúrese de que las entradas de generación de reloj al bloque DSP nativo sean exactamente la misma señal que la entrada de reloj al bloque DSP nativo.
- Si no es factible el número 1, retrase los datos de entrada en relación con el reloj.
Por ejemplo, considere el siguiente código RTL original:
RTL original:
clk_gen: proceso
Comenzar
clk_orig <= \'0\';
espera de 5 ns;
clk_orig <= \'1\';
espera de 5 ns;
proceso final;
...
si (rising_edge(clk_orig)) a continuación
ax <= ax 1;
ay < = ay - 1;
end if
mac_test_bad_style: mult_acc
mapa de puertos (
...
ax = > std_logic_vector (ax), -- [in]
ay = > std_logic_vector (ay), -- [in]
clk = > ("00" & clk_orig), -- [in]
resulta = > resulta2, -- [out]
...
);
resulta2 mostrará un reloj con una latencia menor de la esperada. Tenga en cuenta que la asignación de puerto clk del multiplicador "00 & clk" agrega un retraso delta de simulación del "clk_orig" que genera los datos de entrada.
Las posibles soluciones incluyen:
Ejemplo 1, Recomendación: Utilice un reloj de 3 bits en todo
Puede generar el reloj de 3 bits del multiplicador directamente y utilizar el bit activo para reloj de los datos de entrada:
clk_gen: proceso
Comenzar
clk3bit <= \'000\';
espera de 5 ns;
clk3bit <= \'001\';
espera de 5 ns;
proceso final;
...
si (rising_edge(clk3bit(0)) a continuación
ax <= ax 1;
ay < = ay - 1;
end if
mac_test_bad_style: mult_acc
mapa de puertos (
...
ax = > std_logic_vector (ax), -- [in]
ay = > std_logic_vector (ay), -- [in]
clk = > (clk_3bit), -- [in]
resulta = > resulta2, -- [out]
...
);
Ejemplo 2, Recomendación alternativa: añada la demora correspondiente a los datos de entrada
La declaración \'clk = > ("00" &clk_orig)\' hace que el puerto \'clk" tenga un retraso delta de simulación adicional de \'clk_orig\' que 's impulsa los datos. Para superar esto, puede utilizar el proceso de clk_gen original y simplemente agregar demoras de delta de simulación a los datos con declaraciones de asignación.
clk_gen: proceso (igual que el original)
ax_del <= ax;
ay_del< =ay;
mac_test_bad_style: mult_acc
mapa de puertos (
...
ax = > std_logic_vector (ax_del), -- [in]
ay = > std_logic_vector (ay_del), -- [in]
clk = > ("00" & clk_orig), -- [in]
resulta = > resulta2, -- [out]
...
);