Skip to content
Snippets Groups Projects
riscv_core.vhd 5.03 KiB
Newer Older
Yann Roberge's avatar
Yann Roberge committed
-------------------------------------------------------------------------------
-- Project  ELE8304 : Circuits intégrés à très grande échelle
-------------------------------------------------------------------------------
-- File     riscv_core.vhd
-- Authors  Titouan Luard <luardtitouan@gmail.com> 
--          Yann Roberge <yann.roberge@polymtl.ca> 
-- Lab      ELE8304-9
-- Date     2021-12-03
-------------------------------------------------------------------------------
-- Brief    RISC-V processor entire pipeline
--          We had to cut some corner because the project is way too big
--          Pls give us the marks
-------------------------------------------------------------------------------
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 is
  port (
    -- Interface telle que définie figure 12
    o_dmem_addr : out std_logic_vector(DMEM_ADDR_WIDTH+1 downto 0);
    o_dmem_en   : out std_logic;
    i_dmem_read : in  std_logic_vector(XLEN-1 downto 0);
Yann Roberge's avatar
Yann Roberge committed

    o_dmem_we    : out std_logic;
    o_dmem_write : out std_logic_vector(XLEN-1 downto 0);
Yann Roberge's avatar
Yann Roberge committed

    o_imem_addr : out std_logic_vector(IMEM_ADDR_WIDTH+1 downto 0);
    o_imem_en   : out std_logic;
    i_imem_read : in  std_logic_vector(XLEN-1 downto 0);

    -- Divers
    i_clk  : in std_logic;
    i_rstn : in std_logic
  );
Yann Roberge's avatar
Yann Roberge committed
end entity riscv_core;


architecture beh of riscv_core is

  -- Registres entre les étages de pipeline
  signal fetch_reg      : fetch_reg;
  signal decode_reg     : decode_reg;
  signal execute_reg    : execute_reg;
  signal memory_reg     : memory_reg;
  signal write_back_reg : write_back_reg;

  -- Signaux non_registrés entre les étages
  signal rs1_data  : std_logic_vector(XLEN-1 downto 0);
  signal rs2_data  : std_logic_vector(XLEN-1 downto 0);
  signal dmem_read : std_logic_vector(XLEN-1 downto 0);

  -- Signaux de contrôle
  signal stall        : std_logic;
  signal pc_transfer  : std_logic;
  signal flush        : std_logic;
  signal pc_target    : std_logic_vector(XLEN-1 downto 0);

Yann Roberge's avatar
Yann Roberge committed
begin

  -- Étage Fetch
  fetch_inst: entity work.fetch
    generic map (
      RESET_VECTOR => std_logic_vector(to_unsigned(4*(16#00000009#), XLEN))
    )
    port map (
      -- Entrées externes au pipeline
      i_clk       => i_clk,
      i_rstn      => i_rstn,

      -- Entrées provenant de l'étage Execute
      i_stall     => stall,
      i_transfert => pc_transfer,
      i_target    => pc_target,
      i_flush     => flush,

      -- Interface vers la mémoire d'instruction
      i_mem_read  => i_imem_read,
      o_mem_addr  => o_imem_addr,

      -- Sorties
      o_fetch_reg => fetch_reg
    );

Yann Roberge's avatar
Yann Roberge committed
  -- Étage Decode
  decode_inst: entity work.riscv_decode
    port map (
      -- Entrées provenant de l'étage FETCH
      i_fetch_reg => fetch_reg,

      -- Entrées provenant de l'étage WRITE-BACK
      i_write_back_reg => write_back_reg,

      -- Entrée provenant de l'étage EXECUTE
      i_flush => flush,

      -- Entrées externes au pipeline
      i_rstn => i_rstn,
      i_clk  => i_clk,

      -- Sorties
      o_rs1_data => rs1_data,
      o_rs2_data => rs2_data,

      o_decode_reg => decode_reg
    );
Yann Roberge's avatar
Yann Roberge committed

  -- Étage Execute
  execute_inst: entity work.riscv_execute
    port map (
      -- Entrées de l'étage Decode
      i_decode_reg => decode_reg,

      i_rs1_data => rs1_data,
      i_rs2_data => rs2_data,
      -- Entrées de l'étage Write Back (forwarding)
      i_write_back_reg => write_back_reg,

      -- Sorties
      o_pc_transfer => pc_transfer,
      o_pc_target   => pc_target,

      o_flush => flush,
      o_stall => stall,

      -- Entrées externes au pipeline
      i_rstn => i_rstn,
      i_clk  => i_clk,

      -- Sorties registrées
      o_execute_reg => execute_reg
    );
Yann Roberge's avatar
Yann Roberge committed

  -- Étage Memory Access
  memory_access_inst: entity work.memory_access
    port map (
      -- Entrées provenant de l'extérieur du pipeline
      i_clk        => i_clk,
      i_rstn       => i_rstn,
  
      -- Entrées provenant de l'étage Execute
      i_execute_reg => execute_reg,
  
      -- Sorties
      o_memory_reg => memory_reg,
      o_dmem_read  => dmem_read,
  
      -- Communication avec la DPM
      i_dmem_read  => i_dmem_read,
      o_dmem_addr  => o_dmem_addr,
      o_dmem_write => o_dmem_write,
      o_dmem_we    => o_dmem_we,
      o_dmem_en    => o_dmem_en
    );
Yann Roberge's avatar
Yann Roberge committed

  -- Étage Write-Back
  wb_inst: entity work.wb
    port map (
      -- Entrées provenant de l'étage Memory Access
      i_dmem_read  => dmem_read,
      i_alu_result => memory_reg.alu_result,
      i_opcode     => memory_reg.opcode,
      i_rd_addr    => memory_reg.rd_addr,  

      -- Sorties
      o_write_back => write_back_reg
      --o_rd_data => write_back_reg.wr_data,
      --o_rd_addr => write_back_reg.wr_addr,
      --o_we => write_back_reg.we
    );

  o_imem_en <= i_rstn;
Yann Roberge's avatar
Yann Roberge committed

  -- DEBUG
  --o_dmem_addr <= (others => '1');
  --o_dmem_en   <= not i_rstn;
  --o_dmem_we    <= '1';
  --o_dmem_write <= (others => '1');
  ----o_imem_addr  <= (others => '1');
Yann Roberge's avatar
Yann Roberge committed

end architecture beh;