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