Changes in signals names

This commit is contained in:
Douglas Santos 2021-06-23 00:22:17 +02:00
parent 24c0e08825
commit 2d54e7cbc2
4 changed files with 307 additions and 308 deletions

View file

@ -9,12 +9,12 @@ entity control is
port (
-- input ports
-- processor status
imem_gnt_i : in std_logic;
imem_err_i : in std_logic;
dmem_gnt_i : in std_logic;
dmem_outofrange_i : in std_logic;
dmem_sbu_i : in std_logic;
dmem_dbu_i : in std_logic;
imem_gnt_i : in std_logic;
imem_err_i : in std_logic;
dmem_gnt_i : in std_logic;
dmem_err_i : in std_logic;
dmem_sbu_i : in std_logic;
dmem_dbu_i : in std_logic;
-- instruction decode
opcode_i : in std_logic_vector(6 downto 0);
@ -29,8 +29,8 @@ entity control is
-- output ports
-- processor status
imem_req_o : out std_logic;
dmem_req_o : out std_logic;
imem_req_o : out std_logic;
dmem_req_o : out std_logic;
update_pc_o : out std_logic;
trap_o : out std_logic;
@ -42,7 +42,7 @@ entity control is
imm_shamt_o : out std_logic;
imm_up_o : out std_logic;
-- register bank
regwr_o : out std_logic;
regwr_o : out std_logic;
-- control transfer
inv_branch_o : out std_logic;
branch_o : out std_logic;
@ -50,9 +50,9 @@ entity control is
jalr_o : out std_logic;
ecall_o : out std_logic;
-- mem access
memrd_o : out std_logic;
memwr_o : out std_logic;
byte_en_o : out std_logic_vector(1 downto 0);
mem_rd_o : out std_logic;
mem_wr_o : out std_logic;
mem_ben_o : out std_logic_vector(1 downto 0);
mem_usgn_o : out std_logic; -- unsigned data
-- U type
load_upimm_o : out std_logic;
@ -102,9 +102,9 @@ architecture arch of control is
constant SYS_CSRRCI : std_logic_vector(2 downto 0) := "111";
-- auxiliar signals
signal memwr_w : std_logic;
signal memrd_w : std_logic;
signal memreq_w : std_logic;
signal mem_wr_w : std_logic;
signal mem_rd_w : std_logic;
signal mem_req_w : std_logic;
-- opcodes
@ -121,7 +121,7 @@ begin
imem_req_o <= '1' when proc_status_r = STAT_REQ_INSTR else '0';
-- STAT_DMEM_STALL
memreq_w <= memrd_w or memwr_w;
mem_req_w <= mem_rd_w or mem_wr_w;
dmem_req_o <= '1' when proc_status_r = STAT_DMEM_STALL else '0';
-- STAT_UPDATE_PC
@ -140,7 +140,7 @@ begin
end if;
end process;
PROC_NEXT_STATUS : process(proc_status_r, start_i, imem_gnt_i, imem_err_i, dmem_outofrange_i, memreq_w, dmem_gnt_i)
PROC_NEXT_STATUS : process(proc_status_r, start_i, imem_gnt_i, imem_err_i, dmem_err_i, mem_req_w, dmem_gnt_i)
begin
case proc_status_r is
@ -163,14 +163,14 @@ begin
end if;
when STAT_RUN =>
if memreq_w = '1' then
if mem_req_w = '1' then
next_proc_status_w <= STAT_DMEM_STALL;
else
next_proc_status_w <= STAT_UPDATE_PC;
end if;
when STAT_DMEM_STALL =>
if dmem_outofrange_i = '1' then -- or dmem_sbu_i = '1' or dmem_dbu_i = '1' then
if dmem_err_i = '1' then -- or dmem_sbu_i = '1' or dmem_dbu_i = '1' then
next_proc_status_w <= STAT_TRAP;
elsif dmem_gnt_i = '1' then
next_proc_status_w <= STAT_UPDATE_PC;
@ -262,11 +262,11 @@ begin
ecall_o <= '0'; -- '1' when instr_format_w = I_system else
------------------------------ MEM ACCESS ---------------------------------
memrd_w <= '1' when instr_format_w = I_load else '0';
memrd_o <= memrd_w;
memwr_w <= '1' when instr_format_w = S else '0';
memwr_o <= memwr_w;
byte_en_o <= funct3_i(1 downto 0) when funct3_i(1) = '0' else "11"; -- byte or halfword -- else word
mem_rd_w <= '1' when instr_format_w = I_load else '0';
mem_rd_o <= mem_rd_w;
mem_wr_w <= '1' when instr_format_w = S else '0';
mem_wr_o <= mem_wr_w;
mem_ben_o <= funct3_i(1 downto 0) when funct3_i(1) = '0' else "11"; -- byte or halfword -- else word
mem_usgn_o <= funct3_i(2);
-------------------------------- U type -----------------------------------

View file

@ -10,12 +10,12 @@ entity control_tmr is
port (
-- input ports
-- processor status
imem_gnt_i : in std_logic;
imem_err_i : in std_logic;
dmem_gnt_i : in std_logic;
dmem_outofrange_i : in std_logic;
dmem_sbu_i : in std_logic;
dmem_dbu_i : in std_logic;
imem_gnt_i : in std_logic;
imem_err_i : in std_logic;
dmem_gnt_i : in std_logic;
dmem_err_i : in std_logic;
dmem_sbu_i : in std_logic;
dmem_dbu_i : in std_logic;
-- instruction decode
opcode_i : in std_logic_vector(6 downto 0);
@ -49,7 +49,7 @@ entity control_tmr is
imm_shamt_o : out std_logic;
imm_up_o : out std_logic;
-- register bank
regwr_o : out std_logic;
regwr_o : out std_logic;
-- control transfer
inv_branch_o : out std_logic;
branch_o : out std_logic;
@ -57,9 +57,9 @@ entity control_tmr is
jalr_o : out std_logic;
ecall_o : out std_logic;
-- mem access
memrd_o : out std_logic;
memwr_o : out std_logic;
byte_en_o : out std_logic_vector(1 downto 0);
mem_rd_o : out std_logic;
mem_wr_o : out std_logic;
mem_ben_o : out std_logic_vector(1 downto 0);
mem_usgn_o : out std_logic; -- unsigned data
-- U type
load_upimm_o : out std_logic;
@ -87,8 +87,8 @@ architecture arch of control_tmr is
signal jump_w : tmr_std_logic_t;
signal jalr_w : tmr_std_logic_t;
signal ecall_w : tmr_std_logic_t;
signal memrd_w : tmr_std_logic_t;
signal memwr_w : tmr_std_logic_t;
signal mem_rd_w : tmr_std_logic_t;
signal mem_wr_w : tmr_std_logic_t;
signal mem_usgn_w : tmr_std_logic_t;
signal load_upimm_w : tmr_std_logic_t;
signal auipc_w : tmr_std_logic_t;
@ -110,8 +110,8 @@ architecture arch of control_tmr is
signal corr_jump_w : std_logic;
signal corr_jalr_w : std_logic;
signal corr_ecall_w : std_logic;
signal corr_memrd_w : std_logic;
signal corr_memwr_w : std_logic;
signal corr_mem_rd_w : std_logic;
signal corr_mem_wr_w : std_logic;
signal corr_mem_usgn_w : std_logic;
signal corr_load_upimm_w : std_logic;
signal corr_auipc_w : std_logic;
@ -133,8 +133,8 @@ architecture arch of control_tmr is
signal error_jump_w : std_logic;
signal error_jalr_w : std_logic;
signal error_ecall_w : std_logic;
signal error_memrd_w : std_logic;
signal error_memwr_w : std_logic;
signal error_mem_rd_w : std_logic;
signal error_mem_wr_w : std_logic;
signal error_mem_usgn_w : std_logic;
signal error_load_upimm_w : std_logic;
signal error_auipc_w : std_logic;
@ -149,9 +149,9 @@ architecture arch of control_tmr is
signal error_aluop_w : std_logic;
type tmr_std_logic_2_t is array(2 downto 0) of std_logic_vector(1 downto 0);
signal byte_en_w : tmr_std_logic_2_t;
signal corr_byte_en_w : std_logic_vector(1 downto 0);
signal error_byte_en_w : std_logic;
signal mem_ben_w : tmr_std_logic_2_t;
signal corr_mem_ben_w : std_logic_vector(1 downto 0);
signal error_mem_ben_w : std_logic;
begin
gen_TMR : for i in 2 downto 0 generate
@ -170,43 +170,43 @@ begin
begin
control_i : control
port map (
imem_gnt_i => imem_gnt_i,
imem_err_i => imem_err_i,
dmem_gnt_i => dmem_gnt_i,
dmem_outofrange_i => dmem_outofrange_i,
dmem_sbu_i => dmem_sbu_i,
dmem_dbu_i => dmem_dbu_i,
opcode_i => opcode_i,
funct3_i => funct3_i,
funct7_i => funct7_i,
funct12_i => funct12_i,
rstn_i => rstn_i,
clk_i => clk_i,
start_i => start_i,
imem_req_o => imem_req_w(i),
dmem_req_o => dmem_req_w(i),
update_pc_o => update_pc_w(i),
trap_o => trap_w(i),
aluop_o => aluop_w(i),
alusrc_imm_o => alusrc_imm_w(i),
imm_shamt_o => imm_shamt_w(i),
imm_up_o => imm_up_w(i),
regwr_o => regwr_w(i),
inv_branch_o => inv_branch_w(i),
branch_o => branch_w(i),
jump_o => jump_w(i),
jalr_o => jalr_w(i),
ecall_o => ecall_w(i),
memrd_o => memrd_w(i),
memwr_o => memwr_w(i),
byte_en_o => byte_en_w(i),
mem_usgn_o => mem_usgn_w(i),
load_upimm_o => load_upimm_w(i),
auipc_o => auipc_w(i),
csr_enable_o => csr_enable_w(i),
csr_source_imm_o => csr_source_imm_w(i),
csr_maskop_o => csr_maskop_w(i),
csr_clearop_o => csr_clearop_w(i)
imem_gnt_i => imem_gnt_i,
imem_err_i => imem_err_i,
dmem_gnt_i => dmem_gnt_i,
dmem_err_i => dmem_err_i,
dmem_sbu_i => dmem_sbu_i,
dmem_dbu_i => dmem_dbu_i,
opcode_i => opcode_i,
funct3_i => funct3_i,
funct7_i => funct7_i,
funct12_i => funct12_i,
rstn_i => rstn_i,
clk_i => clk_i,
start_i => start_i,
imem_req_o => imem_req_w(i),
dmem_req_o => dmem_req_w(i),
update_pc_o => update_pc_w(i),
trap_o => trap_w(i),
aluop_o => aluop_w(i),
alusrc_imm_o => alusrc_imm_w(i),
imm_shamt_o => imm_shamt_w(i),
imm_up_o => imm_up_w(i),
regwr_o => regwr_w(i),
inv_branch_o => inv_branch_w(i),
branch_o => branch_w(i),
jump_o => jump_w(i),
jalr_o => jalr_w(i),
ecall_o => ecall_w(i),
mem_rd_o => mem_rd_w(i),
mem_wr_o => mem_wr_w(i),
mem_ben_o => mem_ben_w(i),
mem_usgn_o => mem_usgn_w(i),
load_upimm_o => load_upimm_w(i),
auipc_o => auipc_w(i),
csr_enable_o => csr_enable_w(i),
csr_source_imm_o => csr_source_imm_w(i),
csr_maskop_o => csr_maskop_w(i),
csr_clearop_o => csr_clearop_w(i)
);
end generate;
@ -224,9 +224,9 @@ begin
corr_jump_w <= ( jump_w(2) and jump_w(1)) or ( jump_w(2) and jump_w(0)) or ( jump_w(1) and jump_w(0));
corr_jalr_w <= ( jalr_w(2) and jalr_w(1)) or ( jalr_w(2) and jalr_w(0)) or ( jalr_w(1) and jalr_w(0));
corr_ecall_w <= ( ecall_w(2) and ecall_w(1)) or ( ecall_w(2) and ecall_w(0)) or ( ecall_w(1) and ecall_w(0));
corr_memrd_w <= ( memrd_w(2) and memrd_w(1)) or ( memrd_w(2) and memrd_w(0)) or ( memrd_w(1) and memrd_w(0));
corr_memwr_w <= ( memwr_w(2) and memwr_w(1)) or ( memwr_w(2) and memwr_w(0)) or ( memwr_w(1) and memwr_w(0));
corr_byte_en_w <= ( byte_en_w(2) and byte_en_w(1)) or ( byte_en_w(2) and byte_en_w(0)) or ( byte_en_w(1) and byte_en_w(0));
corr_mem_rd_w <= ( mem_rd_w(2) and mem_rd_w(1)) or ( mem_rd_w(2) and mem_rd_w(0)) or ( mem_rd_w(1) and mem_rd_w(0));
corr_mem_wr_w <= ( mem_wr_w(2) and mem_wr_w(1)) or ( mem_wr_w(2) and mem_wr_w(0)) or ( mem_wr_w(1) and mem_wr_w(0));
corr_mem_ben_w <= ( mem_ben_w(2) and mem_ben_w(1)) or ( mem_ben_w(2) and mem_ben_w(0)) or ( mem_ben_w(1) and mem_ben_w(0));
corr_mem_usgn_w <= ( mem_usgn_w(2) and mem_usgn_w(1)) or ( mem_usgn_w(2) and mem_usgn_w(0)) or ( mem_usgn_w(1) and mem_usgn_w(0));
corr_load_upimm_w <= ( load_upimm_w(2) and load_upimm_w(1)) or ( load_upimm_w(2) and load_upimm_w(0)) or ( load_upimm_w(1) and load_upimm_w(0));
corr_auipc_w <= ( auipc_w(2) and auipc_w(1)) or ( auipc_w(2) and auipc_w(0)) or ( auipc_w(1) and auipc_w(0));
@ -249,9 +249,9 @@ begin
error_jump_w <= ( jump_w(2) xor jump_w(1)) or ( jump_w(2) xor jump_w(0)) or ( jump_w(1) xor jump_w(0));
error_jalr_w <= ( jalr_w(2) xor jalr_w(1)) or ( jalr_w(2) xor jalr_w(0)) or ( jalr_w(1) xor jalr_w(0));
error_ecall_w <= ( ecall_w(2) xor ecall_w(1)) or ( ecall_w(2) xor ecall_w(0)) or ( ecall_w(1) xor ecall_w(0));
error_memrd_w <= ( memrd_w(2) xor memrd_w(1)) or ( memrd_w(2) xor memrd_w(0)) or ( memrd_w(1) xor memrd_w(0));
error_memwr_w <= ( memwr_w(2) xor memwr_w(1)) or ( memwr_w(2) xor memwr_w(0)) or ( memwr_w(1) xor memwr_w(0));
error_byte_en_w <= or_reduce(( byte_en_w(2) xor byte_en_w(1)) or ( byte_en_w(2) xor byte_en_w(0)) or ( byte_en_w(1) xor byte_en_w(0)));
error_mem_rd_w <= ( mem_rd_w(2) xor mem_rd_w(1)) or ( mem_rd_w(2) xor mem_rd_w(0)) or ( mem_rd_w(1) xor mem_rd_w(0));
error_mem_wr_w <= ( mem_wr_w(2) xor mem_wr_w(1)) or ( mem_wr_w(2) xor mem_wr_w(0)) or ( mem_wr_w(1) xor mem_wr_w(0));
error_mem_ben_w <= or_reduce((mem_ben_w(2) xor mem_ben_w(1)) or (mem_ben_w(2) xor mem_ben_w(0)) or ( mem_ben_w(1) xor mem_ben_w(0)));
error_mem_usgn_w <= ( mem_usgn_w(2) xor mem_usgn_w(1)) or ( mem_usgn_w(2) xor mem_usgn_w(0)) or ( mem_usgn_w(1) xor mem_usgn_w(0));
error_load_upimm_w <= ( load_upimm_w(2) xor load_upimm_w(1)) or ( load_upimm_w(2) xor load_upimm_w(0)) or ( load_upimm_w(1) xor load_upimm_w(0));
error_auipc_w <= ( auipc_w(2) xor auipc_w(1)) or ( auipc_w(2) xor auipc_w(0)) or ( auipc_w(1) xor auipc_w(0));
@ -265,8 +265,8 @@ begin
error_trap_w or error_aluop_w or error_alusrc_imm_w or
error_imm_shamt_w or error_imm_up_w or error_regwr_w or
error_inv_branch_w or error_branch_w or error_jump_w or
error_jalr_w or error_ecall_w or error_memrd_w or
error_memwr_w or error_byte_en_w or error_mem_usgn_w or
error_jalr_w or error_ecall_w or error_mem_rd_w or
error_mem_wr_w or error_mem_ben_w or error_mem_usgn_w or
error_load_upimm_w or error_auipc_w or error_csr_enable_w or
error_csr_source_imm_w or error_csr_maskop_w or error_csr_clearop_w;
@ -285,9 +285,9 @@ begin
jump_o <= corr_jump_w when correct_error_i = '1' else jump_w (0);
jalr_o <= corr_jalr_w when correct_error_i = '1' else jalr_w (0);
ecall_o <= corr_ecall_w when correct_error_i = '1' else ecall_w (0);
memrd_o <= corr_memrd_w when correct_error_i = '1' else memrd_w (0);
memwr_o <= corr_memwr_w when correct_error_i = '1' else memwr_w (0);
byte_en_o <= corr_byte_en_w when correct_error_i = '1' else byte_en_w (0);
mem_rd_o <= corr_mem_rd_w when correct_error_i = '1' else mem_rd_w (0);
mem_wr_o <= corr_mem_wr_w when correct_error_i = '1' else mem_wr_w (0);
mem_ben_o <= corr_mem_ben_w when correct_error_i = '1' else mem_ben_w (0);
mem_usgn_o <= corr_mem_usgn_w when correct_error_i = '1' else mem_usgn_w (0);
load_upimm_o <= corr_load_upimm_w when correct_error_i = '1' else load_upimm_w (0);
auipc_o <= corr_auipc_w when correct_error_i = '1' else auipc_w (0);

View file

@ -23,24 +23,24 @@ entity harv is
poweron_rstn_i : in std_logic;
wdt_rstn_i : in std_logic;
-- INSTRUCTION MEMORY
imem_instr_i : in std_logic_vector(31 downto 0);
imem_instr_i : in std_logic_vector(31 downto 0);
imem_pc_o : out std_logic_vector(31 downto 0);
imem_req_o : out std_logic;
imem_gnt_i : in std_logic;
imem_err_i : in std_logic;
imem_gnt_i : in std_logic;
imem_err_i : in std_logic;
-- DATA MEMORY
hard_dmem_o : out std_logic;
dmem_data_i : in std_logic_vector(31 downto 0);
dmem_req_o : out std_logic;
dmem_wren_o : out std_logic;
dmem_gnt_i : in std_logic;
dmem_outofrange_i : in std_logic;
dmem_sbu_i : in std_logic;
dmem_dbu_i : in std_logic;
dmem_byte_en_o : out std_logic_vector(1 downto 0);
dmem_usgn_dat_o : out std_logic;
dmem_data_o : out std_logic_vector(31 downto 0);
dmem_addr_o : out std_logic_vector(31 downto 0)
hard_dmem_o : out std_logic;
dmem_req_o : out std_logic;
dmem_wren_o : out std_logic;
dmem_ben_o : out std_logic_vector(1 downto 0);
dmem_usgn_o : out std_logic;
dmem_addr_o : out std_logic_vector(31 downto 0);
dmem_wdata_o : out std_logic_vector(31 downto 0);
dmem_gnt_i : in std_logic;
dmem_err_i : in std_logic;
dmem_sbu_i : in std_logic;
dmem_dbu_i : in std_logic;
dmem_rdata_i : in std_logic_vector(31 downto 0)
);
end entity;
@ -80,9 +80,9 @@ architecture arch of harv is
signal ctl_jump_w : std_logic;
signal ctl_jalr_w : std_logic;
signal ctl_ecall_w : std_logic;
signal ctl_memrd_w : std_logic;
signal ctl_memwr_w : std_logic;
signal ctl_byte_en_w : std_logic_vector(1 downto 0);
signal ctl_mem_rd_w : std_logic;
signal ctl_mem_wr_w : std_logic;
signal ctl_mem_ben_w : std_logic_vector(1 downto 0);
signal ctl_mem_usgn_w : std_logic;
signal ctl_load_upimm_w : std_logic;
signal ctl_auipc_w : std_logic;
@ -92,9 +92,9 @@ architecture arch of harv is
signal ctl_csr_clearop_w : std_logic;
signal instr_w : std_logic_vector(31 downto 0);
------------- REGFILE -------------
signal data_wr_w : std_logic_vector(31 downto 0);
signal reg_data1_w : std_logic_vector(31 downto 0);
signal reg_data2_w : std_logic_vector(31 downto 0);
signal data_wr_w : std_logic_vector(31 downto 0);
signal reg_data1_w : std_logic_vector(31 downto 0);
signal reg_data2_w : std_logic_vector(31 downto 0);
-------------- ALU -----------------
signal alu_data1_w : std_logic_vector(31 downto 0);
signal alu_data2_w : std_logic_vector(31 downto 0);
@ -115,8 +115,8 @@ architecture arch of harv is
signal reg2_sbu_w : std_logic;
signal reg2_dbu_w : std_logic;
-- signal pc_cen_w : std_logic;
signal pc_sbu_w : std_logic;
signal pc_dbu_w : std_logic;
signal pc_sbu_w : std_logic;
signal pc_dbu_w : std_logic;
signal control_err_w : std_logic;
signal alu_err_w : std_logic;
@ -131,25 +131,25 @@ begin
HAMMING_PC => HAMMING_PC
)
port map (
branch_imm_i => imm_branch_w,
jump_imm_i => alu_data_w,
inv_branch_i => ctl_inv_branch_w,
branch_i => ctl_branch_w,
zero_i => alu_zero_w,
jump_i => ctl_jump_w,
ecall_i => ctl_ecall_w,
branch_imm_i => imm_branch_w,
jump_imm_i => alu_data_w,
inv_branch_i => ctl_inv_branch_w,
branch_i => ctl_branch_w,
zero_i => alu_zero_w,
jump_i => ctl_jump_w,
ecall_i => ctl_ecall_w,
correct_error_i => hard_pc_w,
instr_gnt_i => imem_gnt_i,
instr_i => imem_instr_i,
rstn_i => rstn_i,
clk_i => clk_w,
update_pc_i => update_pc_w,
trap_i => trap_w,
instr_o => instr_w,
sbu_o => pc_sbu_w,
dbu_o => pc_dbu_w,
pc_o => if_pc_w,
pc_4_o => if_pc_4_w
instr_gnt_i => imem_gnt_i,
instr_i => imem_instr_i,
rstn_i => rstn_i,
clk_i => clk_w,
update_pc_i => update_pc_w,
trap_i => trap_w,
instr_o => instr_w,
sbu_o => pc_sbu_w,
dbu_o => pc_dbu_w,
pc_o => if_pc_w,
pc_4_o => if_pc_4_w
);
imem_pc_o <= if_pc_w;
@ -171,20 +171,20 @@ begin
control_i : control_tmr
port map (
start_i => start_i,
imem_gnt_i => imem_gnt_i,
imem_err_i => imem_err_i,
dmem_gnt_i => dmem_gnt_i,
dmem_outofrange_i => dmem_outofrange_i,
dmem_sbu_i => dmem_sbu_i and dmem_gnt_i and not ctl_memwr_w,
dmem_dbu_i => dmem_dbu_i and dmem_gnt_i and not ctl_memwr_w,
imem_gnt_i => imem_gnt_i,
imem_err_i => imem_err_i,
dmem_gnt_i => dmem_gnt_i,
dmem_err_i => dmem_err_i,
dmem_sbu_i => dmem_sbu_i and dmem_gnt_i and ctl_mem_rd_w,
dmem_dbu_i => dmem_dbu_i and dmem_gnt_i and ctl_mem_rd_w,
opcode_i => opcode_w,
funct3_i => funct3_w,
funct7_i => funct7_w,
funct12_i => funct12_w,
rstn_i => rstn_i,
clk_i => clk_i,
imem_req_o => imem_req_o,
dmem_req_o => dmem_req_o,
imem_req_o => imem_req_o,
dmem_req_o => dmem_req_o,
update_pc_o => update_pc_w,
trap_o => trap_w,
aluop_o => ctl_aluop_w,
@ -197,9 +197,9 @@ begin
jump_o => ctl_jump_w,
jalr_o => ctl_jalr_w,
ecall_o => ctl_ecall_w,
memrd_o => ctl_memrd_w,
memwr_o => ctl_memwr_w,
byte_en_o => ctl_byte_en_w,
mem_rd_o => ctl_mem_rd_w,
mem_wr_o => ctl_mem_wr_w,
mem_ben_o => ctl_mem_ben_w,
mem_usgn_o => ctl_mem_usgn_w,
load_upimm_o => ctl_load_upimm_w,
auipc_o => ctl_auipc_w,
@ -215,57 +215,57 @@ begin
control_i : control
port map (
-- processor status
start_i => start_i,
imem_gnt_i => imem_gnt_i,
imem_err_i => imem_err_i,
dmem_gnt_i => dmem_gnt_i,
dmem_outofrange_i => dmem_outofrange_i,
dmem_sbu_i => dmem_sbu_i,
dmem_dbu_i => dmem_dbu_i,
start_i => start_i,
imem_gnt_i => imem_gnt_i,
imem_err_i => imem_err_i,
dmem_gnt_i => dmem_gnt_i,
dmem_err_i => dmem_err_i,
dmem_sbu_i => dmem_sbu_i,
dmem_dbu_i => dmem_dbu_i,
-- instruction decode
opcode_i => opcode_w,
funct3_i => funct3_w,
funct7_i => funct7_w,
funct12_i => funct12_w,
opcode_i => opcode_w,
funct3_i => funct3_w,
funct7_i => funct7_w,
funct12_i => funct12_w,
rstn_i => rstn_i,
clk_i => clk_i,
rstn_i => rstn_i,
clk_i => clk_i,
-- processor status
imem_req_o => imem_req_o,
dmem_req_o => dmem_req_o,
imem_req_o => imem_req_o,
dmem_req_o => dmem_req_o,
update_pc_o => update_pc_w,
trap_o => trap_w,
-- instruction decode
aluop_o => ctl_aluop_w,
alusrc_imm_o => ctl_alusrc_imm_w,
imm_shamt_o => ctl_imm_shamt_w,
imm_up_o => ctl_imm_up_w,
regwr_o => ctl_regwr_w,
inv_branch_o => ctl_inv_branch_w,
branch_o => ctl_branch_w,
jump_o => ctl_jump_w,
jalr_o => ctl_jalr_w,
ecall_o => ctl_ecall_w,
memrd_o => ctl_memrd_w,
memwr_o => ctl_memwr_w,
byte_en_o => ctl_byte_en_w,
mem_usgn_o => ctl_mem_usgn_w,
load_upimm_o => ctl_load_upimm_w,
auipc_o => ctl_auipc_w,
csr_enable_o => ctl_csr_enable_w,
csr_source_imm_o => ctl_csr_source_imm_w,
csr_maskop_o => ctl_csr_maskop_w,
csr_clearop_o => ctl_csr_clearop_w
aluop_o => ctl_aluop_w,
alusrc_imm_o => ctl_alusrc_imm_w,
imm_shamt_o => ctl_imm_shamt_w,
imm_up_o => ctl_imm_up_w,
regwr_o => ctl_regwr_w,
inv_branch_o => ctl_inv_branch_w,
branch_o => ctl_branch_w,
jump_o => ctl_jump_w,
jalr_o => ctl_jalr_w,
ecall_o => ctl_ecall_w,
mem_rd_o => ctl_mem_rd_w,
mem_wr_o => ctl_mem_wr_w,
mem_ben_o => ctl_mem_ben_w,
mem_usgn_o => ctl_mem_usgn_w,
load_upimm_o => ctl_load_upimm_w,
auipc_o => ctl_auipc_w,
csr_enable_o => ctl_csr_enable_w,
csr_source_imm_o => ctl_csr_source_imm_w,
csr_maskop_o => ctl_csr_maskop_w,
csr_clearop_o => ctl_csr_clearop_w
);
end generate;
data_wr_w <= dmem_data_i when ctl_memrd_w = '1' else
imm_w when ctl_load_upimm_w = '1' else
if_pc_4_w when ctl_jump_w = '1' else
csr_rdata_w when ctl_csr_enable_w = '1' else
data_wr_w <= dmem_rdata_i when ctl_mem_rd_w = '1' else
imm_w when ctl_load_upimm_w = '1' else
if_pc_4_w when ctl_jump_w = '1' else
csr_rdata_w when ctl_csr_enable_w = '1' else
alu_data_w;
regfile_i : regfile
@ -288,27 +288,26 @@ begin
data2_o => reg_data2_w
);
imm_sel_w <= ctl_imm_shamt_w & ctl_imm_up_w & ctl_memwr_w & (ctl_jump_w and not ctl_jalr_w);
imm_sel_w <= ctl_imm_shamt_w & ctl_imm_up_w & ctl_mem_wr_w & (ctl_jump_w and not ctl_jalr_w);
with imm_sel_w select imm_w <=
std_logic_vector(resize(unsigned(imm_shamt_w), 32)) when "1000", -- ctl_imm_shamt_w = '1' else
std_logic_vector(shift_left(resize(signed(imm_up_w), 32), 12)) when "0100", -- ctl_imm_up_w = '1' else
std_logic_vector(resize(signed(imm_store_w), 32)) when "0010", -- ctl_memwr_w = '1' else
std_logic_vector(resize(signed(imm_store_w), 32)) when "0010", -- ctl_mem_wr_w = '1' else
std_logic_vector(resize(signed(imm_upj_w), 32)) when "0001", -- (ctl_jump_w and not ctl_jalr_w) = '1' else
std_logic_vector(resize(signed(imm_i_w), 32)) when others;
alu_data1_w <= if_pc_w when (ctl_auipc_w or (ctl_jump_w and not ctl_jalr_w)) = '1' else
reg_data1_w;
alu_data2_w <= imm_w when ctl_alusrc_imm_w = '1' else reg_data2_w;
alu_data1_w <= if_pc_w when (ctl_auipc_w or (ctl_jump_w and not ctl_jalr_w)) = '1' else reg_data1_w;
alu_data2_w <= imm_w when ctl_alusrc_imm_w = '1' else reg_data2_w;
gen_ft_alu : if TMR_ALU generate
alu_i : alu_tmr
port map (
data1_i => alu_data1_w,
data2_i => alu_data2_w,
operation_i => ctl_aluop_w,
zero_o => alu_zero_w,
data_o => alu_data_w,
data1_i => alu_data1_w,
data2_i => alu_data2_w,
operation_i => ctl_aluop_w,
zero_o => alu_zero_w,
data_o => alu_data_w,
correct_error_i => hard_alu_w,
error_o => alu_err_w
);
@ -325,10 +324,10 @@ begin
end generate;
---------- CSR registers ---------
csr_ucause_w <= x"00000010" when dmem_sbu_i = '1' else -- SBU
x"00000020" when dmem_dbu_i = '1' else -- DBU
x"00000007" when ctl_memwr_w = '1' else -- store address fault
x"00000005"; -- load address fault
csr_ucause_w <= x"00000010" when dmem_sbu_i = '1' else -- SBU
x"00000020" when dmem_dbu_i = '1' else -- DBU
x"00000007" when ctl_mem_wr_w = '1' else -- store address fault
x"00000005"; -- when ctl_mem_rd_w = '1' -- load address fault
csr_i : csr
generic map (
TMR_CONTROL => TMR_CONTROL,
@ -366,7 +365,7 @@ begin
pc_cen_i => update_pc_w,
pc_sbu_i => pc_sbu_w,
pc_dbu_i => pc_dbu_w,
dmem_cen_i => dmem_gnt_i and not ctl_memwr_w,
dmem_cen_i => dmem_gnt_i and not ctl_mem_wr_w,
dmem_sbu_i => dmem_sbu_i,
dmem_dbu_i => dmem_dbu_i,
control_cen_i => '1',
@ -387,10 +386,10 @@ begin
-------- DATA MEMORY --------
-- output signals
-- dmem_req_o is set by the control unit
dmem_wren_o <= ctl_memwr_w;
dmem_byte_en_o <= ctl_byte_en_w;
dmem_usgn_dat_o <= ctl_mem_usgn_w;
dmem_data_o <= reg_data2_w;
dmem_addr_o <= alu_data_w;
dmem_wren_o <= ctl_mem_wr_w;
dmem_ben_o <= ctl_mem_ben_w;
dmem_usgn_o <= ctl_mem_usgn_w;
dmem_wdata_o <= reg_data2_w;
dmem_addr_o <= alu_data_w;
end architecture;

View file

@ -20,85 +20,85 @@ package harv_pkg is
------- COMPONENTS -----
component harv
generic (
PROGRAM_START_ADDR : std_logic_vector(31 downto 0);
TRAP_HANDLER_ADDR : std_logic_vector(31 downto 0);
TMR_CONTROL : boolean;
TMR_ALU : boolean;
HAMMING_REGFILE : boolean;
HAMMING_PC : boolean
PROGRAM_START_ADDR : std_logic_vector(31 downto 0);
TRAP_HANDLER_ADDR : std_logic_vector(31 downto 0);
TMR_CONTROL : boolean;
TMR_ALU : boolean;
HAMMING_REGFILE : boolean;
HAMMING_PC : boolean
);
port (
rstn_i : in std_logic;
clk_i : in std_logic;
start_i : in std_logic;
poweron_rstn_i : in std_logic;
wdt_rstn_i : in std_logic;
imem_instr_i : in std_logic_vector(31 downto 0);
imem_pc_o : out std_logic_vector(31 downto 0);
imem_req_o : out std_logic;
imem_gnt_i : in std_logic;
imem_err_i : in std_logic;
hard_dmem_o : out std_logic;
dmem_data_i : in std_logic_vector(31 downto 0);
dmem_req_o : out std_logic;
dmem_wren_o : out std_logic;
dmem_gnt_i : in std_logic;
dmem_outofrange_i : in std_logic;
dmem_sbu_i : in std_logic;
dmem_dbu_i : in std_logic;
dmem_byte_en_o : out std_logic_vector(1 downto 0);
dmem_usgn_dat_o : out std_logic;
dmem_data_o : out std_logic_vector(31 downto 0);
dmem_addr_o : out std_logic_vector(31 downto 0)
rstn_i : in std_logic;
clk_i : in std_logic;
start_i : in std_logic;
poweron_rstn_i : in std_logic;
wdt_rstn_i : in std_logic;
imem_instr_i : in std_logic_vector(31 downto 0);
imem_pc_o : out std_logic_vector(31 downto 0);
imem_req_o : out std_logic;
imem_gnt_i : in std_logic;
imem_err_i : in std_logic;
hard_dmem_o : out std_logic;
dmem_req_o : out std_logic;
dmem_wren_o : out std_logic;
dmem_ben_o : out std_logic_vector(1 downto 0);
dmem_usgn_o : out std_logic;
dmem_addr_o : out std_logic_vector(31 downto 0);
dmem_wdata_o : out std_logic_vector(31 downto 0);
dmem_gnt_i : in std_logic;
dmem_err_i : in std_logic;
dmem_sbu_i : in std_logic;
dmem_dbu_i : in std_logic;
dmem_rdata_i : in std_logic_vector(31 downto 0)
);
end component harv;
component control
port (
imem_gnt_i : in std_logic;
imem_err_i : in std_logic;
dmem_gnt_i : in std_logic;
dmem_outofrange_i : in std_logic;
dmem_sbu_i : in std_logic;
dmem_dbu_i : in std_logic;
opcode_i : in std_logic_vector(6 downto 0);
funct3_i : in std_logic_vector(2 downto 0);
funct7_i : in std_logic_vector(6 downto 0);
funct12_i : in std_logic_vector(11 downto 0);
rstn_i : in std_logic;
clk_i : in std_logic;
start_i : in std_logic;
imem_req_o : out std_logic;
dmem_req_o : out std_logic;
update_pc_o : out std_logic;
trap_o : out std_logic;
aluop_o : out std_logic_vector(ALUOP_SIZE-1 downto 0);
alusrc_imm_o : out std_logic;
imm_shamt_o : out std_logic;
imm_up_o : out std_logic;
regwr_o : out std_logic;
inv_branch_o : out std_logic;
branch_o : out std_logic;
jump_o : out std_logic;
jalr_o : out std_logic;
ecall_o : out std_logic;
memrd_o : out std_logic;
memwr_o : out std_logic;
byte_en_o : out std_logic_vector(1 downto 0);
mem_usgn_o : out std_logic;
load_upimm_o : out std_logic;
auipc_o : out std_logic;
csr_enable_o : out std_logic;
csr_source_imm_o : out std_logic;
csr_maskop_o : out std_logic;
csr_clearop_o : out std_logic
imem_gnt_i : in std_logic;
imem_err_i : in std_logic;
dmem_gnt_i : in std_logic;
dmem_err_i : in std_logic;
dmem_sbu_i : in std_logic;
dmem_dbu_i : in std_logic;
opcode_i : in std_logic_vector(6 downto 0);
funct3_i : in std_logic_vector(2 downto 0);
funct7_i : in std_logic_vector(6 downto 0);
funct12_i : in std_logic_vector(11 downto 0);
rstn_i : in std_logic;
clk_i : in std_logic;
start_i : in std_logic;
imem_req_o : out std_logic;
dmem_req_o : out std_logic;
update_pc_o : out std_logic;
trap_o : out std_logic;
aluop_o : out std_logic_vector(ALUOP_SIZE-1 downto 0);
alusrc_imm_o : out std_logic;
imm_shamt_o : out std_logic;
imm_up_o : out std_logic;
regwr_o : out std_logic;
inv_branch_o : out std_logic;
branch_o : out std_logic;
jump_o : out std_logic;
jalr_o : out std_logic;
ecall_o : out std_logic;
mem_rd_o : out std_logic;
mem_wr_o : out std_logic;
mem_ben_o : out std_logic_vector(1 downto 0);
mem_usgn_o : out std_logic;
load_upimm_o : out std_logic;
auipc_o : out std_logic;
csr_enable_o : out std_logic;
csr_source_imm_o : out std_logic;
csr_maskop_o : out std_logic;
csr_clearop_o : out std_logic
);
end component control;
component instr_fetch
generic (
PROGRAM_START_ADDR : std_logic_vector;
TRAP_HANDLER_ADDR : std_logic_vector;
PROGRAM_START_ADDR : std_logic_vector(31 downto 0);
TRAP_HANDLER_ADDR : std_logic_vector(31 downto 0);
HAMMING_PC : boolean
);
port (
@ -208,45 +208,45 @@ package harv_pkg is
------------- FAULT TOLERANT COMPONENTS --------------------
component control_tmr
port (
imem_gnt_i : in std_logic;
imem_err_i : in std_logic;
dmem_gnt_i : in std_logic;
dmem_outofrange_i : in std_logic;
dmem_sbu_i : in std_logic;
dmem_dbu_i : in std_logic;
opcode_i : in std_logic_vector(6 downto 0);
funct3_i : in std_logic_vector(2 downto 0);
funct7_i : in std_logic_vector(6 downto 0);
funct12_i : in std_logic_vector(11 downto 0);
correct_error_i : in std_logic;
rstn_i : in std_logic;
clk_i : in std_logic;
start_i : in std_logic;
imem_req_o : out std_logic;
dmem_req_o : out std_logic;
update_pc_o : out std_logic;
trap_o : out std_logic;
error_o : out std_logic;
aluop_o : out std_logic_vector(ALUOP_SIZE-1 downto 0);
alusrc_imm_o : out std_logic;
imm_shamt_o : out std_logic;
imm_up_o : out std_logic;
regwr_o : out std_logic;
inv_branch_o : out std_logic;
branch_o : out std_logic;
jump_o : out std_logic;
jalr_o : out std_logic;
ecall_o : out std_logic;
memrd_o : out std_logic;
memwr_o : out std_logic;
byte_en_o : out std_logic_vector(1 downto 0);
mem_usgn_o : out std_logic;
load_upimm_o : out std_logic;
auipc_o : out std_logic;
csr_enable_o : out std_logic;
csr_source_imm_o : out std_logic;
csr_maskop_o : out std_logic;
csr_clearop_o : out std_logic
imem_gnt_i : in std_logic;
imem_err_i : in std_logic;
dmem_gnt_i : in std_logic;
dmem_err_i : in std_logic;
dmem_sbu_i : in std_logic;
dmem_dbu_i : in std_logic;
opcode_i : in std_logic_vector(6 downto 0);
funct3_i : in std_logic_vector(2 downto 0);
funct7_i : in std_logic_vector(6 downto 0);
funct12_i : in std_logic_vector(11 downto 0);
correct_error_i : in std_logic;
rstn_i : in std_logic;
clk_i : in std_logic;
start_i : in std_logic;
imem_req_o : out std_logic;
dmem_req_o : out std_logic;
update_pc_o : out std_logic;
trap_o : out std_logic;
error_o : out std_logic;
aluop_o : out std_logic_vector(ALUOP_SIZE-1 downto 0);
alusrc_imm_o : out std_logic;
imm_shamt_o : out std_logic;
imm_up_o : out std_logic;
regwr_o : out std_logic;
inv_branch_o : out std_logic;
branch_o : out std_logic;
jump_o : out std_logic;
jalr_o : out std_logic;
ecall_o : out std_logic;
mem_rd_o : out std_logic;
mem_wr_o : out std_logic;
mem_ben_o : out std_logic_vector(1 downto 0);
mem_usgn_o : out std_logic;
load_upimm_o : out std_logic;
auipc_o : out std_logic;
csr_enable_o : out std_logic;
csr_source_imm_o : out std_logic;
csr_maskop_o : out std_logic;
csr_clearop_o : out std_logic
);
end component control_tmr;