¡La simulación se detiene en el tiempo 0 después de una multiplicación de real a real!

0

En mi proyecto, que compila bien en ModelSim, cuando intento simular mi código me da:

Aquí está mi código para el multiplicador:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.MATH_REAL.ALL;

ENTITY mult IS
    PORT(
        a, b: IN REAL;
        dataOut: OUT REAL
    );
END mult;

ARCHITECTURE base OF mult IS
BEGIN
    dataOut <= a * b;
END base;

y esta es mi memoria que deriva a y b:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.MATH_REAL.ALL;

ENTITY memory IS
    GENERIC(
        memCapacity: INTEGER := 8
    );
    PORT(
      w, r: IN BIT;
      address: IN INTEGER;
      dataIn: IN REAL;
      dataOut: OUT REAL
    );
END memory;

ARCHITECTURE base OF memory IS
TYPE memBlock IS ARRAY (INTEGER RANGE <>) OF REAL;
SIGNAL mem: memBlock(memCapacity DOWNTO 0);
BEGIN
    PROCESS (w, r)
    BEGIN
        IF (w = '1') THEN
            mem(address) <= dataIn;
        ELSIF (r = '1') THEN
            dataOut <= mem(address);
        END IF;
    END PROCESS;
END base;
    
pregunta Bat

2 respuestas

0

Fue un poco raro. Por fin, utilicé 1.0 en mis memorias todo el tiempo; así que ahora, la unidad está completamente fuera de circuito y es solo un cable conectado a 1.0. Pero tampoco pudo resolverlo. Luego declaré valores predeterminados para todas mis señales, pero aún así no fue útil. Luego cambié mi código de multiplicador a este código:

BEGIN
PROCESS
BEGIN
  wait for 0 ns;
  dataOut <= a * b;
  wait on a, b;
END PROCESS;
END base;

Funciona mientras que lógicamente es el mismo que el código anterior.

    
respondido por el Bat
1

Es probable que su simulación funcione correctamente, pero a menos que publique un [MCVE] no podemos estar completamente seguros ..

TYPE memBlock IS ARRAY (INTEGER RANGE <>) OF REAL;
SIGNAL mem: memBlock(memCapacity DOWNTO 0);

No hay valores iniciales especificados para el contenido de mem, por lo que cada valor en la matriz se inicializa al valor predeterminado, que es REAL'LEFT , o un número negativo bastante grande.

Presumiblemente, su banco de pruebas inicializa los valores en los puertos a y b de la misma manera. Multiplicarlos juntos dará un número positivo extremadamente grande, con el resultado mostrado.

Puede inicializar señales en la declaración, por ejemplo,

SIGNAL a_test, b_test : REAL := 0.0;
SIGNAL mem: memBlock(memCapacity DOWNTO 0) := (others => 0.0);

borrará el contenido de la matriz, así como la señal a_test (etc.) que conecta hasta los puertos a y b en su banco de pruebas.

    
respondido por el Brian Drummond

Lea otras preguntas en las etiquetas