forked from cores/microwatt
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
175 lines
5.0 KiB
VHDL
175 lines
5.0 KiB
VHDL
library ieee;
|
|
use ieee.std_logic_1164.all;
|
|
use ieee.numeric_std.all;
|
|
|
|
library work;
|
|
use work.wishbone_types.all;
|
|
|
|
entity wishbone_bram_tb is
|
|
end wishbone_bram_tb;
|
|
|
|
architecture behave of wishbone_bram_tb is
|
|
signal clk : std_ulogic;
|
|
signal rst : std_ulogic := '1';
|
|
|
|
constant clk_period : time := 10 ns;
|
|
|
|
signal w_in : wishbone_slave_out;
|
|
signal w_out : wishbone_master_out;
|
|
|
|
impure function to_adr(a: integer) return std_ulogic_vector is
|
|
begin
|
|
return std_ulogic_vector(to_unsigned(a / 8, w_out.adr'length));
|
|
end;
|
|
begin
|
|
simple_ram_0: entity work.wishbone_bram_wrapper
|
|
generic map (
|
|
RAM_INIT_FILE => "wishbone_bram_tb.bin",
|
|
MEMORY_SIZE => 16
|
|
)
|
|
port map (
|
|
clk => clk,
|
|
rst => rst,
|
|
wishbone_out => w_in,
|
|
wishbone_in => w_out
|
|
);
|
|
|
|
clock: process
|
|
begin
|
|
clk <= '1';
|
|
wait for clk_period / 2;
|
|
clk <= '0';
|
|
wait for clk_period / 2;
|
|
end process clock;
|
|
|
|
stim: process
|
|
begin
|
|
w_out.adr <= (others => '0');
|
|
w_out.dat <= (others => '0');
|
|
w_out.cyc <= '0';
|
|
w_out.stb <= '0';
|
|
w_out.sel <= (others => '0');
|
|
w_out.we <= '0';
|
|
|
|
wait until rising_edge(clk);
|
|
rst <= '0';
|
|
wait until rising_edge(clk);
|
|
|
|
w_out.cyc <= '1';
|
|
|
|
-- Test read 0
|
|
w_out.stb <= '1';
|
|
w_out.sel <= "11111111";
|
|
w_out.adr <= to_adr(0);
|
|
assert w_in.ack = '0';
|
|
wait until rising_edge(clk);
|
|
w_out.stb <= '0';
|
|
wait until rising_edge(clk);
|
|
wait until rising_edge(clk);
|
|
assert w_in.ack = '1';
|
|
assert w_in.dat(63 downto 0) = x"0706050403020100" report to_hstring(w_in.dat);
|
|
wait until rising_edge(clk);
|
|
assert w_in.ack = '0';
|
|
|
|
-- Test read 8
|
|
w_out.stb <= '1';
|
|
w_out.sel <= "11111111";
|
|
w_out.adr <= to_adr(8);
|
|
assert w_in.ack = '0';
|
|
wait until rising_edge(clk);
|
|
w_out.stb <= '0';
|
|
wait until rising_edge(clk);
|
|
wait until rising_edge(clk);
|
|
assert w_in.ack = '1';
|
|
assert w_in.dat(63 downto 0) = x"0F0E0D0C0B0A0908" report to_hstring(w_in.dat);
|
|
wait until rising_edge(clk);
|
|
assert w_in.ack = '0';
|
|
|
|
-- Test write byte at 0
|
|
w_out.stb <= '1';
|
|
w_out.sel <= "00000001";
|
|
w_out.adr <= to_adr(0);
|
|
w_out.we <= '1';
|
|
w_out.dat(7 downto 0) <= x"0F";
|
|
assert w_in.ack = '0';
|
|
wait until rising_edge(clk);
|
|
w_out.stb <= '0';
|
|
wait until rising_edge(clk) and w_in.ack = '1';
|
|
wait until rising_edge(clk);
|
|
assert w_in.ack = '0';
|
|
|
|
-- Test read back
|
|
w_out.stb <= '1';
|
|
w_out.sel <= "11111111";
|
|
w_out.adr <= to_adr(0);
|
|
w_out.we <= '0';
|
|
assert w_in.ack = '0';
|
|
wait until rising_edge(clk);
|
|
w_out.stb <= '0';
|
|
wait until rising_edge(clk);
|
|
wait until rising_edge(clk);
|
|
assert w_in.ack = '1';
|
|
assert w_in.dat(63 downto 0) = x"070605040302010F" report to_hstring(w_in.dat);
|
|
wait until rising_edge(clk);
|
|
assert w_in.ack = '0';
|
|
|
|
-- Test write dword at 4
|
|
w_out.stb <= '1';
|
|
w_out.sel <= "11110000";
|
|
w_out.adr <= to_adr(0);
|
|
w_out.we <= '1';
|
|
w_out.dat(63 downto 32) <= x"BAADFEED";
|
|
assert w_in.ack = '0';
|
|
wait until rising_edge(clk);
|
|
w_out.stb <= '0';
|
|
wait until rising_edge(clk) and w_in.ack = '1';
|
|
wait until rising_edge(clk);
|
|
assert w_in.ack = '0';
|
|
|
|
-- Test read back
|
|
w_out.stb <= '1';
|
|
w_out.sel <= "11111111";
|
|
w_out.adr <= to_adr(0);
|
|
w_out.we <= '0';
|
|
assert w_in.ack = '0';
|
|
wait until rising_edge(clk);
|
|
w_out.stb <= '0';
|
|
wait until rising_edge(clk);
|
|
wait until rising_edge(clk);
|
|
assert w_in.ack = '1';
|
|
assert w_in.dat(63 downto 0) = x"BAADFEED0302010F" report to_hstring(w_in.dat);
|
|
wait until rising_edge(clk);
|
|
assert w_in.ack = '0';
|
|
|
|
-- Test write qword at 8
|
|
w_out.stb <= '1';
|
|
w_out.sel <= "11111111";
|
|
w_out.adr <= to_adr(8);
|
|
w_out.we <= '1';
|
|
w_out.dat(63 downto 0) <= x"0001020304050607";
|
|
assert w_in.ack = '0';
|
|
wait until rising_edge(clk);
|
|
w_out.stb <= '0';
|
|
wait until rising_edge(clk) and w_in.ack = '1';
|
|
wait until rising_edge(clk);
|
|
assert w_in.ack = '0';
|
|
|
|
-- Test read back
|
|
w_out.stb <= '1';
|
|
w_out.sel <= "11111111";
|
|
w_out.adr <= to_adr(8);
|
|
w_out.we <= '0';
|
|
assert w_in.ack = '0';
|
|
wait until rising_edge(clk);
|
|
w_out.stb <= '0';
|
|
wait until rising_edge(clk);
|
|
wait until rising_edge(clk);
|
|
assert w_in.ack = '1';
|
|
assert w_in.dat(63 downto 0) = x"0001020304050607" report to_hstring(w_in.dat);
|
|
wait until rising_edge(clk);
|
|
assert w_in.ack = '0';
|
|
|
|
std.env.finish;
|
|
end process;
|
|
end behave;
|