Add an icache testbench
Signed-off-by: Anton Blanchard <anton@linux.ibm.com>pull/60/head
							parent
							
								
									d573748da0
								
							
						
					
					
						commit
						1e3e16e500
					
				@ -0,0 +1,120 @@
 | 
			
		||||
library ieee;
 | 
			
		||||
use ieee.std_logic_1164.all;
 | 
			
		||||
 | 
			
		||||
library work;
 | 
			
		||||
use work.common.all;
 | 
			
		||||
use work.wishbone_types.all;
 | 
			
		||||
 | 
			
		||||
entity icache_tb is
 | 
			
		||||
end icache_tb;
 | 
			
		||||
 | 
			
		||||
architecture behave of icache_tb is
 | 
			
		||||
    signal clk          : std_ulogic;
 | 
			
		||||
    signal rst          : std_ulogic;
 | 
			
		||||
 | 
			
		||||
    signal i_out        : Fetch2ToIcacheType;
 | 
			
		||||
    signal i_in         : IcacheToFetch2Type;
 | 
			
		||||
 | 
			
		||||
    signal wb_bram_in   : wishbone_master_out;
 | 
			
		||||
    signal wb_bram_out  : wishbone_slave_out;
 | 
			
		||||
 | 
			
		||||
    constant clk_period : time := 10 ns;
 | 
			
		||||
begin
 | 
			
		||||
    icache0: entity work.icache
 | 
			
		||||
        generic map(
 | 
			
		||||
            LINE_SIZE_DW => 8,
 | 
			
		||||
            NUM_LINES => 4
 | 
			
		||||
            )
 | 
			
		||||
        port map(
 | 
			
		||||
            clk => clk,
 | 
			
		||||
            rst => rst,
 | 
			
		||||
            i_in => i_out,
 | 
			
		||||
            i_out => i_in,
 | 
			
		||||
            wishbone_out => wb_bram_in,
 | 
			
		||||
            wishbone_in => wb_bram_out
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
    -- BRAM Memory slave
 | 
			
		||||
    bram0: entity work.mw_soc_memory
 | 
			
		||||
        generic map(
 | 
			
		||||
            MEMORY_SIZE   => 128,
 | 
			
		||||
            RAM_INIT_FILE => "icache_test.bin"
 | 
			
		||||
            )
 | 
			
		||||
        port map(
 | 
			
		||||
            clk => clk,
 | 
			
		||||
            rst => rst,
 | 
			
		||||
            wishbone_in => wb_bram_in,
 | 
			
		||||
            wishbone_out => wb_bram_out
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
    clk_process: process
 | 
			
		||||
    begin
 | 
			
		||||
        clk <= '0';
 | 
			
		||||
        wait for clk_period/2;
 | 
			
		||||
        clk <= '1';
 | 
			
		||||
        wait for clk_period/2;
 | 
			
		||||
    end process;
 | 
			
		||||
 | 
			
		||||
    rst_process: process
 | 
			
		||||
    begin
 | 
			
		||||
        rst <= '1';
 | 
			
		||||
        wait for 2*clk_period;
 | 
			
		||||
        rst <= '0';
 | 
			
		||||
        wait;
 | 
			
		||||
    end process;
 | 
			
		||||
 | 
			
		||||
    stim: process
 | 
			
		||||
    begin
 | 
			
		||||
        i_out.req <= '0';
 | 
			
		||||
        i_out.addr <= (others => '0');
 | 
			
		||||
 | 
			
		||||
        wait for 4*clk_period;
 | 
			
		||||
 | 
			
		||||
        i_out.req <= '1';
 | 
			
		||||
        i_out.addr <= x"0000000000000004";
 | 
			
		||||
 | 
			
		||||
        wait for 30*clk_period;
 | 
			
		||||
 | 
			
		||||
        assert i_in.ack = '1';
 | 
			
		||||
        assert i_in.insn = x"00000001";
 | 
			
		||||
 | 
			
		||||
        i_out.req <= '0';
 | 
			
		||||
 | 
			
		||||
        wait for clk_period;
 | 
			
		||||
 | 
			
		||||
        -- hit
 | 
			
		||||
        i_out.req <= '1';
 | 
			
		||||
        i_out.addr <= x"0000000000000008";
 | 
			
		||||
        wait for clk_period/2;
 | 
			
		||||
        assert i_in.ack = '1';
 | 
			
		||||
        assert i_in.insn = x"00000002";
 | 
			
		||||
        wait for clk_period/2;
 | 
			
		||||
 | 
			
		||||
        -- another miss
 | 
			
		||||
        i_out.req <= '1';
 | 
			
		||||
        i_out.addr <= x"0000000000000040";
 | 
			
		||||
 | 
			
		||||
        wait for 30*clk_period;
 | 
			
		||||
 | 
			
		||||
        assert i_in.ack = '1';
 | 
			
		||||
        assert i_in.insn = x"00000010";
 | 
			
		||||
 | 
			
		||||
        -- test something that aliases
 | 
			
		||||
        i_out.req <= '1';
 | 
			
		||||
        i_out.addr <= x"0000000000000100";
 | 
			
		||||
        wait for clk_period/2;
 | 
			
		||||
        assert i_in.ack = '0';
 | 
			
		||||
        wait for clk_period/2;
 | 
			
		||||
 | 
			
		||||
        wait for 30*clk_period;
 | 
			
		||||
 | 
			
		||||
        assert i_in.ack = '1';
 | 
			
		||||
        assert i_in.insn = x"00000040";
 | 
			
		||||
 | 
			
		||||
        i_out.req <= '0';
 | 
			
		||||
 | 
			
		||||
        assert false report "end of test" severity failure;
 | 
			
		||||
        wait;
 | 
			
		||||
 | 
			
		||||
    end process;
 | 
			
		||||
end;
 | 
			
		||||
					Loading…
					
					
				
		Reference in New Issue