La simulación de ModelSim no avanzará

0

Estoy intentando simular un banco de pruebas en ModelSim, pero cuando ejecuto la simulación, nunca avanza en el tiempo. El delta tampoco aumenta.

¿Existen consejos útiles para la depuración en una situación como esta? Sospecho que el problema puede no estar en mi banco de pruebas, sino en la propia entidad maze_solver . Aquí hay algunos problemas posibles:

  • maze_solver también contiene una descripción estructural para otra entidad dentro de ella. ¿Está bien simular así? ¿Mientras haya agregado esa otra entidad en el proyecto ModelSim?
  • ¿Podría ser un problema con mis listas de sensibilidad? Los he comprobado todos y todas las señales del lado derecho se han incluido en las listas de sensibilidad.
  • ¿Podría ser un problema con mi banco de pruebas? He incluido el siguiente código de prueba.

Dado que el diseño maze_solver es largo, no lo he incluido, pero puedo incluirlo si es necesario. Es una máquina de estados finitos (usa solo mayúsculas y minúsculas).

A continuación se muestra mi banco de pruebas:

library IEEE;
use IEEE.std_logic_1164.all;

entity solver_testbench is
end entity solver_testbench;

architecture tb of solver_testbench is
signal clk,reset: STD_LOGIC;
signal cell_data: STD_LOGIC_VECTOR (7 downto 0);
signal data_rdy: STD_LOGIC;
signal rd, wr: STD_LOGIC;
signal row, column: integer;
component maze_solver is
    generic(maze_width : in integer);
    Port (clk, reset : in STD_LOGIC;
        start : in STD_LOGIC;
        rd_cell_data : in STD_LOGIC_VECTOR (7 downto 0);
        data_rdy: in STD_LOGIC;
        rd,wr: out STD_LOGIC;
        row, column: out integer
        );
end component maze_solver;
begin

aravindans_maze_solver: maze_solver
    generic map(maze_width=>2)
    port map(clk=>clk, reset=>reset, start=>'1',rd_cell_data=>cell_data, data_rdy=>data_rdy, rd=>rd, wr=>wr,
         row=>row, column=>column);
process
begin
clk <= '1';
wait for 10 ns;
clk <= '0';
wait for 10 ns;
end process;

process
begin
cell_data <= (others=>'0');
if rd = '1' then
    if row = 0 and column = 0 then
        cell_data <= "01000000";
        data_rdy <= '1';
        wait for 20 ns;
        data_rdy <= '0';
    elsif row = 0 and column = 1 then
        cell_data <= "00010000";
        data_rdy <= '1';
        wait for 20 ns;
        data_rdy <= '0';
    elsif row = 1 and column = 0 then
        cell_data <= "00000000";
        data_rdy <= '1';
        wait for 20 ns;
        data_rdy <= '0';
    elsif row = 1 and column = 1 then
        cell_data <= "00000000";
        data_rdy <= '1';
        wait for 20 ns;
        data_rdy <= '0';
    end if;
else
    cell_data <= (others => '0');
    data_rdy <= '0';
end if;
end process;

reset <= '0', '1' after 5 ns;
end architecture tb;
    
pregunta Eugene Wu

1 respuesta

1

Suponiendo que maze_solver está vinculado, no está obteniendo una combinación de valores rd, row y column que causan la ejecución de una instrucción de espera en el segundo proceso.

El tiempo de simulación no avanza mientras se está ejecutando ningún proceso, eliminando cualquier posibilidad de obtener una combinación adicional de valores que conduzcan a una declaración de espera. Un punto muerto. El proceso alcanza su última declaración secuencial y comienza de nuevo desde el principio sin suspender.

Sería posible volver a escribir este proceso impulsado por un evento de reloj y dependiendo del estado interno.

Agregue una declaración de espera que siempre se alcanzará:

process
begin
cell_data <= (others=>'0');
if rd = '1' then
    if row = 0 and column = 0 then
        cell_data <= "01000000";
        data_rdy <= '1';
        wait for 20 ns;
        data_rdy <= '0';
    elsif row = 0 and column = 1 then
        cell_data <= "00010000";
        data_rdy <= '1';
        wait for 20 ns;
        data_rdy <= '0';
    elsif row = 1 and column = 0 then
        cell_data <= "00000000";
        data_rdy <= '1';
        wait for 20 ns;
        data_rdy <= '0';
    elsif row = 1 and column = 1 then
        cell_data <= "00000000";
        data_rdy <= '1';
        wait for 20 ns;
        data_rdy <= '0';
    end if;
else
    cell_data <= (others => '0');
    data_rdy <= '0';
end if;
wait for 20 ns;  -- ADDED WAIT 
end process;

Es posible que tengas que hacer pequeños retoques una vez que la simulación avance.

    
respondido por el user8352

Lea otras preguntas en las etiquetas