Files
lt16lab/soc/core/core_tb.vhd
Thomas Fehmel 657a54ba18 Initial Commit
2016-10-18 14:21:45 +02:00

142 lines
3.7 KiB
VHDL

-- See the file "LICENSE" for the full license governing this code. --
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.lt16x32_global.all;
-- this testbench testes the core in total
entity core_tb is
end entity core_tb;
architecture RTL of core_tb is
-- clock period, f = 1/period
constant period : time := 10 ns;
component core
port(clk : in std_logic;
rst : in std_logic;
stall : in std_logic;
in_dmem : in dmem_core;
out_dmem : out core_dmem;
in_imem : in imem_core;
out_imem : out core_imem;
in_irq : in irq_core;
out_irq : out core_irq;
hardfault : out std_logic);
end component core;
component memory
generic(filename : string := "program.ram";
size : integer := 256;
imem_latency : time := 5 ns;
dmem_latency : time := 5 ns);
port(clk : in std_logic;
rst : in std_logic;
in_dmem : in core_dmem;
out_dmem : out dmem_core;
in_imem : in core_imem;
out_imem : out imem_core;
fault : out std_logic;
out_byte : out std_logic_vector(7 downto 0));
end component memory;
component irq_controller
port(clk : in std_logic;
rst : in std_logic;
in_proc : in core_irq;
out_proc : out irq_core;
irq_lines : in std_logic_vector((2 ** irq_num_width) - 1 downto 0));
end component irq_controller;
-- clock signal
signal clk : std_logic := '0';
-- reset signal, active high
signal rst : std_logic := '1';
-- outbyte signal
signal out_byte : std_logic_vector(7 downto 0);
-- signals between instances
signal dmem_proc_signal : dmem_core;
signal proc_dmem_signal : core_dmem;
signal imem_proc_signal : imem_core;
signal proc_imem_signal : core_imem;
signal irq_proc_signal : irq_core;
signal proc_irq_signal : core_irq;
signal irq_lines : std_logic_vector((2 ** irq_num_width) - 1 downto 0);
begin
core_inst : component core
port map(clk => clk,
rst => rst,
stall => '0',
in_dmem => dmem_proc_signal,
out_dmem => proc_dmem_signal,
in_imem => imem_proc_signal,
out_imem => proc_imem_signal,
in_irq => irq_proc_signal,
out_irq => proc_irq_signal,
hardfault => irq_lines(1));
memory_inst : component memory
generic map(--filename => "sample-programs\test_endianess2.ram",
--filename => "sample-programs\rawhztest.ram",
filename => "sample-programs\rdmem.ram",
size => 256,
imem_latency => 0 ns,
dmem_latency => 0 ns)
port map(clk => clk,
rst => rst,
in_dmem => proc_dmem_signal,
out_dmem => dmem_proc_signal,
in_imem => proc_imem_signal,
out_imem => imem_proc_signal,
fault => irq_lines(2),
out_byte => out_byte);
irq_controller_inst : component irq_controller
port map(clk => clk,
rst => rst,
in_proc => proc_irq_signal,
out_proc => irq_proc_signal,
irq_lines => irq_lines);
-- irq line stimuli
irq_stimuli : process is
begin
irq_lines(irq_lines'high downto 3) <= (others => '0');
irq_lines(0) <= '0';
-- irq0 is reset
-- irq1 is hardfault
-- irq2 is memfault
-- wait for 600 ns;
-- wait until rising_edge(clk);
-- irq_lines(3) <= '1';
-- irq_lines(4) <= '1';
-- wait until rising_edge(clk);
-- irq_lines(3) <= '0';
-- irq_lines(4) <= '0';
wait;
end process irq_stimuli;
-- clock stimuli
clock : process is
begin
clk <= not clk;
wait for period / 2;
end process clock;
-- reset stimuli
reset : process is
begin
rst <= '1';
wait for 3.5 * period;
rst <= '0';
wait;
end process reset;
end architecture RTL;