Simulación de Vivado atascada en 0 fs

Estoy tratando de simular un flip flop D usando Vivado 2018.2.2. Pero al ejecutar la simulación, aparece una ventana que indica Hora actual: 0 fs. El programa no se congela, simplemente no avanza. Aquí está el código:

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY Dff IS
    port (d, clk, rst: in std_logic;
          q      : out std_logic);
END ENTITY Dff;

ARCHITECTURE behav OF Dff IS
BEGIN
   main : PROCESS
   BEGIN
      IF rst='1' THEN
          q <= '0';
      ELSIF rising_edge(clk) THEN
          q <= d;
      END IF;
  END PROCESS main;
END ARCHITECTURE behav;

Y el banco de pruebas:

LIBRARY IEEE;
USE IEEE.std_logic_1164.all;

ENTITY Dff_tb IS
END Dff_tb;

ARCHITECTURE behav OF Dff_tb IS
    CONSTANT T : time := 10 ns;
    CONSTANT N : INTEGER := 3;
    COMPONENT Dff
    PORT(
        d : IN std_logic;
        clk : IN std_logic;
        rst : IN std_logic;
        q : OUT std_logic
    );
    END COMPONENT;

    SIGNAL d : std_logic := '0';
    SIGNAL clk : std_logic := '0';
    SIGNAL rst : std_logic := '0';
    SIGNAL q : std_logic;
    SIGNAL sim_data : std_logic_vector (N downto 0) := "0011";     
BEGIN
    Dff_0 : Dff PORT MAP (d => d, clk => clk, rst=>rst, q => q);

    clk_pr : PROCESS 
    BEGIN
        clk <= '0';
        WAIT FOR T/2;
        clk <= '1';
        WAIT FOR T/2;
    END PROCESS clk_pr;

    main_pr : PROCESS
    VARIABLE i : INTEGER := 0;
    BEGIN
      rst <= '1';
      wait for T*2; 

      rst <= '0';
      d <= '0';
      wait for T*2;

      rst <= '0';
      d <= '1';  
      wait; 
    END PROCESS main_pr;
END ARCHITECTURE behav;

Soy nuevo en VHDL, así que probablemente sea algo obvio. Cualquier ayuda es apreciada.

EDITAR: después de un comentario, edité el código de mi banco de pruebas de esta manera:

LIBRARY IEEE;
USE IEEE.std_logic_1164.all;

ENTITY Dff_tb IS
END Dff_tb;

ARCHITECTURE behav OF Dff_tb IS
    CONSTANT T : time := 10 ns;
    CONSTANT N : INTEGER := 3;
    COMPONENT Dff
    PORT(
        d : IN std_logic;
        clk : IN std_logic;
        rst : IN std_logic;
        q : OUT std_logic
    );
    END COMPONENT;

    SIGNAL d : std_logic := '0';
    SIGNAL clk : std_logic := '0';
    SIGNAL rst : std_logic := '0';
    SIGNAL q : std_logic;
    SIGNAL sim_data : std_logic_vector (N downto 0) := "0011";  
    SHARED VARIABLE sim_end : boolean := false;   
BEGIN
    Dff_0 : Dff PORT MAP (d => d, clk => clk, rst=>rst, q => q);

    clk_pr : PROCESS 
    BEGIN
        IF sim_end = false THEN
            clk <= '0';
            WAIT FOR T/2;
            clk <= '1';
            WAIT FOR T/2;
        ELSE
            WAIT;
        END IF;
    END PROCESS clk_pr;

    main_pr : PROCESS
    VARIABLE i : INTEGER := 0;
    BEGIN
      rst <= '1';
      wait for T*2; 

      rst <= '0';
      d <= '0';
      wait for T*2;

      rst <= '0';
      d <= '1';
      sim_end := true;
      wait; 
    END PROCESS main_pr;
END ARCHITECTURE behav;

Pero el problema aún persiste.

¿Asignó la señal del reloj para que fuera un reloj?
No, no lo hice. ¿Cómo puedo hacer eso?

Respuestas (1)

EDITAR: además del problema mencionado a continuación, encontré el problema en la Dffentidad misma (estaba concentrado en el banco de pruebas, lo siento): El proceso principal no tiene ninguna waitdeclaración de ningún tipo. Agregue una lista de sensibilidad para mainprocesar:

main : PROCESS (clk, rst) 

O agregue una declaración de espera dentro maindel proceso:

wait on clk, rst;

Eso debería arreglarlo.

Su simulación no termina ya que el clk_prproceso se ejecutará para siempre. Aquí hay una solución simple:

--- clock generator
clk <= not clk after 50 ns when finished /= '1' else '0';

--- rest of your test bench
main_pr : PROCESS

--- test code

--- stop clock
finished <= '1';
wait;
END PROCESS;

Por supuesto, puede reemplazar 50 nscon la constante que usa, recuerde agregar una finishedseñal al banco de pruebas inicializado en '0'.

Lo probé, pero el problema no desapareció (ver la edición del nuevo código).
Actualicé mi respuesta, ahora puedo hacer que se ejecute en Vivado.
Esto no está bien. No necesita una habilitación en el reloj. Una simulación no termina porque el reloj se detuvo; termina porque dejas de simular.
Sí, pero esto detendrá muchos simuladores sin información o comandos adicionales (por ejemplo, cuando no se activan señales). Realmente depende de su cadena de herramientas; Principalmente uso GHDL en la línea de comandos, por lo que detener la simulación deteniendo el reloj me ahorra tiempo y simplifica mi flujo de trabajo.
Desde VHDL-2008 se puede utilizar std.env.stop;para detener una simulación desde cualquier proceso o subprograma. No necesita ninguna desactivación especial del reloj (lo que puede ser complicado en diseños grandes) y no produce líneas de salida adicionales como assertproduciría una declaración.