Necesita consejos de optimización

1

Estoy desarrollando una aplicación con el objetivo de lograr el máximo rendimiento del dispositivo. Por rendimiento me refiero a la cantidad máxima de "núcleos" que se ejecutan a la frecuencia máxima.

Por lo tanto, tenemos: Virtex-6 XC6VLX240T, ISE 14.4

Módulo principal: UART, preparación de datos y recopilación de datos a partir de submódulos

Cada submódulo se conecta al módulo principal a través de la interfaz:

(
        clock              : in std_logic;
        reset              : in std_logic;

        data_input         : in std_logic_vector(31 downto 0);
        data_flag          : in std_logic;

        done               : out std_logic;
        data_ready         : out std_logic
)

En cuanto a los recursos del dispositivo, podemos adaptar alrededor de 230 cores + módulo principal para utilizar completamente la capacidad del dispositivo.

El módulo principal + 64 núcleos funciona perfectamente bien a 200 MHz. 128 núcleos: el sintetizador dice que la frecuencia máxima alcanzable es de alrededor de 140 MHz, lo cual no es bueno. Miré el plano de planta en PlanAhead: todas mis rutas críticas son las líneas que conectan el módulo principal y los submódulos.

Intenté registrar estas líneas:

signal reset_corebuf              : std_logic_vector(NCORES - 1 downto 0);
signal data_input_corebuf         : std_logic_vector((NCORES * 32) - 1 downto 0);
signal data_flag_corebuf          : std_logic_vector(NCORES - 1 downto 0);
signal done_corebuf               : std_logic_vector(NCORES - 1 downto 0);
signal data_ready_corebuf         : std_logic_vector(NCORES - 1 downto 0);

process (clk)
begin
    if (rising_edge(clk)) then
        for i in 0 to NCORES - 1 loop
            reset_corebuf(i) <= reset;
            data_input_corebuf((i + 1) * 32 - 1 downto i * 32) <= core_data;
            data_flag_corebuf(i) <= data_core_flag(i);

            core_done(i) <= done_corebuf(i);
            data_core_ready(i) <= data_ready_corebuf(i);
        end loop;
    end if;
end process;

y nada cambió, pero creo que debería ser mejor, ¿verdad?

¿Qué estoy haciendo mal y cuál es la idea general para optimizar dicha arquitectura?

    
pregunta Alex

1 respuesta

1

He tenido cierto éxito al usar una técnica similar a la que has propuesto anteriormente, que consiste esencialmente en crear múltiples duplicados registrados de las redes de alto fanout. Puede usar uno por destino como lo ha hecho, o lo que he hecho en algunos casos es duplicarlos para que haya un duplicado registrado para cada n destinos.

En teoría, debería poder simplemente registrar las señales una vez, y las herramientas deberían duplicar automáticamente este registro para resolver los problemas de enrutamiento causados por un alto nivel de ventilación durante la optimización. Lamentablemente mi experiencia es que esto no sucede. Peor aún, la herramienta de síntesis puede eliminar por defecto cualquier duplicado que haya intentado crear manualmente, para reducir el uso de la lógica.

Entonces, para responder a su pregunta, mi consejo es desactivar la eliminación de registros equivalentes en las opciones de síntesis específicas de Xilinx, o colocar una restricción keep en sus señales duplicadas de fanout alto.

Tenga en cuenta que la desventaja potencial de desactivar la eliminación de registros equivalentes es que cualquier código escrito en una casa de alto nivel, bajo el supuesto de que los registros duplicados se optimizarán, podría comenzar a usar muchos más recursos.

    
respondido por el scary_jeff

Lea otras preguntas en las etiquetas