Newer
Older
-------------------------------------------------------------------------------
-- 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

Yann Roberge
committed
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);
o_dmem_we : out std_logic;
o_dmem_write : out std_logic_vector(XLEN-1 downto 0);

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
);
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);
fetch_inst: entity work.fetch
generic map (

Yann Roberge
committed
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
);
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
);
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,

Yann Roberge
committed
-- 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,
-- Entrées externes au pipeline
i_rstn => i_rstn,
i_clk => i_clk,
-- Sorties registrées
o_execute_reg => execute_reg
);
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
);
wb_inst: entity work.wb
port map (
-- Entrées provenant de l'étage Memory Access
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;
--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');