Vivado-Simulation bleibt bei 0 fs hängen

Ich versuche, ein D-Flip-Flop mit Vivado 2018.2.2 zu simulieren. Aber beim Ausführen der Simulation erscheint ein Fenster mit der Angabe Aktuelle Zeit: 0 fs. Das Programm friert nicht ein, es läuft einfach nicht weiter. Hier ist der Code:

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;

Und der Prüfstand:

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;

Ich bin neu bei VHDL, also ist es wahrscheinlich etwas Offensichtliches. Jede Hilfe ist willkommen.

BEARBEITEN: Nach einem Kommentar habe ich meinen Testbench-Code wie folgt bearbeitet:

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;

Aber das Problem besteht weiterhin.

Haben Sie dem Taktsignal eine Uhr zugewiesen?
Nein, habe ich nicht. Wie mache ich das?

Antworten (1)

BEARBEITEN: Neben dem unten genannten Problem habe ich das Problem in der DffEntität selbst gefunden (ich habe mich auf die Testbench konzentriert, sorry dafür): Der Hauptprozess hat keinerlei waitAussage. Fügen Sie entweder eine Vertraulichkeitsliste zur mainVerarbeitung hinzu:

main : PROCESS (clk, rst) 

Oder fügen Sie eine Wait-Anweisung innerhalb maindes Prozesses hinzu:

wait on clk, rst;

Das sollte es beheben.

Ihre Simulation wird nicht beendet, da der clk_prProzess für immer ausgeführt wird. Hier ist eine einfache Lösung:

--- 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;

Natürlich können Sie 50 nsdurch die Konstante ersetzen, die Sie verwenden, denken Sie daran, ein finishedSignal zur Testbench hinzuzufügen, das auf initialisiert wurde '0'.

Ich habe es versucht, aber das Problem ist nicht verschwunden (siehe die Bearbeitung für den neuen Code).
Ich habe meine Antwort aktualisiert, ich kann sie jetzt in Vivado zum Laufen bringen.
Das ist nicht richtig. Sie brauchen keine Freigabe auf der Uhr. Eine Simulation endet nicht, weil die Uhr stehen geblieben ist; es endet, weil Sie aufhören zu simulieren.
Ja, aber dies wird viele Simulatoren ohne zusätzliche Informationen oder Befehle stoppen (z. B. wenn keine Signale angesteuert werden). Es hängt wirklich von Ihrer Toolchain ab; Ich verwende GHDL hauptsächlich auf der Befehlszeile, sodass das Stoppen der Simulation durch Stoppen der Uhr mir Zeit spart und meinen Arbeitsablauf vereinfacht.
Seit VHDL-2008 können Sie verwenden std.env.stop;, um eine Simulation von jedem Prozess oder Unterprogramm aus zu stoppen. Es benötigt keine spezielle Taktdeaktivierung (was bei großen Designs schwierig werden könnte) und es erzeugt keine zusätzlichen Ausgabezeilen, wie es eine assert-Anweisung erzeugen würde.