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

344 lines
7.0 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_internal.all;
use work.lt16x32_global.all;
use work.wishbone.all;
use work.config.all;
ENTITY coreicnmem_tb IS
END coreicnmem_tb;
ARCHITECTURE behavior OF coreicnmem_tb IS
--//////////////////////////////////////////////
-- component
--//////////////////////////////////////////////
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 memdiv
generic(
filename : in string := "program.ram";
size : in integer := 256;
imem_latency : in time := 5 ns;
dmem_latency : in time := 5 ns;
dmemsz : integer := DMEMSZ;
imemsz : integer := IMEMSZ
);
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;
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;
component core2wb
generic(
wbidx: integer := 0
);
port(
clk : in std_logic;
rst : in std_logic;
in_dmem : out dmem_core;
out_dmem : in core_dmem;
-- wb master port
wmsti : in wb_mst_in_type;
wmsto : out wb_mst_out_type
);
end component;
component mem2wb
generic(
memaddr : generic_addr_type := 0;
addrmask : generic_mask_type := 16#3fffff#;
wbidx : integer := 0
);
port(
clk : in std_logic;
rst : in std_logic;
in_dmem : out core_dmem;
out_dmem : in dmem_core;
wslvi : in wb_slv_in_type;
wslvo : out wb_slv_out_type
);
end component;
component wb_intercon
generic(
slv_mask_vector : std_logic_vector(0 to NWBSLV-1) := b"0000_0000_0000_0000";
mst_mask_vector : std_logic_vector(0 to NWBMST-1) := b"0000";
dat_sz: integer := WB_PORT_SIZE;
adr_sz: integer := WB_ADR_WIDTH;
nib_sz: integer := WB_PORT_GRAN
);
port(
clk : in std_logic;
rst : in std_logic;
msti : out wb_mst_in_vector;
msto : in wb_mst_out_vector;
slvi : out wb_slv_in_vector;
slvo : in wb_slv_out_vector
);
end component;
--//////////////////////////////////////////////
-- signal
--//////////////////////////////////////////////
-- Clock period definitions
constant clk_period : time := 10 ns;
constant slv_mask_vector : std_logic_vector(0 to NWBSLV-1) := b"1000_0000_0000_0000";
constant mst_mask_vector : std_logic_vector(0 to NWBMST-1) := b"1000";
--Inputs
signal clk : std_logic := '0';
signal rst : std_logic := '0';
-- signals between instances
signal core2dm_sc : core_dmem;
signal core2dm_sm : core_dmem;
signal dm2core_sc : dmem_core;
signal dm2core_sm : dmem_core;
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);
signal out_byte: std_logic_vector(7 downto 0);
--signal hardfault: std_logic;
--signal fault: std_logic;
----signal slvi : wb_slv_in_type ;--:= wbs_in_none;
----signal msti : wb_mst_in_type ;--:= wbm_in_none;
--signal slvo : wb_slv_out_type := wbs_out_none;
--signal msto : wb_mst_out_type := wbm_out_none;
signal slvo : wb_slv_out_vector := (others=> wbs_out_none);
signal msto : wb_mst_out_vector := (others=> wbm_out_none);
signal slvi : wb_slv_in_vector := (others=> wbs_in_none);
signal msti : wb_mst_in_vector := (others=> wbm_in_none);
BEGIN
--//////////////////////////////////////////////
-- instantiation
--//////////////////////////////////////////////
----------
--core
----------
core_inst : component core
port map(
clk => clk,
rst => rst,
stall => '0',
in_dmem => dm2core_sc,
out_dmem => core2dm_sc,
in_imem => imem_proc_signal,
out_imem => proc_imem_signal,
in_irq => irq_proc_signal,
out_irq => proc_irq_signal,
hardfault => irq_lines(1)
);
----------
--memdiv
----------
mem_inst: memdiv
generic map(
filename => "sample-programs\rawhztest.ram",
size => DMEMSZ + IMEMSZ,
imem_latency => 0 ns,
dmem_latency => 0 ns,
dmemsz => DMEMSZ,
imemsz => IMEMSZ
)
port map(
clk => clk,
rst => rst,
in_dmem => core2dm_sm,
out_dmem => dm2core_sm,
in_imem => proc_imem_signal,
out_imem => imem_proc_signal,
fault => irq_lines(2),
out_byte => out_byte
);
----------
--irq
----------
irqcontr_inst: irq_controller
port map(
clk => clk,
rst => rst,
in_proc => proc_irq_signal,
out_proc => irq_proc_signal,
irq_lines => irq_lines
);
----------
--core2wb
----------
core2wb0: core2wb
generic map(
wbidx => CFG_LT16
)
port map(
clk => clk,
rst => rst,
in_dmem => dm2core_sc,
out_dmem => core2dm_sc,
wmsti => msti(CFG_LT16),
wmsto => msto(CFG_LT16)
);
----------
--mem2wb
----------
mem2wb0: mem2wb
generic map(
memaddr => CFG_BADR_MEM,
addrmask => CFG_MADR_MEM,
wbidx => CFG_MEM
)
port map(
clk => clk,
rst => rst,
in_dmem => core2dm_sm,
out_dmem => dm2core_sm,
wslvi => slvi(CFG_MEM),
wslvo => slvo(CFG_MEM)
);
----------
--wb_intercon
----------
wbicn_inst: wb_intercon
generic map(
slv_mask_vector => slv_mask_vector,
mst_mask_vector => mst_mask_vector
)
port map(
clk => clk,
rst => rst,
msti => msti,
msto => msto,
slvi => slvi,
slvo => slvo
);
-- Clock process definitions
clk_process :process
begin
clk <= '0';
wait for clk_period/2;
clk <= '1';
wait for clk_period/2;
end process;
-- reset stimuli
reset : process is
begin
rst <= '1';
wait for 3.5 * clk_period;
rst <= '0';
wait;
end process reset;
-- 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;
-- -- Stimulus process
-- stim_proc: process
-- begin
--
---- wait for clk_period*10;
--
---- slvi.adr <= msto.adr;
---- slvi.dat <= msto.dat;
---- slvi.we <= msto.we;
---- slvi.sel <= msto.sel;
---- slvi.stb <= msto.stb;
---- slvi.cyc <= msto.cyc;
----
-- ---
---- msti.dat <= slvo.dat;
---- msti.ack <= slvo.ack;
--
-- wait;
-- end process;
END;