Error fatal para la simulación de Full Adder en ModelSim

0

Soy bastante novato en VHDL, pero decidí practicar hoy mis habilidades en el diseño de un sumador completo. Pensé en una tarea simple, excepto que de alguna manera no puedo simular mi código correctamente, aunque cuando lo compilo no obtengo un error.

El error solo indica la línea 21 de Error fatal [ubicación de archivo del banco de pruebas], pero no importa lo que intente, no puedo deshacerme de ese error. Si fuerzo valores a través de la línea de comando para simular mi sumador completo sin el banco de pruebas, la simulación me da señales 'U' cuando en realidad lo mencioné como '0'. Así que estoy confundido y totalmente perdido; Esperando que alguien listo pueda ayudarme.

Aquí el código del sumador completo:

 library IEEE;
 use IEEE.std_logic_1164.all; 

 entity full_adder is
 port(a,b,c_in: in std_logic;
 sum, carry: out std_logic);
 end full_adder;

 architecture SumAndCarry of full_adder is

 signal s1, s2, s3: std_logic;
 constant gate_delay: time:= 5 ns;
 begin 

 L1: s1 <= a xor b after gate_delay;
 L2: s3 <= a and b after gate_delay;
 L3: sum <= s1 xor c_in after gate_delay;
 L4: s2 <= s1 and c_in after gate_delay;
 L5: carry <= s2 or s3 after gate_delay;

 end SumAndCarry;

Y aquí el banco de pruebas que he preparado para probarlo:

 library IEEE;
 use IEEE.std_logic_1164.all; 

 entity FullAdder_tb is
 end FullAdder_tb;


 architecture testbench of FullAdder_tb is
 component full_adder is
 port(a,b,c_in: in std_logic;--You simply replace bit with std_logic
     sum, carry: out std_logic);
 end component;
 signal at, bt, ct, sumt, carryt: std_logic;
 begin
 at <= '0' after 50 ns,
     '1' after 100 ns,
     '0' after 50 ns;
 bt <= '0' after 50 ns,
     '1' after 50 ns,
     '0' after 50 ns,
     '1' after 50 ns;--This is line 21!
 ct <= '0' after 200 ns;
 Lbl1: Full_Adder port map (a => at, b=>bt, c_in=>ct, sum=>sumt, carry=>carryt);
 end testbench;

Espero que todo esté claro ...

    
pregunta user3604362

2 respuestas

0

Hay errores en las señales de las formas de onda de asignación de señales en y bt en el banco de pruebas.

Desde IEEE Std 1076-2008 10.5.2.2 Ejecución de una declaración de asignación simple párrafo 6 (extraído):

  

...   Por lo tanto, la evaluación de una forma de onda da como resultado una secuencia de transacciones, donde cada transacción corresponde a un elemento de forma de onda en la forma de onda. Estas transacciones se llaman nuevas transacciones. Es un error si la secuencia de nuevas transacciones no está en orden ascendente con respecto al tiempo.

Las nuevas transacciones se agregan a la forma de onda de salida proyectada y se miden a partir de la hora actual.

Corrección del tiempo programado de transacciones futuras en at y bt en el banco de pruebas:

library IEEE;
use IEEE.std_logic_1164.all; 

entity full_adder is
port(a,b,c_in: in std_logic;
sum, carry: out std_logic);
end full_adder;

architecture SumAndCarry of full_adder is

signal s1, s2, s3: std_logic;
constant gate_delay: time:= 5 ns;
begin 

L1: s1 <= a xor b after gate_delay;
L2: s3 <= a and b after gate_delay;
L3: sum <= s1 xor c_in after gate_delay;
L4: s2 <= s1 and c_in after gate_delay;
L5: carry <= s2 or s3 after gate_delay;

end SumAndCarry;

library ieee;
use ieee.std_logic_1164.all; -- ADDED MISSING CONTEXT CLAUSE

entity FullAdder_tb is
end FullAdder_tb;

architecture testbench of FullAdder_tb is
component full_adder is
port(a,b,c_in: in std_logic;--You simply replace bit with std_logic
    sum, carry: out std_logic);
end component;
signal at, bt, ct, sumt, carryt: std_logic;
begin
at <= '0' after 50 ns,
    '1' after 100 ns,
    '0' after 150 ns;  -- WAS 50 ns
bt <= '0' after 50 ns,
    '1' after 100 ns,  -- WAS 50 ns
    '0' after 150 ns,  -- WAS 50 ns
    '1' after 200 ns;  -- WAS 50 ns
ct <= '0' after 200 ns;
Lbl1: Full_Adder port map (a => at, b=>bt, c_in=>ct, sum=>sumt, carry=>carryt);
end testbench;

(Observe también la cláusula de contexto agregada a full_adder).

Da:

Tenga en cuenta que el largo retraso antes de asignar ct está causando la 'U' en el sumt. Sería útil inicializar ct.

    
respondido por el user8352
0

Con modelsim debe asegurarse de que está compilando todos los archivos y de simular el módulo correcto. En este caso, debe asegurarse de que su banco de pruebas es el módulo de "nivel superior" que se está simulando.

Debe eliminar todos los errores antes de poder ejecutar su simulación de manera confiable. No estoy seguro, porque generalmente mantengo la mayoría de mis cables con el mismo nombre, pero creo que tiene los cables de su mapa de puertos al revés. Dado que no ha publicado el error (siempre debe publicarlo), no puedo decirle lo que está pasando.

Es posible que desee salir y hacer algunos vhdl tutorials para aprender cómo funciona modelsim antes de comenzar a rodar tus propias cosas. Hay muchos otros si buscas en google.

    
respondido por el laptop2d

Lea otras preguntas en las etiquetas