Skip to content
Snippets Groups Projects
riscv_core_tb.vhd 3.44 KiB
Newer Older
Yann Roberge's avatar
Yann Roberge committed
-------------------------------------------------------------------------------
-- Project  ELE8304 : Circuits intégrés à très grande échelle
-------------------------------------------------------------------------------
-- File     riscv_rf_tb.vhd
-- Authors  Titouan Luard <luardtitouan@gmail.com> 
--          Yann Roberge <yann.roberge@polymtl.ca> 
-- Lab      ELE8304-9
-- Date     2021-12-03
-------------------------------------------------------------------------------
-- Brief    RISC-V core testbench
--          Very broche-à-foin but fully functional testbench
Yann Roberge's avatar
Yann Roberge committed
-------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.math_real.all;

library work;
use work.riscv_pkg.all;

entity riscv_core_tb is
end riscv_core_tb;

architecture tb of riscv_core_tb is

Yann Roberge's avatar
Yann Roberge committed
  signal dmem_addr : std_logic_vector(DMEM_ADDR_WIDTH downto 0);
Yann Roberge's avatar
Yann Roberge committed
  signal dmem_en   : std_logic;
  signal dmem_read : std_logic_vector(XLEN-1 downto 0);

  signal dmem_we    : std_logic;
  signal dmem_write : std_logic_vector(XLEN-1 downto 0);

Yann Roberge's avatar
Yann Roberge committed
  signal imem_addr : std_logic_vector(IMEM_ADDR_WIDTH downto 0);
Yann Roberge's avatar
Yann Roberge committed
  signal imem_en   : std_logic;
  signal imem_read : std_logic_vector(XLEN-1 downto 0);

  signal clk : std_logic;
  signal rstn : std_logic;

  signal imem_addr_lsb : std_logic_vector(IMEM_ADDR_WIDTH+1 downto 0);
  signal dmem_addr_lsb : std_logic_vector(DMEM_ADDR_WIDTH+1 downto 0);
Yann Roberge's avatar
Yann Roberge committed

Yann Roberge's avatar
Yann Roberge committed
  -- Entrées/Sorties du DUT
  constant PERIOD : time := 10 ns;

begin

  -- Instanciation du DUT
  dut: entity work.riscv_core
    port map (
Yann Roberge's avatar
Yann Roberge committed
      o_dmem_addr => dmem_addr_lsb,
      o_dmem_en   => dmem_en,
      i_dmem_read => dmem_read,

      o_dmem_we    => dmem_we,
      o_dmem_write => dmem_write,
Yann Roberge's avatar
Yann Roberge committed

Yann Roberge's avatar
Yann Roberge committed
      o_imem_addr => imem_addr_lsb,
      o_imem_en   => imem_en,
      i_imem_read => imem_read,
Yann Roberge's avatar
Yann Roberge committed

      i_clk   => clk,
      i_rstn  => rstn
  imem_addr <= "0" & imem_addr_lsb(IMEM_ADDR_WIDTH+1 downto 2);
  dmem_addr <= "1" & dmem_addr_lsb(DMEM_ADDR_WIDTH+1 downto 2);
Yann Roberge's avatar
Yann Roberge committed

Yann Roberge's avatar
Yann Roberge committed
  -- Instanciation de la mémoire
  main_memory: entity work.dpm
    generic map (
      WIDTH => 32,
Yann Roberge's avatar
Yann Roberge committed
      DEPTH => 11,
Yann Roberge's avatar
Yann Roberge committed
      RESET => 16#00000000#,
      INIT  => "memory.mem")
    port map (
      -- Port A INSTRUCTION  ---- ROM
      i_a_clk   => clk,            -- Clock
      i_a_rstn  => rstn,           -- Reset Address
      i_a_en    => imem_en,            -- Port enable
      i_a_we    => '0',            -- Write enable
      i_a_addr  => imem_addr,      -- Address port
      i_a_write => (others => '0'),   -- Data write port
      o_a_read  => imem_read,      -- Data read port

      -- Port B DATA
      i_b_clk   => clk,            -- Clock
      i_b_rstn  => rstn,           -- Reset Address
      i_b_en    => dmem_en,             -- Port enable
      i_b_we    => dmem_we,             -- Write enable
      i_b_addr  => dmem_addr,      -- Address port
      i_b_write => dmem_write,     -- Data write port
      o_b_read  => dmem_read       -- Data read port
    );

  -- Drive clock
  drive_clk : process is
  begin
    clk <= '0';
    wait for PERIOD/2;
    clk <= '1';
    wait for PERIOD/2;
  end process drive_clk;

  -- Main TB process
  p_main : process is
  begin
    rstn <= '0';
    wait for 2*PERIOD; 
    rstn <= '1';
    wait for PERIOD; 

    -- Body intentionally left blank

Yann Roberge's avatar
Yann Roberge committed
    report "NON-SELF-CHECKING TB, CHECK THE WAVEFORM MANUALLY";
    wait;

  end process p_main;

end architecture tb;