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?