Multiciclo: ¿Es posible?

2

Tengo que restringir un FPGA de Lattice Semiconductor y tengo algunas dudas sobre la restricción de múltiples ciclos descrita aquí . Tengo el siguiente RTL:

Básicamente,esuncontadorqueseactivamedianteundetectordeflancoascendente.Cadavezqueunaseñalaumentade0a1,segeneraunimpulsoyelcontadoraumenta.EsteestambiénelcódigoVHDL,paraquequedeclaro:

typeCOM_PACKETS_COUNTERisarray(7downto0)ofstd_logic_vector(31downto0);signalcapture_com_tx_packet_counter:COM_PACKETS_COUNTER;signalcapture_com_rx_packet_counter:COM_PACKETS_COUNTER;signalcapture_com_tx_data_reg:std_logic_vector(7downto0);signalcapture_com_rx_data_reg:std_logic_vector(7downto0);signalcapture_com_tx_start_byte_reg:std_logic_vector(7downto0);signalcapture_com_rx_start_byte_reg:std_logic_vector(7downto0);signalcapture_com_tx_start_byte_reg_delay:std_logic_vector(7downto0);signalcapture_com_rx_start_byte_reg_delay:std_logic_vector(7downto0);signalcapture_com_tx_start_byte_reg_edge:std_logic_vector(7downto0);signalcapture_com_rx_start_byte_reg_edge:std_logic_vector(7downto0);..........................COM_COUNTER_PROCESS:foriin0tocapture_com_tx_data_reg'length-1generateprocess(clk_i,rst_i)beginifrst_i='1'thencapture_com_rx_start_byte_reg_delay(i)<='0';capture_com_rx_start_byte_reg_edge(i)<='0';capture_com_tx_start_byte_reg_delay(i)<='0';capture_com_tx_start_byte_reg_edge(i)<='0';elsifclk_i='1'andclk_i'eventthencapture_com_rx_start_byte_reg_delay(i)<=capture_com_rx_start_byte_reg(i);capture_com_rx_start_byte_reg_edge(i)<=not(capture_com_rx_start_byte_reg_delay(i))andcapture_com_rx_start_byte_reg(i)andCAPTURE_COM_RX_SELECTED_FILTER(i);capture_com_tx_start_byte_reg_delay(i)<=capture_com_tx_start_byte_reg(i);capture_com_tx_start_byte_reg_edge(i)<=not(capture_com_tx_start_byte_reg_delay(i))andcapture_com_tx_start_byte_reg(i)andCAPTURE_COM_TX_SELECTED_FILTER(i);endif;endprocess;process(clk_i,rst_i)beginifrst_i='0'thencapture_com_tx_packet_counter(i)<=(others=>'0');elsifclk_i'eventandclk_i='1'thenifcapture_com_tx_start_byte_reg_edge(i)='1'thencapture_com_tx_packet_counter(i)<=capture_com_tx_packet_counter(i)+1;endif;ifcapture_com_rx_start_byte_reg_edge(i)='1'thencapture_com_rx_packet_counter(i)<=capture_com_rx_packet_counter(i)+1;endif;endif;endprocess;endgenerate;

Tengovariosmostradoresenmidiseño.Ahoraquierorelajareltiempo,asíquemepreguntosipuedousaruna"restricción de multiciclos" entre el registro de origen (capture_com_rx_start_byte_reg_edge) y el registro de destino (capture_com_rx_packet_counter) porque no necesito que el contador se actualice después de la subida de capture_com_tx_start_byte_reg.

Mi única preocupación es que el impulso generado podría durar más que un ciclo de reloj, lo que podría ser un problema porque el contador podría incrementarse más de 1 unidad.

    
pregunta haster8558

1 respuesta

3

Cuando utilice multiciclos, debe tener cuidado de que la ruta sea realmente segura para multiciclos. En su caso, la falta de habilitación de reloj en capture_com_rx_packet_counter lo haría "inseguro". Debería ser posible forzar a la herramienta de síntesis a utilizar una primitiva de flip-flop con un reloj en, que sería el primer paso para multiciclo.

Sin embargo, si bien el ciclo múltiple es muy útil para relajar los tiempos, solo lo recomendaría si es tu última solución. ¿Es ese camino realmente problemático? ¿Falla los tiempos? ¿Es cualquier otro camino significativamente más rápido?

También puede cortar los tiempos con el código VHDL. Un ejemplo que hace la adición en 2 ciclos (la entrada debe ser estable 2 ciclos, la salida solo es válida en el segundo ciclo):

signal s_lo : unsigned(16 downto 0);
signal s_hi : unsigned(15 downto 0);

process(clk)
begin
    if rising_edge(clk) then
        s_lo <= '0' & a(15 downto 0) + b(15 downto 0);
        s_hi <= a(31 downto 16) + b(31 downto 16) + s_lo(16);
    end if;
end process;

s <= s_hi & s_lo(15 downto 0);
    
respondido por el Jonathan Drolet

Lea otras preguntas en las etiquetas