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.
BEARBEITEN: Neben dem unten genannten Problem habe ich das Problem in der Dff
Entität selbst gefunden (ich habe mich auf die Testbench konzentriert, sorry dafür): Der Hauptprozess hat keinerlei wait
Aussage. Fügen Sie entweder eine Vertraulichkeitsliste zur main
Verarbeitung hinzu:
main : PROCESS (clk, rst)
Oder fügen Sie eine Wait-Anweisung innerhalb main
des Prozesses hinzu:
wait on clk, rst;
Das sollte es beheben.
Ihre Simulation wird nicht beendet, da der clk_pr
Prozess 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 ns
durch die Konstante ersetzen, die Sie verwenden, denken Sie daran, ein finished
Signal zur Testbench hinzuzufügen, das auf initialisiert wurde '0'
.
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.
Anonym
Jure Vreca