Como prefacio, hay ciertos estilos de codificación utilizados en VHDL / Verilog que ayudan a las herramientas de síntesis a inferir hardware diferente (algunos mejor en rendimiento que el otro). Por ejemplo, usar una escalera if-else-if inferiría una serie de mux'es, mientras que una declaración de caso inferiría un multiplexor ancho único. Estos estilos de codificación no son significativos cuando se realiza solo la simulación funcional, pero son sustanciales cuando se dirige a la RTL para la implementación ASIC o FPGA. En el caso de los FPGA, la arquitectura CLB (bloque lógico configurable) define las capacidades logradas utilizando RTL (como el ancho de entrada de la LUT).
Llegando a la pregunta, he visto muchos casos en los que dos señales de ancho de n bits deberían compararse en VHDL. Y necesito un consejo sobre la inferencia de hardware. Usaré el siguiente fragmento de código para limitar aún más la pregunta.
signal counter_a: unsigned(31 downto 0);
signal counter_b: unsigned(31 downto 0);
signal clk, trigger_en, count_b_en : std_logic;
counter_a_gen: process (clk) begin
if(rising_edge(clk)) then
counter_a <= counter_a + 1; -- free running counter
end if;
end process;
counter_b_gen: process (clk) begin
if(rising_edge(clk)) then
if(count_b_en = '1') then
counter_b <= counter_b + 1;
else
counter_b <= (others => '0');
end if;
end if;
end process;
-- compare the counters to generate some logic
trigger_gen: process (clk) begin
if(rising_edge(clk)) then
if(counter_a = counter_b) then
trigger_en <= '1';
else
trigger_en <= '0';
end if;
end if;
end process;
El fragmento de código anterior tiene dos contadores de 32 bits counter_a y counter_b, que deben compararse en un bloque secuencial. Si considero una LUT de 4 entradas en un FPGA, la comparación necesitaría múltiples niveles de lógica. Un camino de este tipo dificultaría el cumplimiento del tiempo debido a los enormes retrasos combinatorios. Entonces mi pregunta es ¿cómo lo hacemos optimizado? ¿En este caso para aumentar el rendimiento?