Problema con el detector de bordes

Tengo un problema estúpido y no sé cómo puedo resolverlo. En mi diseño estoy usando un detector de flanco ascendente. El problema es que ActiveHDL no lo simula de la forma que esperaba. El código VHDL es:

process (clk_i, rst_i)
begin
    if ( rst_i = '1' ) then
        wb_IO_cyc_i_d <= '0';
        wb_IO_cyc_i_edged <= '0';  
    elsif (rising_edge(clk_i) ) then           
        wb_IO_cyc_i_d <= wb_IO_cyc_i;       
        wb_IO_cyc_i_edged <= ( not  wb_IO_cyc_i_d ) and wb_IO_cyc_i;            
    end if;
end process;

El problema es que la simulación es la siguienteingrese la descripción de la imagen aquí

La señal wb_IO_cyc_i_d debería retrasarse 1 ciclo de reloj pero no lo hace. Alguien puede decirme porque?

¿ Cómo estás conduciendo wb_IO_cyc_ien la simulación? Si sube justo antes del borde del reloj, así es como se vería la simulación. Si es una entrada asíncrona, debe pasarla por un sincronizador de 2 etapas antes de enviarla a su detector de borde.
@DaveTweed la señal wb_IO_cyc_ies síncrona. Las señales en simulación son las entradas de la entidad donde está ese proceso, así que no entiendo ese resultado. El wb_IO_cyc_i_dtiene que ser retrasado. Me equivoco ?

Respuestas (1)

Como sugirió @DaveTweed, es probable que sea una condición de carrera entre el reloj y los datos. Una cosa que causará esto es un retraso del ciclo delta en el reloj dentro de su chip, como ocurriría si hiciera alguna asignación a la señal del reloj en el código RTL. Por lo tanto, asegúrese de no haber hecho nada como lo siguiente:

clk_i <= clk ;  -- causes delta cycle delay/skew

Si wb_IO_cyc_i proviene del banco de pruebas, es posible que desee utilizar el patrón:

wait until clk_i = '1' ; 
wb_IO_cyc_i <= '1' after tprop_delay ;  -- where tprop_delay = 20% of your clock cycle.

Comience tprop_delay con una estimación del 20% de su ciclo de reloj, luego actualícelo con los números reales.