Intel® Quartus® Prime Software
Intel® Quartus® Prime Design Software, Design Entry, Synthesis, Simulation, Verification, Timing Analysis, System Design (Platform Designer, formerly Qsys)
17009 Discussions

Simulation yielding different results when changing top-level entity

ocraM
Novice
452 Views

Hi, I'm sorry if the question is silly but I'm new to quartus.

I have a project called HACK (an attempt to create Nand2Tetris' project in an actual FPGA board). It has the following pertinent files:

halfAdder.vhd
testHalfAdder.vhd
HACK.vhd

testHalfAdder is a testbench that instantiates the halfAdder component and tests it. HACK instantiates halfAdder in a way that doesn't actually make any sense, but just to force it to be compiled for now.

After creating halfAdder.vhd, I created halfFullAdder.vhd and added it to quartus testbenches list via Assignments->Settings->Simulation. I also checked the box to make simulation run automatically after compilation.

If I set halfAdder.vhd to be the top-level entity, everything runs fine and my simulation works. If i then set my top-level entity to be HACK, then the overall compilation works, but the simulation shows only undefined signals and exits with an error.

Am I doing something wrong or is this a bug? If I'm doing something wrong, how to correct it?

Thanks so much for any help.

halfAdder code:

 

 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity halfAdder is
    Port (
        a : in STD_LOGIC;
        b : in STD_LOGIC;
        sum : out STD_LOGIC; 
                  carry : out STD_LOGIC
    );
end halfAdder;

architecture Behavioral of halfAdder is
begin
    sum <= a xor b;
    carry <= a and b;
end Behavioral;

 

 


testHalfAdder code:

 

 

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

entity testHalfAdder is
end entity testHalfAdder;

    architecture logic of testHalfAdder is
        
        component halfAdder is
            PORT(
                a : in STD_LOGIC;
                b : in STD_LOGIC;
                sum : out STD_LOGIC;
                carry : out STD_LOGIC);
        end component;

        signal in1 : STD_LOGIC;
        signal in2 :  STD_LOGIC;
        signal os : STD_LOGIC;
        signal oc : STD_LOGIC;

    begin

        DUT : halfAdder
            port map (
            a => in1,
            b => in2,
            sum => os,
            carry => oc
            );

        process
            variable i, j: integer;
				constant delay_time : time := 2 ps;
        begin

            for i in 0 to 1 loop
                for j in 0 to 1 loop
                    in1 <= std_logic'value(integer'image(i));
                    in2 <= std_logic'value(integer'image(j));
                    wait for delay_time;
                    if (os /= (in1 xor in2) or oc /= (in1 and in2)) then
                        report "in1=" & std_logic'image(in1) &
                        ", in2=" & std_logic'image(in2) &
                        ", os=" & std_logic'image(os) &
                        ", oc=" & std_logic'image(oc) severity error;
                    end if;
                end loop;
            end loop;

        end process;

    end architecture logic;

 

 

HACK code:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity HACK is
    Port (
        a : in STD_LOGIC;
        b : in STD_LOGIC;
        sum : out STD_LOGIC; 
	carry : out STD_LOGIC
    );
end HACK;

architecture Behavioral of HACK is

	component halfAdder is
		PORT(
			a : in STD_LOGIC;
			b : in STD_LOGIC;
			sum : out STD_LOGIC;
			carry : out STD_LOGIC);
	end component;


begin

    HA : halfAdder
	 port map (
		a => a,
		b => b,
		sum => sum,
		carry => carry
	);

	 
end Behavioral;

 

 



halfAdder working simulation:

ocraM_1-1736614063197.png


halfAdder broken simulation after setting HACK to top level entity:

ocraM_2-1736614231712.png

 

Labels (1)
0 Kudos
1 Solution
sstrell
Honored Contributor III
387 Views

HACK.vhd is not a testbench.  All it does is instantiate halfAdder.  It doesn't provide any stimulus to halfAdder so you won't see anything in a simulation.

View solution in original post

3 Replies
sstrell
Honored Contributor III
388 Views

HACK.vhd is not a testbench.  All it does is instantiate halfAdder.  It doesn't provide any stimulus to halfAdder so you won't see anything in a simulation.

ocraM
Novice
373 Views

I see, I thought that testbenches were supposed to be always compiled and instantiated, but it seems that is not the case.
After you pointed me to the right direction i researched a bit and it seems the common practice is to simply define the desired testbench as a top-level entity when you want it to compile and run(?)

Thanks for the help

0 Kudos
sstrell
Honored Contributor III
368 Views

Correct.   A testbench is a top-level design that instantiates a DUT and usually has no top-level I/O since it does not need to be implemented in hardware through synthesis.  The reference to compilation here is that it must be able to compile in the simulation tool, not necessarily in the synthesis tool (Quartus).

0 Kudos
Reply