VHDLTestbench U (indefinido) resultado de la forma de onda

-1

Estoy tratando de ejecutar el código vhdl Full_adder de 2 bits para testbench pero obteniendo U (indefinido) en la simulación de forma de onda. ¿Podría por favor aconsejar?

Sumador completo de 1 bit

 entity full_adder is
    Port ( A : in STD_LOGIC;
       B : in STD_LOGIC;
       Cin : in STD_LOGIC;
       S : out STD_LOGIC;
       Cout : out STD_LOGIC);
  end full_adder;

  architecture Behavioral of full_adder is

  begin
   S<=A xor B xor Cin;
   Cout<=(A and B)or(B and Cin)or(A and Cin);

   end Behavioral;

Sumador completo de 2 bits

    entity full_adder_2bit is
    Port ( A : in STD_LOGIC_VECTOR (1 downto 0);
       B : in STD_LOGIC_VECTOR (1 downto 0);
       Cin : in STD_LOGIC;
       S : out STD_LOGIC_VECTOR (1 downto 0);
       Cout : out STD_LOGIC);
end full_adder_2bit;


architecture Behavioral of full_adder_2bit is
Component full_adder
port(A : in STD_LOGIC;
       B : in STD_LOGIC;
       Cin : in STD_LOGIC;
       S : out STD_LOGIC;
        Cout : out STD_LOGIC);  
end component;
signal C:STD_LOGIC;   
begin
Bit_adder0: full_adder port map(A=>A(0),
                    B=>B(0),
                    Cin=>Cin,
                    S=>S(0),
                    Cout=>C);
 Bit_adder1:full_adder port map(A=>A(1),
                           B=>B(1),
                           Cin=>C,
                            S=>S(1),
                            Cout=>Cout);

 end Behavioral;

2bit full adder testbench

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity full_adder_2bit_tb is  
--  Port ( );
end full_adder_2bit_tb;

architecture Behavioral of full_adder_2bit_tb is
component full_adder_2bit 
port( A : in STD_LOGIC_VECTOR (1 downto 0);
      B : in STD_LOGIC_VECTOR (1 downto 0);
      Cin : in STD_LOGIC;
      S : out STD_LOGIC_VECTOR (1 downto 0);
      Cout : out STD_LOGIC);
end component; 
constant Period: Time :=10ns;
signal A_tb: unsigned(1 downto 0):= (others=>'0');
signal B_tb:unsigned(1 downto 0):= (others => '0');
signal Cin_tb:STD_LOGIC;
signal S_tb: STD_LOGIC_VECTOR(1 downto 0);
signal Cout_tb:STD_LOGIC;

begin
Bit_adder_tb0: full_adder_2bit port map
(A=>A_tb,B=>B_tb,Cin=>Cin_tb,S=>S_tb,Cout=>Cout_tb);

stim_proc: process
variable i,j :integer;
begin
for Cin in 0 to 1 loop
 for i in 0 to 2 loop
  for j in 0 to 2 loop
 A_tb <= to_unsigned(i,2); 
B_tb <= to_unsigned(j,2);
    wait for period;
end loop
end loop
end loop
wait;
end process;
end Behavioral;
    
pregunta user8452614

1 respuesta

1

Su banco de pruebas tiene los siguientes defectos:

  1. Ninguna de las declaraciones de bucle anidadas asigna cin_tb, que se utiliza como real en el mapa de puertos para full_adder_2bit. Esto resulta en salidas indefinidas durante la simulación (la declaración para Cin_tb no incluye un valor inicial, el valor predeterminado es 'U'). Las salidas del sumador dependen de la entrada cin.
  2. El literal físico para el período constante carece de espacio entre el literal numérico y el nombre de la unidad, tal como lo requiere el estándar VHDL. (Y sí, hay un simulador comercial que lo permite. Consulte IEEE Std 1076-2008 15.3 Elementos léxicos, separadores y delimitadores, párrafo 4).
  3. En el proceso stim_proc, las variables i y j no se utilizan. Las declaraciones de bucle con un esquema de iteración For declaran implícitamente sus iteradores. Ver 10.10 enunciado en bucle el párrafo 7.)
  4. Las tres instrucciones finales para las tres instrucciones de bucle faltan todas en el siguiente separador de declaración de punto y coma. (Ver 10.10 párrafo 2 de la declaración de bucle).
  5. las primeras dos primeras declaraciones de bucle solo cubren tres de los cuatro valores binarios posibles para A_tb y B_tb.

Estos dependen de sus cambios comentados en las declaraciones para A_tb y B_tb cambiando al tipo std_logic_vector desde el tipo sin signo y el cambio a su asignación en la declaración del bucle interno, agregando una conversión de tipo del resultado de to_unsigned al std_logic_vector. Estos cambios no se han introducido en su pregunta en el momento de escribir este artículo.

Corregir esos y tu código se ve algo así como:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity full_adder_2bit_tb is  
 --  port ( );
end entity full_adder_2bit_tb;

architecture behavioral of full_adder_2bit_tb is
    component full_adder_2bit 
        port (
            a:      in  std_logic_vector (1 downto 0);
            b:      in  std_logic_vector (1 downto 0);
            cin:    in  std_logic;
            s:      out std_logic_vector (1 downto 0);
            cout:   out std_logic
          );
    end component; 
    constant period: time := 10 ns;  -- was missing space in physical literal
    -- types of a_tb and b_tb were unsigned, now std_logic_vector
    signal a_tb:     std_logic_vector (1 downto 0) := (others => '0');
    signal b_tb:     std_logic_vector (1 downto 0) := (others => '0');
    signal cin_tb:   std_logic := '0';  -- foolish consistency
    signal s_tb:     std_logic_vector(1 downto 0);
    signal cout_tb:  std_logic;

begin

bit_adder_tb0: 
    full_adder_2bit 
        port map (
            a => a_tb,
            b => b_tb,
            cin => cin_tb, 
            s => s_tb,
            cout=>cout_tb
        );

stim_proc: 
    process
    --     variable i, j:  integer; -- NOT USED 
    --     loop iterators implicitly declared
    begin        
        -- can assign cin directly to cin_tb:
        for cin in std_ulogic'('0') to std_ulogic'('1') loop
            -- The qualified expressions describe which '0' and '1' enums
            -- the loop iterator cin implicit declaration defines a subtype
            -- of std_ulogic, the base type of std_logic
            for i in 0 to 3 loop  -- was to 3, cover all binary values
                for j in 0 to 3 loop  -- ditto
                    a_tb <= std_logic_vector(to_unsigned(i, 2)); 
                    b_tb <= std_logic_vector(to_unsigned(j, 2));
                    cin_tb <= cin;  -- Drive cin_tb 
                    wait for period;
                end loop;  -- Missing semicolon
            end loop;  -- Missing semicolon
        end loop;  -- Missing semicolon
        wait;
    end process;
end architecture behavioral;

Tenga en cuenta que el iterador de bucle externo tiene un subtipo de tipo sin signo, lo que permite que cin se asigne directamente a Cin_tb. El banco de pruebas ha sido formateado para facilitar la lectura, agregando palabras opcionales reservadas y espacios en blanco. El estilo generalmente es personal u organizativo y no está definido por el estándar VHDL.

El cambio esencial que se debe superar y el resultado indefinido de la forma de onda está impulsando Cin_tb. Los cambios anteriores dan como resultado resultados con niveles lógicos claros:

    
respondido por el user8352

Lea otras preguntas en las etiquetas