library ieee;
|
|
use ieee.std_logic_1164.all;
|
|
use ieee.numeric_std.all;
|
|
|
|
use std.env.all;
|
|
|
|
use work.risc_v_pkg.all;
|
|
|
|
|
|
entity tb_risc_v is
|
|
end entity tb_risc_v;
|
|
|
|
|
|
architecture sim of tb_risc_v is
|
|
|
|
|
|
signal s_clk : std_logic := '1';
|
|
signal s_reset_n : std_logic := '0';
|
|
signal s_reg_file : t_reg_file;
|
|
signal s_dmem : t_dmem;
|
|
|
|
|
|
begin
|
|
|
|
|
|
s_clk <= not s_clk after 5 ns;
|
|
s_reset_n <= '1' after 20 ns;
|
|
|
|
DUT : entity work.risc_v
|
|
port map (
|
|
reset_n_i => s_reset_n,
|
|
clk_i => s_clk,
|
|
reg_file_o => s_reg_file,
|
|
dmem_o => s_dmem
|
|
);
|
|
|
|
-- Checker
|
|
process is
|
|
variable v_expected : std_logic_vector(31 downto 0);
|
|
begin
|
|
wait until s_reset_n = '1';
|
|
-- until program is finished
|
|
wait for c_imem'length * 10 ns;
|
|
-- Check register file entries
|
|
for i in t_reg_file'range loop
|
|
case i is
|
|
when 0 => v_expected := 32x"0";
|
|
when 1 => v_expected := 32x"15";
|
|
when 2 => v_expected := 32x"7";
|
|
when 3 => v_expected := x"FFFFFFFC";
|
|
when 4 => v_expected := 32x"B4";
|
|
when 31 => v_expected := 32x"1F";
|
|
when others => v_expected := 32x"1";
|
|
end case;
|
|
check_equal(s_reg_file(i), v_expected, "Reg. x" & to_string(i) & ": ");
|
|
end loop;
|
|
-- Check data memory entries
|
|
for i in t_dmem'range loop
|
|
case i is
|
|
when 2 => v_expected := 32x"15";
|
|
when others => v_expected := std_logic_vector(to_unsigned(t_dmem'high-i, 32));
|
|
end case;
|
|
check_equal(s_dmem(i), v_expected, "Dmem @" & to_string(i) & ": ");
|
|
end loop;
|
|
stop(0);
|
|
end process;
|
|
|
|
|
|
end architecture sim;
|