| 1 |
5 |
sergeykhbr |
-----------------------------------------------------------------------------
|
| 2 |
|
|
--! @file
|
| 3 |
|
|
--! @copyright Copyright 2016 GNSS Sensor Ltd. All right reserved.
|
| 4 |
|
|
--! @author Sergey Khabarov - sergeykhbr@gmail.com
|
| 5 |
|
|
--! @brief "River" CPU internal configuration parameters that don't
|
| 6 |
|
|
--! depend of external bus.
|
| 7 |
|
|
-----------------------------------------------------------------------------
|
| 8 |
|
|
|
| 9 |
|
|
--! Standard library.
|
| 10 |
|
|
library ieee;
|
| 11 |
|
|
use ieee.std_logic_1164.all;
|
| 12 |
|
|
use ieee.numeric_std.all;
|
| 13 |
|
|
library commonlib;
|
| 14 |
|
|
use commonlib.types_common.all;
|
| 15 |
|
|
|
| 16 |
|
|
--! @brief Library global parameters.
|
| 17 |
|
|
package river_cfg is
|
| 18 |
|
|
|
| 19 |
|
|
--! Architecture size difinition.
|
| 20 |
|
|
constant RISCV_ARCH : integer := 64;
|
| 21 |
|
|
|
| 22 |
|
|
--! @name System bus parameters
|
| 23 |
|
|
--! @brief Constants specify AXI bus global settigns
|
| 24 |
|
|
--! @{
|
| 25 |
|
|
|
| 26 |
|
|
--! @brief Address bus bit-size.
|
| 27 |
|
|
constant BUS_ADDR_WIDTH : integer := 32;
|
| 28 |
|
|
--! @brief Data bus bit-size.
|
| 29 |
|
|
constant BUS_DATA_WIDTH : integer := 64;
|
| 30 |
|
|
--! @brief Num of data bytes per transaction.
|
| 31 |
|
|
constant BUS_DATA_BYTES : integer := BUS_DATA_WIDTH / 8;
|
| 32 |
|
|
--! @}
|
| 33 |
|
|
|
| 34 |
|
|
--! @name Encoded Memory operation size values
|
| 35 |
|
|
--! @{
|
| 36 |
|
|
|
| 37 |
|
|
constant MEMOP_8B : std_logic_vector(1 downto 0) := "11";
|
| 38 |
|
|
constant MEMOP_4B : std_logic_vector(1 downto 0) := "10";
|
| 39 |
|
|
constant MEMOP_2B : std_logic_vector(1 downto 0) := "01";
|
| 40 |
|
|
constant MEMOP_1B : std_logic_vector(1 downto 0) := "00";
|
| 41 |
|
|
--! @}
|
| 42 |
|
|
|
| 43 |
|
|
constant RESET_VECTOR : std_logic_vector(BUS_ADDR_WIDTH-1 downto 0) := X"00000040";
|
| 44 |
|
|
constant DBG_FETCH_TRACE_SIZE : integer := 4;
|
| 45 |
|
|
|
| 46 |
|
|
--! Number of elements each 2*CFG_ADDR_WIDTH in stack trace buffer, 0 = disabled
|
| 47 |
|
|
constant CFG_STACK_TRACE_BUF_SIZE : integer := 32;
|
| 48 |
|
|
|
| 49 |
|
|
--! @name Integer Registers specified by ISA
|
| 50 |
|
|
--! @{
|
| 51 |
|
|
constant Reg_Zero : integer := 0;
|
| 52 |
|
|
constant Reg_ra : integer := 1; -- [1] Return address
|
| 53 |
|
|
constant Reg_sp : integer := 2; -- [2] Stack pointer
|
| 54 |
|
|
constant Reg_gp : integer := 3; -- [3] Global pointer
|
| 55 |
|
|
constant Reg_tp : integer := 4; -- [4] Thread pointer
|
| 56 |
|
|
constant Reg_t0 : integer := 5; -- [5] Temporaries 0 s3
|
| 57 |
|
|
constant Reg_t1 : integer := 6; -- [6] Temporaries 1 s4
|
| 58 |
|
|
constant Reg_t2 : integer := 7; -- [7] Temporaries 2 s5
|
| 59 |
|
|
constant Reg_s0 : integer := 8; -- [8] s0/fp Saved register/frame pointer
|
| 60 |
|
|
constant Reg_s1 : integer := 9; -- [9] Saved register 1
|
| 61 |
|
|
constant Reg_a0 : integer := 10; -- [10] Function argumentes 0
|
| 62 |
|
|
constant Reg_a1 : integer := 11; -- [11] Function argumentes 1
|
| 63 |
|
|
constant Reg_a2 : integer := 12; -- [12] Function argumentes 2
|
| 64 |
|
|
constant Reg_a3 : integer := 13; -- [13] Function argumentes 3
|
| 65 |
|
|
constant Reg_a4 : integer := 14; -- [14] Function argumentes 4
|
| 66 |
|
|
constant Reg_a5 : integer := 15; -- [15] Function argumentes 5
|
| 67 |
|
|
constant Reg_a6 : integer := 16; -- [16] Function argumentes 6
|
| 68 |
|
|
constant Reg_a7 : integer := 17; -- [17] Function argumentes 7
|
| 69 |
|
|
constant Reg_s2 : integer := 18; -- [18] Saved register 2
|
| 70 |
|
|
constant Reg_s3 : integer := 19; -- [19] Saved register 3
|
| 71 |
|
|
constant Reg_s4 : integer := 20; -- [20] Saved register 4
|
| 72 |
|
|
constant Reg_s5 : integer := 21; -- [21] Saved register 5
|
| 73 |
|
|
constant Reg_s6 : integer := 22; -- [22] Saved register 6
|
| 74 |
|
|
constant Reg_s7 : integer := 23; -- [23] Saved register 7
|
| 75 |
|
|
constant Reg_s8 : integer := 24; -- [24] Saved register 8
|
| 76 |
|
|
constant Reg_s9 : integer := 25; -- [25] Saved register 9
|
| 77 |
|
|
constant Reg_s10 : integer := 26; -- [26] Saved register 10
|
| 78 |
|
|
constant Reg_s11 : integer := 27; -- [27] Saved register 11
|
| 79 |
|
|
constant Reg_t3 : integer := 28; -- [28]
|
| 80 |
|
|
constant Reg_t4 : integer := 29; -- [29]
|
| 81 |
|
|
constant Reg_t5 : integer := 30; -- [30]
|
| 82 |
|
|
constant Reg_t6 : integer := 31; -- [31]
|
| 83 |
|
|
constant Reg_Total : integer := 32;
|
| 84 |
|
|
--! @}
|
| 85 |
|
|
|
| 86 |
|
|
--! @name Instruction formats specified by ISA specification
|
| 87 |
|
|
--! @{
|
| 88 |
|
|
constant ISA_R_type : integer := 0;
|
| 89 |
|
|
constant ISA_I_type : integer := 1;
|
| 90 |
|
|
constant ISA_S_type : integer := 2;
|
| 91 |
|
|
constant ISA_SB_type : integer := 3;
|
| 92 |
|
|
constant ISA_U_type : integer := 4;
|
| 93 |
|
|
constant ISA_UJ_type : integer := 5;
|
| 94 |
|
|
constant ISA_Total : integer := 6;
|
| 95 |
|
|
--! @}
|
| 96 |
|
|
|
| 97 |
|
|
|
| 98 |
|
|
--! @name Implemented instruction list and its indexes
|
| 99 |
|
|
--! @{
|
| 100 |
|
|
constant Instr_ADD : integer := 0;
|
| 101 |
|
|
constant Instr_ADDI : integer := 1;
|
| 102 |
|
|
constant Instr_ADDIW : integer := 2;
|
| 103 |
|
|
constant Instr_ADDW : integer := 3;
|
| 104 |
|
|
constant Instr_AND : integer := 4;
|
| 105 |
|
|
constant Instr_ANDI : integer := 5;
|
| 106 |
|
|
constant Instr_AUIPC : integer := 6;
|
| 107 |
|
|
constant Instr_BEQ : integer := 7;
|
| 108 |
|
|
constant Instr_BGE : integer := 8;
|
| 109 |
|
|
constant Instr_BGEU : integer := 9;
|
| 110 |
|
|
constant Instr_BLT : integer := 10;
|
| 111 |
|
|
constant Instr_BLTU : integer := 11;
|
| 112 |
|
|
constant Instr_BNE : integer := 12;
|
| 113 |
|
|
constant Instr_JAL : integer := 13;
|
| 114 |
|
|
constant Instr_JALR : integer := 14;
|
| 115 |
|
|
constant Instr_LB : integer := 15;
|
| 116 |
|
|
constant Instr_LH : integer := 16;
|
| 117 |
|
|
constant Instr_LW : integer := 17;
|
| 118 |
|
|
constant Instr_LD : integer := 18;
|
| 119 |
|
|
constant Instr_LBU : integer := 19;
|
| 120 |
|
|
constant Instr_LHU : integer := 20;
|
| 121 |
|
|
constant Instr_LWU : integer := 21;
|
| 122 |
|
|
constant Instr_LUI : integer := 22;
|
| 123 |
|
|
constant Instr_OR : integer := 23;
|
| 124 |
|
|
constant Instr_ORI : integer := 24;
|
| 125 |
|
|
constant Instr_SLLI : integer := 25;
|
| 126 |
|
|
constant Instr_SLT : integer := 26;
|
| 127 |
|
|
constant Instr_SLTI : integer := 27;
|
| 128 |
|
|
constant Instr_SLTU : integer := 28;
|
| 129 |
|
|
constant Instr_SLTIU : integer := 29;
|
| 130 |
|
|
constant Instr_SLL : integer := 30;
|
| 131 |
|
|
constant Instr_SLLW : integer := 31;
|
| 132 |
|
|
constant Instr_SLLIW : integer := 32;
|
| 133 |
|
|
constant Instr_SRA : integer := 33;
|
| 134 |
|
|
constant Instr_SRAW : integer := 34;
|
| 135 |
|
|
constant Instr_SRAI : integer := 35;
|
| 136 |
|
|
constant Instr_SRAIW : integer := 36;
|
| 137 |
|
|
constant Instr_SRL : integer := 37;
|
| 138 |
|
|
constant Instr_SRLI : integer := 38;
|
| 139 |
|
|
constant Instr_SRLIW : integer := 39;
|
| 140 |
|
|
constant Instr_SRLW : integer := 40;
|
| 141 |
|
|
constant Instr_SB : integer := 41;
|
| 142 |
|
|
constant Instr_SH : integer := 42;
|
| 143 |
|
|
constant Instr_SW : integer := 43;
|
| 144 |
|
|
constant Instr_SD : integer := 44;
|
| 145 |
|
|
constant Instr_SUB : integer := 45;
|
| 146 |
|
|
constant Instr_SUBW : integer := 46;
|
| 147 |
|
|
constant Instr_XOR : integer := 47;
|
| 148 |
|
|
constant Instr_XORI : integer := 48;
|
| 149 |
|
|
constant Instr_CSRRW : integer := 49;
|
| 150 |
|
|
constant Instr_CSRRS : integer := 50;
|
| 151 |
|
|
constant Instr_CSRRC : integer := 51;
|
| 152 |
|
|
constant Instr_CSRRWI : integer := 52;
|
| 153 |
|
|
constant Instr_CSRRCI : integer := 53;
|
| 154 |
|
|
constant Instr_CSRRSI : integer := 54;
|
| 155 |
|
|
constant Instr_URET : integer := 55;
|
| 156 |
|
|
constant Instr_SRET : integer := 56;
|
| 157 |
|
|
constant Instr_HRET : integer := 57;
|
| 158 |
|
|
constant Instr_MRET : integer := 58;
|
| 159 |
|
|
constant Instr_FENCE : integer := 59;
|
| 160 |
|
|
constant Instr_FENCE_I : integer := 60;
|
| 161 |
|
|
constant Instr_DIV : integer := 61;
|
| 162 |
|
|
constant Instr_DIVU : integer := 62;
|
| 163 |
|
|
constant Instr_DIVW : integer := 63;
|
| 164 |
|
|
constant Instr_DIVUW : integer := 64;
|
| 165 |
|
|
constant Instr_MUL : integer := 65;
|
| 166 |
|
|
constant Instr_MULW : integer := 66;
|
| 167 |
|
|
constant Instr_REM : integer := 67;
|
| 168 |
|
|
constant Instr_REMU : integer := 68;
|
| 169 |
|
|
constant Instr_REMW : integer := 69;
|
| 170 |
|
|
constant Instr_REMUW : integer := 70;
|
| 171 |
|
|
constant Instr_ECALL : integer := 71;
|
| 172 |
|
|
constant Instr_EBREAK : integer := 72;
|
| 173 |
|
|
constant Instr_Total : integer := 73;
|
| 174 |
|
|
--! @}
|
| 175 |
|
|
|
| 176 |
|
|
--! @name PRV bits possible values:
|
| 177 |
|
|
--!
|
| 178 |
|
|
--! @{
|
| 179 |
|
|
--! User-mode
|
| 180 |
|
|
constant PRV_U : std_logic_vector(1 downto 0) := "00";
|
| 181 |
|
|
--! super-visor mode
|
| 182 |
|
|
constant PRV_S : std_logic_vector(1 downto 0) := "01";
|
| 183 |
|
|
--! hyper-visor mode
|
| 184 |
|
|
constant PRV_H : std_logic_vector(1 downto 0) := "10";
|
| 185 |
|
|
--! machine mode
|
| 186 |
|
|
constant PRV_M : std_logic_vector(1 downto 0) := "11";
|
| 187 |
|
|
--! @}
|
| 188 |
|
|
|
| 189 |
|
|
|
| 190 |
|
|
--! @name CSR registers.
|
| 191 |
|
|
--!
|
| 192 |
|
|
--! @{
|
| 193 |
|
|
|
| 194 |
|
|
-- ISA and extensions supported.
|
| 195 |
|
|
constant CSR_misa : std_logic_vector(11 downto 0) := X"f10";
|
| 196 |
|
|
-- Vendor ID.
|
| 197 |
|
|
constant CSR_mvendorid : std_logic_vector(11 downto 0) := X"f11";
|
| 198 |
|
|
-- Architecture ID.
|
| 199 |
|
|
constant CSR_marchid : std_logic_vector(11 downto 0) := X"f12";
|
| 200 |
|
|
-- Vendor ID.
|
| 201 |
|
|
constant CSR_mimplementationid : std_logic_vector(11 downto 0) := X"f13";
|
| 202 |
|
|
-- Thread id (the same as core).
|
| 203 |
|
|
constant CSR_mhartid : std_logic_vector(11 downto 0) := X"f14";
|
| 204 |
|
|
-- Machine wall-clock time
|
| 205 |
|
|
constant CSR_mtime : std_logic_vector(11 downto 0) := X"701";
|
| 206 |
|
|
-- Software reset.
|
| 207 |
|
|
constant CSR_mreset : std_logic_vector(11 downto 0) := X"782";
|
| 208 |
|
|
|
| 209 |
|
|
-- machine mode status read/write register.
|
| 210 |
|
|
constant CSR_mstatus : std_logic_vector(11 downto 0) := X"300";
|
| 211 |
|
|
-- Machine exception delegation
|
| 212 |
|
|
constant CSR_medeleg : std_logic_vector(11 downto 0) := X"302";
|
| 213 |
|
|
-- Machine interrupt delegation
|
| 214 |
|
|
constant CSR_mideleg : std_logic_vector(11 downto 0) := X"303";
|
| 215 |
|
|
-- Machine interrupt enable
|
| 216 |
|
|
constant CSR_mie : std_logic_vector(11 downto 0) := X"304";
|
| 217 |
|
|
-- The base address of the M-mode trap vector.
|
| 218 |
|
|
constant CSR_mtvec : std_logic_vector(11 downto 0) := X"305";
|
| 219 |
|
|
-- Machine wall-clock timer compare value.
|
| 220 |
|
|
constant CSR_mtimecmp : std_logic_vector(11 downto 0) := X"321";
|
| 221 |
|
|
-- Scratch register for machine trap handlers.
|
| 222 |
|
|
constant CSR_mscratch : std_logic_vector(11 downto 0) := X"340";
|
| 223 |
|
|
-- Exception program counters.
|
| 224 |
|
|
constant CSR_uepc : std_logic_vector(11 downto 0) := X"041";
|
| 225 |
|
|
constant CSR_sepc : std_logic_vector(11 downto 0) := X"141";
|
| 226 |
|
|
constant CSR_hepc : std_logic_vector(11 downto 0) := X"241";
|
| 227 |
|
|
constant CSR_mepc : std_logic_vector(11 downto 0) := X"341";
|
| 228 |
|
|
-- Machine trap cause
|
| 229 |
|
|
constant CSR_mcause : std_logic_vector(11 downto 0) := X"342";
|
| 230 |
|
|
-- Machine bad address.
|
| 231 |
|
|
constant CSR_mbadaddr : std_logic_vector(11 downto 0) := X"343";
|
| 232 |
|
|
-- Machine interrupt pending
|
| 233 |
|
|
constant CSR_mip : std_logic_vector(11 downto 0) := X"344";
|
| 234 |
|
|
--! @}
|
| 235 |
|
|
|
| 236 |
|
|
--! @name Exceptions
|
| 237 |
|
|
--! @{
|
| 238 |
|
|
-- Instruction address misaligned
|
| 239 |
|
|
constant EXCEPTION_InstrMisalign : std_logic_vector(3 downto 0) := X"0";
|
| 240 |
|
|
-- Instruction access fault
|
| 241 |
|
|
constant EXCEPTION_InstrFault : std_logic_vector(3 downto 0) := X"1";
|
| 242 |
|
|
-- Illegal instruction
|
| 243 |
|
|
constant EXCEPTION_InstrIllegal : std_logic_vector(3 downto 0) := X"2";
|
| 244 |
|
|
-- Breakpoint
|
| 245 |
|
|
constant EXCEPTION_Breakpoint : std_logic_vector(3 downto 0) := X"3";
|
| 246 |
|
|
-- Load address misaligned
|
| 247 |
|
|
constant EXCEPTION_LoadMisalign : std_logic_vector(3 downto 0) := X"4";
|
| 248 |
|
|
-- Load access fault
|
| 249 |
|
|
constant EXCEPTION_LoadFault : std_logic_vector(3 downto 0) := X"5";
|
| 250 |
|
|
-- Store/AMO address misaligned
|
| 251 |
|
|
constant EXCEPTION_StoreMisalign : std_logic_vector(3 downto 0) := X"6";
|
| 252 |
|
|
-- Store/AMO access fault
|
| 253 |
|
|
constant EXCEPTION_StoreFault : std_logic_vector(3 downto 0) := X"7";
|
| 254 |
|
|
-- Environment call from U-mode
|
| 255 |
|
|
constant EXCEPTION_CallFromUmode : std_logic_vector(3 downto 0) := X"8";
|
| 256 |
|
|
-- Environment call from S-mode
|
| 257 |
|
|
constant EXCEPTION_CallFromSmode : std_logic_vector(3 downto 0) := X"9";
|
| 258 |
|
|
-- Environment call from H-mode
|
| 259 |
|
|
constant EXCEPTION_CallFromHmode : std_logic_vector(3 downto 0) := X"A";
|
| 260 |
|
|
-- Environment call from M-mode
|
| 261 |
|
|
constant EXCEPTION_CallFromMmode : std_logic_vector(3 downto 0) := X"B";
|
| 262 |
|
|
--! @}
|
| 263 |
|
|
|
| 264 |
|
|
--! @name Interrupts
|
| 265 |
|
|
--! @{
|
| 266 |
|
|
-- User software interrupt
|
| 267 |
|
|
constant INTERRUPT_USoftware : std_logic_vector(3 downto 0) := X"0";
|
| 268 |
|
|
-- Superuser software interrupt
|
| 269 |
|
|
constant INTERRUPT_SSoftware : std_logic_vector(3 downto 0) := X"1";
|
| 270 |
|
|
-- Hypervisor software itnerrupt
|
| 271 |
|
|
constant INTERRUPT_HSoftware : std_logic_vector(3 downto 0) := X"2";
|
| 272 |
|
|
-- Machine software interrupt
|
| 273 |
|
|
constant INTERRUPT_MSoftware : std_logic_vector(3 downto 0) := X"3";
|
| 274 |
|
|
-- User timer interrupt
|
| 275 |
|
|
constant INTERRUPT_UTimer : std_logic_vector(3 downto 0) := X"4";
|
| 276 |
|
|
-- Superuser timer interrupt
|
| 277 |
|
|
constant INTERRUPT_STimer : std_logic_vector(3 downto 0) := X"5";
|
| 278 |
|
|
-- Hypervisor timer interrupt
|
| 279 |
|
|
constant INTERRUPT_HTimer : std_logic_vector(3 downto 0) := X"6";
|
| 280 |
|
|
-- Machine timer interrupt
|
| 281 |
|
|
constant INTERRUPT_MTimer : std_logic_vector(3 downto 0) := X"7";
|
| 282 |
|
|
-- User external interrupt
|
| 283 |
|
|
constant INTERRUPT_UExternal : std_logic_vector(3 downto 0) := X"8";
|
| 284 |
|
|
-- Superuser external interrupt
|
| 285 |
|
|
constant INTERRUPT_SExternal : std_logic_vector(3 downto 0) := X"9";
|
| 286 |
|
|
-- Hypervisor external interrupt
|
| 287 |
|
|
constant INTERRUPT_HExternal : std_logic_vector(3 downto 0) := X"A";
|
| 288 |
|
|
-- Machine external interrupt (from PLIC)
|
| 289 |
|
|
constant INTERRUPT_MExternal : std_logic_vector(3 downto 0) := X"B";
|
| 290 |
|
|
--! @}
|
| 291 |
|
|
|
| 292 |
|
|
|
| 293 |
|
|
--! @param[in] i_clk CPU clock
|
| 294 |
|
|
--! @param[in] i_nrst Reset. Active LOW.
|
| 295 |
|
|
--! @param[in] i_req_mem_fire Memory request was accepted
|
| 296 |
|
|
--! @param[in] i_resp_mem_valid Memory response from ICache is valid
|
| 297 |
|
|
--! @param[in] i_resp_mem_addr Memory response address
|
| 298 |
|
|
--! @param[in] i_resp_mem_data Memory response value
|
| 299 |
|
|
--! @param[in] i_f_predic_miss Fetch modul detects deviation between predicted and valid pc.
|
| 300 |
|
|
--! @param[in] i_e_npc Valid instruction value awaited by 'Executor'
|
| 301 |
|
|
--! @param[in] i_ra Return address register value
|
| 302 |
|
|
--! @param[out] o_npc_predic Predicted next instruction address
|
| 303 |
|
|
component BranchPredictor is
|
| 304 |
|
|
port (
|
| 305 |
|
|
i_clk : in std_logic;
|
| 306 |
|
|
i_nrst : in std_logic;
|
| 307 |
|
|
i_req_mem_fire : in std_logic;
|
| 308 |
|
|
i_resp_mem_valid : in std_logic;
|
| 309 |
|
|
i_resp_mem_addr : in std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 310 |
|
|
i_resp_mem_data : in std_logic_vector(31 downto 0);
|
| 311 |
|
|
i_f_predic_miss : in std_logic;
|
| 312 |
|
|
i_e_npc : in std_logic_vector(31 downto 0);
|
| 313 |
|
|
i_ra : in std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 314 |
|
|
o_npc_predict : out std_logic_vector(31 downto 0)
|
| 315 |
|
|
);
|
| 316 |
|
|
end component;
|
| 317 |
|
|
|
| 318 |
|
|
--! @param[in] i_clk CPU clock
|
| 319 |
|
|
--! @param[in] i_nrst Reset. Active LOW.
|
| 320 |
|
|
--! @param[in] i_xret XRet instruction signals mode switching
|
| 321 |
|
|
--! @param[in] i_addr CSR address, if xret=1 switch mode accordingly
|
| 322 |
|
|
--! @param[in] i_wena Write enable
|
| 323 |
|
|
--! @param[in] i_wdata CSR writing value
|
| 324 |
|
|
--! @param[out] o_rdata CSR read value
|
| 325 |
|
|
--! @param[in] i_break_mode Behaviour on EBREAK instruction: 0 = halt; 1 = generate trap
|
| 326 |
|
|
--! @param[in] i_breakpoint Breakpoint (Trap or not depends of mode)
|
| 327 |
|
|
--! @param[in] i_trap_ena Trap pulse
|
| 328 |
|
|
--! @param[in] i_trap_code bit[4] : 1=interrupt; 0=exception; bits[3:0]=code
|
| 329 |
|
|
--! @param[in] i_trap_pc trap on pc
|
| 330 |
|
|
--! @param[out] o_ie Interrupt enable bit
|
| 331 |
|
|
--! @param[out] o_mode CPU mode
|
| 332 |
|
|
--! @param[out] o_mtvec Interrupt descriptors table
|
| 333 |
|
|
--! @param[in] i_dport_ena Debug port request is enabled
|
| 334 |
|
|
--! @param[in] i_dport_write Debug port Write enable
|
| 335 |
|
|
--! @param[in] i_dport_addr Debug port CSR address
|
| 336 |
|
|
--! @param[in] i_dport_wdata Debug port CSR writing value
|
| 337 |
|
|
--! @param[out] o_dport_rdata Debug port CSR read value
|
| 338 |
|
|
component CsrRegs is
|
| 339 |
|
|
port (
|
| 340 |
|
|
i_clk : in std_logic;
|
| 341 |
|
|
i_nrst : in std_logic;
|
| 342 |
|
|
i_xret : in std_logic;
|
| 343 |
|
|
i_addr : in std_logic_vector(11 downto 0);
|
| 344 |
|
|
i_wena : in std_logic;
|
| 345 |
|
|
i_wdata : in std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 346 |
|
|
o_rdata : out std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 347 |
|
|
i_break_mode : in std_logic;
|
| 348 |
|
|
i_breakpoint : in std_logic;
|
| 349 |
|
|
i_trap_ena : in std_logic;
|
| 350 |
|
|
i_trap_code : in std_logic_vector(4 downto 0);
|
| 351 |
|
|
i_trap_pc : in std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 352 |
|
|
o_ie : out std_logic;
|
| 353 |
|
|
o_mode : out std_logic_vector(1 downto 0);
|
| 354 |
|
|
o_mtvec : out std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 355 |
|
|
i_dport_ena : in std_logic;
|
| 356 |
|
|
i_dport_write : in std_logic;
|
| 357 |
|
|
i_dport_addr : in std_logic_vector(11 downto 0);
|
| 358 |
|
|
i_dport_wdata : in std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 359 |
|
|
o_dport_rdata : out std_logic_vector(RISCV_ARCH-1 downto 0)
|
| 360 |
|
|
);
|
| 361 |
|
|
end component;
|
| 362 |
|
|
|
| 363 |
|
|
--! @param[in] i_clk CPU clock
|
| 364 |
|
|
--! @param[in] i_nrst Reset. Active LOW.
|
| 365 |
|
|
--! @param[in] i_any_hold Hold pipeline by any reason
|
| 366 |
|
|
--! @param[in] i_f_valid Fetch input valid
|
| 367 |
|
|
--! @param[in] i_f_pc Fetched pc
|
| 368 |
|
|
--! @param[in] i_f_instr Fetched instruction value
|
| 369 |
|
|
--! @param[out] o_valid Current output values are valid
|
| 370 |
|
|
--! @param[out] o_pc Current instruction pointer value
|
| 371 |
|
|
--! @param[out] o_instr Current instruction value
|
| 372 |
|
|
--! @param[out] o_memop_store Store to memory operation
|
| 373 |
|
|
--! @param[out] o_memop_load Load from memoru operation
|
| 374 |
|
|
--! @param[out] o_memop_sign_ext Load memory value with sign extending
|
| 375 |
|
|
--! @param[out] o_memop_size Memory transaction size
|
| 376 |
|
|
--! @param[out] o_rv32 32-bits instruction
|
| 377 |
|
|
--! @param[out] o_compressed 16-bits instruction (C-extension)
|
| 378 |
|
|
--! @param[out] o_insigned_op Unsigned operands
|
| 379 |
|
|
--! @param[out] o_isa_type Instruction format accordingly with ISA
|
| 380 |
|
|
--! @param[out] o_instr_vec One bit per decoded instruction bus
|
| 381 |
|
|
--! @param[out] o_exception Unimplemented instruction
|
| 382 |
|
|
component InstrDecoder is
|
| 383 |
|
|
port (
|
| 384 |
|
|
i_clk : in std_logic;
|
| 385 |
|
|
i_nrst : in std_logic;
|
| 386 |
|
|
i_any_hold : in std_logic;
|
| 387 |
|
|
i_f_valid : in std_logic;
|
| 388 |
|
|
i_f_pc : in std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 389 |
|
|
i_f_instr : in std_logic_vector(31 downto 0);
|
| 390 |
|
|
o_valid : out std_logic;
|
| 391 |
|
|
o_pc : out std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 392 |
|
|
o_instr : out std_logic_vector(31 downto 0);
|
| 393 |
|
|
o_memop_store : out std_logic;
|
| 394 |
|
|
o_memop_load : out std_logic;
|
| 395 |
|
|
o_memop_sign_ext : out std_logic;
|
| 396 |
|
|
o_memop_size : out std_logic_vector(1 downto 0);
|
| 397 |
|
|
o_rv32 : out std_logic;
|
| 398 |
|
|
o_compressed : out std_logic;
|
| 399 |
|
|
o_unsigned_op : out std_logic;
|
| 400 |
|
|
o_isa_type : out std_logic_vector(ISA_Total-1 downto 0);
|
| 401 |
|
|
o_instr_vec : out std_logic_vector(Instr_Total-1 downto 0);
|
| 402 |
|
|
o_exception : out std_logic
|
| 403 |
|
|
);
|
| 404 |
|
|
end component;
|
| 405 |
|
|
|
| 406 |
|
|
|
| 407 |
|
|
--! @param[in] i_clk
|
| 408 |
|
|
--! @param[in] i_nrst Reset active LOW
|
| 409 |
|
|
--! @param[in] i_pipeline_hold Hold execution by any reason
|
| 410 |
|
|
--! @param[in] i_d_valid Decoded instruction is valid
|
| 411 |
|
|
--! @param[in] i_d_pc Instruction pointer on decoded instruction
|
| 412 |
|
|
--! @param[in] i_d_instr Decoded instruction value
|
| 413 |
|
|
--! @param[in] i_wb_done write back done (Used to clear hazardness)
|
| 414 |
|
|
--! @param[in] i_memop_store Store to memory operation
|
| 415 |
|
|
--! @param[in] i_memop_load Load from memoru operation
|
| 416 |
|
|
--! @param[in] i_memop_sign_ext Load memory value with sign extending
|
| 417 |
|
|
--! @param[in] i_memop_size Memory transaction size
|
| 418 |
|
|
--! @param[in] i_unsigned_op Unsigned operands
|
| 419 |
|
|
--! @param[in] i_rv32 32-bits instruction
|
| 420 |
|
|
--! @param[in] i_compressed 16-bits instruction (C-extension)
|
| 421 |
|
|
--! @param[in] i_isa_type Type of the instruction's structure (ISA spec.)
|
| 422 |
|
|
--! @param[in] i_ivec One pulse per supported instruction.
|
| 423 |
|
|
--! @param[in] i_ie Interrupt enable bit
|
| 424 |
|
|
--! @param[in] i_mtvec Interrupt descriptor table
|
| 425 |
|
|
--! @param[in] i_mode Current processor mode
|
| 426 |
|
|
--! @param[in] i_break_mode Behaviour on EBREAK instruction: 0 = halt; 1 = generate trap
|
| 427 |
|
|
--! @param[in] i_unsup_exception Unsupported instruction exception
|
| 428 |
|
|
--! @param[in] i_ext_irq External interrupt from PLIC (todo: timer & software interrupts)
|
| 429 |
|
|
--! @param[in] i_dport_npc_write Write npc value from debug port
|
| 430 |
|
|
--! @param[in] i_dport_npc Debug port npc value to write
|
| 431 |
|
|
--! @param[out] o_radr1 Integer register index 1
|
| 432 |
|
|
--! @param[in] i_rdata1 Integer register value 1
|
| 433 |
|
|
--! @param[out] o_radr2 Integer register index 2
|
| 434 |
|
|
--! @param[in] i_rdata2 Integer register value 2
|
| 435 |
|
|
--! @param[out] o_res_addr Address to store result of the instruction (0=do not store)
|
| 436 |
|
|
--! @param[out] o_res_data Value to store
|
| 437 |
|
|
--! @param[out] o_pipeline_hold Hold pipeline while 'writeback' not done or multi-clock instruction.
|
| 438 |
|
|
--! @param[out] o_xret XRET instruction: MRET, URET or other.
|
| 439 |
|
|
--! @param[out] o_csr_addr CSR address. 0 if not a CSR instruction with xret signals mode switching
|
| 440 |
|
|
--! @param[out] o_csr_wena Write new CSR value
|
| 441 |
|
|
--! @param[in] i_csr_rdata CSR current value
|
| 442 |
|
|
--! @param[out] o_csr_wdata CSR new value
|
| 443 |
|
|
--! @param[out] o_trap_ena Trap occurs pulse
|
| 444 |
|
|
--! @param[out] o_trap_code bit[4] : 1=interrupt; 0=exception; bits[3:0]=code
|
| 445 |
|
|
--! @param[out] o_trap_pc trap on pc
|
| 446 |
|
|
--! @param[out] o_memop_sign_ext Load data with sign extending
|
| 447 |
|
|
--! @param[out] o_memop_load Load data instruction
|
| 448 |
|
|
--! @param[out] o_memop_store Store data instruction
|
| 449 |
|
|
--! @param[out] o_memop_size 0=1bytes; 1=2bytes; 2=4bytes; 3=8bytes
|
| 450 |
|
|
--! @param[out] o_memop_addr Memory access address
|
| 451 |
|
|
--! @param[out] o_valid Output is valid
|
| 452 |
|
|
--! @param[out] o_pc Valid instruction pointer
|
| 453 |
|
|
--! @param[out] o_npc Next instruction pointer. Next decoded pc must match to this value or will be ignored.
|
| 454 |
|
|
--! @param[out] o_instr Valid instruction value
|
| 455 |
|
|
--! @param[out] o_breakpoint ebreak instruction
|
| 456 |
|
|
--! @param[out] o_call CALL pseudo instruction detected
|
| 457 |
|
|
--! @param[out] o_ret RET pseudoinstruction detected
|
| 458 |
|
|
component InstrExecute is
|
| 459 |
|
|
port (
|
| 460 |
|
|
i_clk : in std_logic;
|
| 461 |
|
|
i_nrst : in std_logic;
|
| 462 |
|
|
i_pipeline_hold : in std_logic;
|
| 463 |
|
|
i_d_valid : in std_logic;
|
| 464 |
|
|
i_d_pc : in std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 465 |
|
|
i_d_instr : in std_logic_vector(31 downto 0);
|
| 466 |
|
|
i_wb_done : in std_logic;
|
| 467 |
|
|
i_memop_store : in std_logic;
|
| 468 |
|
|
i_memop_load : in std_logic;
|
| 469 |
|
|
i_memop_sign_ext : in std_logic;
|
| 470 |
|
|
i_memop_size : in std_logic_vector(1 downto 0);
|
| 471 |
|
|
i_unsigned_op : in std_logic;
|
| 472 |
|
|
i_rv32 : in std_logic;
|
| 473 |
|
|
i_compressed : in std_logic;
|
| 474 |
|
|
i_isa_type : in std_logic_vector(ISA_Total-1 downto 0);
|
| 475 |
|
|
i_ivec : in std_logic_vector(Instr_Total-1 downto 0);
|
| 476 |
|
|
i_ie : in std_logic;
|
| 477 |
|
|
i_mtvec : in std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 478 |
|
|
i_mode : in std_logic_vector(1 downto 0);
|
| 479 |
|
|
i_break_mode : in std_logic;
|
| 480 |
|
|
i_unsup_exception : in std_logic;
|
| 481 |
|
|
i_ext_irq : in std_logic;
|
| 482 |
|
|
i_dport_npc_write : in std_logic;
|
| 483 |
|
|
i_dport_npc : in std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 484 |
|
|
o_radr1 : out std_logic_vector(4 downto 0);
|
| 485 |
|
|
i_rdata1 : in std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 486 |
|
|
o_radr2 : out std_logic_vector(4 downto 0);
|
| 487 |
|
|
i_rdata2 : in std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 488 |
|
|
o_res_addr : out std_logic_vector(4 downto 0);
|
| 489 |
|
|
o_res_data : out std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 490 |
|
|
o_pipeline_hold : out std_logic;
|
| 491 |
|
|
o_xret : out std_logic;
|
| 492 |
|
|
o_csr_addr : out std_logic_vector(11 downto 0);
|
| 493 |
|
|
o_csr_wena : out std_logic;
|
| 494 |
|
|
i_csr_rdata : in std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 495 |
|
|
o_csr_wdata : out std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 496 |
|
|
o_trap_ena : out std_logic;
|
| 497 |
|
|
o_trap_code : out std_logic_vector(4 downto 0);
|
| 498 |
|
|
o_trap_pc : out std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 499 |
|
|
o_memop_sign_ext : out std_logic;
|
| 500 |
|
|
o_memop_load : out std_logic;
|
| 501 |
|
|
o_memop_store : out std_logic;
|
| 502 |
|
|
o_memop_size : out std_logic_vector(1 downto 0);
|
| 503 |
|
|
o_memop_addr : out std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 504 |
|
|
o_valid : out std_logic;
|
| 505 |
|
|
o_pc : out std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 506 |
|
|
o_npc : out std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 507 |
|
|
o_instr : out std_logic_vector(31 downto 0);
|
| 508 |
|
|
o_breakpoint : out std_logic;
|
| 509 |
|
|
o_call : out std_logic;
|
| 510 |
|
|
o_ret : out std_logic
|
| 511 |
|
|
);
|
| 512 |
|
|
end component;
|
| 513 |
|
|
|
| 514 |
|
|
--! @param[in] i_clk
|
| 515 |
|
|
--! @param[in] i_nrst
|
| 516 |
|
|
--! @param[in] i_pipeline_hold
|
| 517 |
|
|
--! @param[in] i_mem_ready
|
| 518 |
|
|
--! @param[out] o_mem_addr_valid
|
| 519 |
|
|
--! @param[out] o_mem_addr
|
| 520 |
|
|
--! @param[in] i_mem_data_valid
|
| 521 |
|
|
--! @param[in] i_mem_data_addr
|
| 522 |
|
|
--! @param[in] i_mem_data
|
| 523 |
|
|
--! @param[out] o_mem_ready
|
| 524 |
|
|
--! @param[in] i_e_npc
|
| 525 |
|
|
--! @param[in] i_predict_npc
|
| 526 |
|
|
--! @param[out] o_predict_miss
|
| 527 |
|
|
--! @param[out] o_mem_req_fire Used by branch predictor to form new npc value
|
| 528 |
|
|
--! @param[out] o_valid
|
| 529 |
|
|
--! @param[out] o_pc
|
| 530 |
|
|
--! @param[out] o_instr
|
| 531 |
|
|
--! @param[out] o_hold Hold due no response from icache yet
|
| 532 |
|
|
--! @param[in] i_br_fetch_valid Fetch injection address/instr are valid
|
| 533 |
|
|
--! @param[in] i_br_address_fetch Fetch injection address to skip ebreak instruciton only once
|
| 534 |
|
|
--! @param[in] i_br_instr_fetch Real instruction value that was replaced by ebreak
|
| 535 |
|
|
--! @param[out] o_instr_buf
|
| 536 |
|
|
component InstrFetch is
|
| 537 |
|
|
port (
|
| 538 |
|
|
i_clk : in std_logic;
|
| 539 |
|
|
i_nrst : in std_logic;
|
| 540 |
|
|
i_pipeline_hold : in std_logic;
|
| 541 |
|
|
i_mem_req_ready : in std_logic;
|
| 542 |
|
|
o_mem_addr_valid : out std_logic;
|
| 543 |
|
|
o_mem_addr : out std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 544 |
|
|
i_mem_data_valid : in std_logic;
|
| 545 |
|
|
i_mem_data_addr : in std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 546 |
|
|
i_mem_data : in std_logic_vector(31 downto 0);
|
| 547 |
|
|
o_mem_resp_ready : out std_logic;
|
| 548 |
|
|
i_e_npc : in std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 549 |
|
|
i_predict_npc : in std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 550 |
|
|
o_predict_miss : out std_logic;
|
| 551 |
|
|
|
| 552 |
|
|
o_mem_req_fire : out std_logic;
|
| 553 |
|
|
o_valid : out std_logic;
|
| 554 |
|
|
o_pc : out std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 555 |
|
|
o_instr : out std_logic_vector(31 downto 0);
|
| 556 |
|
|
o_hold : out std_logic;
|
| 557 |
|
|
i_br_fetch_valid : in std_logic;
|
| 558 |
|
|
i_br_address_fetch : in std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 559 |
|
|
i_br_instr_fetch : in std_logic_vector(31 downto 0);
|
| 560 |
|
|
o_instr_buf : out std_logic_vector(DBG_FETCH_TRACE_SIZE*64-1 downto 0)
|
| 561 |
|
|
);
|
| 562 |
|
|
end component;
|
| 563 |
|
|
|
| 564 |
|
|
--! @param[in] i_clk
|
| 565 |
|
|
--! @param[in] i_nrst
|
| 566 |
|
|
--! @param[in] i_e_valid Execution stage outputs are valid
|
| 567 |
|
|
--! @param[in] i_e_pc Execution stage instruction pointer
|
| 568 |
|
|
--! @param[in] i_e_instr Execution stage instruction value
|
| 569 |
|
|
--! @param[in] i_res_addr Register address to be written (0=no writing)
|
| 570 |
|
|
--! @param[in] i_res_data Register value to be written
|
| 571 |
|
|
--! @param[in] i_memop_sign_ext Load data with sign extending (if less than 8 Bytes)
|
| 572 |
|
|
--! @param[in] i_memop_load Load data from memory and write to i_res_addr
|
| 573 |
|
|
--! @param[in] i_memop_store Store i_res_data value into memory
|
| 574 |
|
|
--! @param[in] i_memop_size Encoded memory transaction size in bytes:
|
| 575 |
|
|
--! 0=1B; 1=2B; 2=4B; 3=8B
|
| 576 |
|
|
--! @param[in] i_memop_addr Memory access address
|
| 577 |
|
|
--! @param[out] o_wena Write enable signal
|
| 578 |
|
|
--! @param[out] o_waddr Output register address (0 = x0 = no write)
|
| 579 |
|
|
--! @param[out] o_wdata Register value
|
| 580 |
|
|
--! @param[in] i_mem_req_read Memory request is acceptable
|
| 581 |
|
|
--! @param[out] o_mem_valid Memory request is valid
|
| 582 |
|
|
--! @param[out] o_mem_write Memory write request
|
| 583 |
|
|
--! @param[out] o_mem_sz Encoded data size in bytes: 0=1B; 1=2B; 2=4B; 3=8B
|
| 584 |
|
|
--! @param[out] o_mem_addr Data path requested address
|
| 585 |
|
|
--! @param[out] o_mem_data Data path requested data (write transaction)
|
| 586 |
|
|
--! @param[in] i_mem_data_valid Data path memory response is valid
|
| 587 |
|
|
--! @param[in] i_mem_data_addr Data path memory response address
|
| 588 |
|
|
--! @param[in] i_mem_data Data path memory response value
|
| 589 |
|
|
--! @param[out] o_mem_resp_ready Data from DCache was accepted
|
| 590 |
|
|
--! @param[out] o_hold Hold-on pipeline while memory operation not finished
|
| 591 |
|
|
--! @param[out] o_valid Output is valid
|
| 592 |
|
|
--! @param[out] o_pc Valid instruction pointer
|
| 593 |
|
|
--! @param[out] o_instr Valid instruction value
|
| 594 |
|
|
component MemAccess is
|
| 595 |
|
|
port (
|
| 596 |
|
|
i_clk : in std_logic;
|
| 597 |
|
|
i_nrst : in std_logic;
|
| 598 |
|
|
i_e_valid : in std_logic;
|
| 599 |
|
|
i_e_pc : in std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 600 |
|
|
i_e_instr : in std_logic_vector(31 downto 0);
|
| 601 |
|
|
i_res_addr : in std_logic_vector(4 downto 0);
|
| 602 |
|
|
i_res_data : in std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 603 |
|
|
i_memop_sign_ext : in std_logic;
|
| 604 |
|
|
i_memop_load : in std_logic;
|
| 605 |
|
|
i_memop_store : in std_logic;
|
| 606 |
|
|
i_memop_size : in std_logic_vector(1 downto 0);
|
| 607 |
|
|
i_memop_addr : in std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 608 |
|
|
o_wena : out std_logic;
|
| 609 |
|
|
o_waddr : out std_logic_vector(4 downto 0);
|
| 610 |
|
|
o_wdata : out std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 611 |
|
|
i_mem_req_ready : in std_logic;
|
| 612 |
|
|
o_mem_valid : out std_logic;
|
| 613 |
|
|
o_mem_write : out std_logic;
|
| 614 |
|
|
o_mem_sz : out std_logic_vector(1 downto 0);
|
| 615 |
|
|
o_mem_addr : out std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 616 |
|
|
o_mem_data : out std_logic_vector(BUS_DATA_WIDTH-1 downto 0);
|
| 617 |
|
|
i_mem_data_valid : in std_logic;
|
| 618 |
|
|
i_mem_data_addr : in std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 619 |
|
|
i_mem_data : in std_logic_vector(BUS_DATA_WIDTH-1 downto 0);
|
| 620 |
|
|
o_mem_resp_ready : out std_logic;
|
| 621 |
|
|
o_hold : out std_logic;
|
| 622 |
|
|
o_valid : out std_logic;
|
| 623 |
|
|
o_pc : out std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 624 |
|
|
o_instr : out std_logic_vector(31 downto 0)
|
| 625 |
|
|
);
|
| 626 |
|
|
end component;
|
| 627 |
|
|
|
| 628 |
|
|
--! @param[in] i_clk CPU clock
|
| 629 |
|
|
--! @param[in] i_nrst Reset. Active LOW.
|
| 630 |
|
|
--! @param[in] i_radr1 Port 1 read address
|
| 631 |
|
|
--! @param[out] o_rdata1 Port 1 read value
|
| 632 |
|
|
--! @param[in] i_radr2 Port 2 read address
|
| 633 |
|
|
--! @param[out] o_rdata2 Port 2 read value
|
| 634 |
|
|
--! @param[in] i_waddr Writing value
|
| 635 |
|
|
--! @param[in] i_wena Writing is enabled
|
| 636 |
|
|
--! @param[in] i_wdata Writing value
|
| 637 |
|
|
--! @param[in] i_dport_addr Debug port address
|
| 638 |
|
|
--! @param[in] i_dport_ena Debug port is enabled
|
| 639 |
|
|
--! @param[in] i_dport_write Debug port write is enabled
|
| 640 |
|
|
--! @param[in] i_dport_wdata Debug port write value
|
| 641 |
|
|
--! @param[out] o_dport_rdata Debug port read value
|
| 642 |
|
|
--! @param[out] o_ra Return address for branch predictor
|
| 643 |
|
|
component RegIntBank is
|
| 644 |
|
|
port (
|
| 645 |
|
|
i_clk : in std_logic;
|
| 646 |
|
|
i_nrst : in std_logic;
|
| 647 |
|
|
i_radr1 : in std_logic_vector(4 downto 0);
|
| 648 |
|
|
o_rdata1 : out std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 649 |
|
|
i_radr2 : in std_logic_vector(4 downto 0);
|
| 650 |
|
|
o_rdata2 : out std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 651 |
|
|
i_waddr : in std_logic_vector(4 downto 0);
|
| 652 |
|
|
i_wena : in std_logic;
|
| 653 |
|
|
i_wdata : in std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 654 |
|
|
i_dport_addr : in std_logic_vector(4 downto 0);
|
| 655 |
|
|
i_dport_ena : in std_logic;
|
| 656 |
|
|
i_dport_write : in std_logic;
|
| 657 |
|
|
i_dport_wdata : in std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 658 |
|
|
o_dport_rdata : out std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 659 |
|
|
o_ra : out std_logic_vector(RISCV_ARCH-1 downto 0)
|
| 660 |
|
|
);
|
| 661 |
|
|
end component;
|
| 662 |
|
|
|
| 663 |
|
|
--! @param[in] i_clk CPU clock
|
| 664 |
|
|
--! @param[in] i_nrst Reset. Active LOW.
|
| 665 |
|
|
--! @param[in] i_dport_valid Debug access from DSU is valid
|
| 666 |
|
|
--! @param[in] i_dport_write Write command flag
|
| 667 |
|
|
--! @param[in] i_dport_region Registers region ID: 0=CSR; 1=IREGS; 2=Control
|
| 668 |
|
|
--! @param[in] i_dport_addr Register idx
|
| 669 |
|
|
--! @param[in] i_dport_wdata Write value
|
| 670 |
|
|
--! @param[out] o_dport_ready Response is ready
|
| 671 |
|
|
--! @param[out] o_dport_rdata Response value
|
| 672 |
|
|
--! @param[out] o_core_addr Address of the sub-region register
|
| 673 |
|
|
--! @param[out] o_core_wdata Write data
|
| 674 |
|
|
--! @param[out] o_csr_ena Region 0: Access to CSR bank is enabled.
|
| 675 |
|
|
--! @param[out] o_csr_write Region 0: CSR write enable
|
| 676 |
|
|
--! @param[in] i_csr_rdata Region 0: CSR read value
|
| 677 |
|
|
--! @param[out] o_ireg_ena Region 1: Access to integer register bank is enabled
|
| 678 |
|
|
--! @param[out] o_ireg_write Region 1: Integer registers bank write pulse
|
| 679 |
|
|
--! @param[out] o_npc_write Region 1: npc write enable
|
| 680 |
|
|
--! @param[in] i_ireg_rdata Region 1: Integer register read value
|
| 681 |
|
|
--! @param[in] i_pc Region 1: Instruction pointer
|
| 682 |
|
|
--! @param[in] i_npc Region 1: Next Instruction pointer
|
| 683 |
|
|
--! @param[in] i_e_valid Stepping control signal
|
| 684 |
|
|
--! @param[in] i_e_call Pseudo-instruction CALL
|
| 685 |
|
|
--! @param[in] i_e_ret Pseudo-instruction RET
|
| 686 |
|
|
--! @param[in] i_m_valid To compute number of valid executed instruction
|
| 687 |
|
|
--! @param[out] o_clock_cnt Number of clocks excluding halt state
|
| 688 |
|
|
--! @param[out] o_executed_cnt Number of executed instructions
|
| 689 |
|
|
--! @param[out] o_halt Halt signal is equal to hold pipeline
|
| 690 |
|
|
--! @param[in] i_ebreak ebreak instruction decoded
|
| 691 |
|
|
--! @param[out] o_break_mode Behaviour on EBREAK instruction: 0 = halt; 1 = generate trap
|
| 692 |
|
|
--! @param[out] o_br_fetch_valid Fetch injection address/instr are valid
|
| 693 |
|
|
--! @param[out] o_br_address_fetch Fetch injection address to skip ebreak instruciton only once
|
| 694 |
|
|
--! @param[out] o_br_instr_fetch Real instruction value that was replaced by ebreak
|
| 695 |
|
|
--! @param[in] i_istate ICache state machine value
|
| 696 |
|
|
--! @param[in] i_dstate DCache state machine value
|
| 697 |
|
|
--! @param[in] i_instr_buf
|
| 698 |
|
|
component DbgPort
|
| 699 |
|
|
is port (
|
| 700 |
|
|
i_clk : in std_logic;
|
| 701 |
|
|
i_nrst : in std_logic;
|
| 702 |
|
|
i_dport_valid : in std_logic;
|
| 703 |
|
|
i_dport_write : in std_logic;
|
| 704 |
|
|
i_dport_region : in std_logic_vector(1 downto 0);
|
| 705 |
|
|
i_dport_addr : in std_logic_vector(11 downto 0);
|
| 706 |
|
|
i_dport_wdata : in std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 707 |
|
|
o_dport_ready : out std_logic;
|
| 708 |
|
|
o_dport_rdata : out std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 709 |
|
|
o_core_addr : out std_logic_vector(11 downto 0);
|
| 710 |
|
|
o_core_wdata : out std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 711 |
|
|
o_csr_ena : out std_logic;
|
| 712 |
|
|
o_csr_write : out std_logic;
|
| 713 |
|
|
i_csr_rdata : in std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 714 |
|
|
o_ireg_ena : out std_logic;
|
| 715 |
|
|
o_ireg_write : out std_logic;
|
| 716 |
|
|
o_npc_write : out std_logic;
|
| 717 |
|
|
i_ireg_rdata : in std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 718 |
|
|
i_pc : in std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 719 |
|
|
i_npc : in std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 720 |
|
|
i_e_valid : in std_logic;
|
| 721 |
|
|
i_e_call : in std_logic;
|
| 722 |
|
|
i_e_ret : in std_logic;
|
| 723 |
|
|
i_m_valid : in std_logic;
|
| 724 |
|
|
o_clock_cnt : out std_logic_vector(63 downto 0);
|
| 725 |
|
|
o_executed_cnt : out std_logic_vector(63 downto 0);
|
| 726 |
|
|
o_halt : out std_logic;
|
| 727 |
|
|
i_ebreak : in std_logic;
|
| 728 |
|
|
o_break_mode : out std_logic;
|
| 729 |
|
|
o_br_fetch_valid : out std_logic;
|
| 730 |
|
|
o_br_address_fetch : out std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 731 |
|
|
o_br_instr_fetch : out std_logic_vector(31 downto 0);
|
| 732 |
|
|
i_istate : in std_logic_vector(1 downto 0);
|
| 733 |
|
|
i_dstate : in std_logic_vector(1 downto 0);
|
| 734 |
|
|
i_cstate : in std_logic_vector(1 downto 0);
|
| 735 |
|
|
i_instr_buf : in std_logic_vector(DBG_FETCH_TRACE_SIZE*64-1 downto 0)
|
| 736 |
|
|
);
|
| 737 |
|
|
end component;
|
| 738 |
|
|
|
| 739 |
|
|
--! @brief CPU 5-stages pipeline top-level
|
| 740 |
|
|
--! @param[in] i_clk CPU clock
|
| 741 |
|
|
--! @param[in] i_nrst Reset. Active LOW.
|
| 742 |
|
|
--! @param[in] i_req_ctrl_ready ICache is ready to accept request
|
| 743 |
|
|
--! @param[out] o_req_ctrl_valid Request to ICache is valid
|
| 744 |
|
|
--! @param[out] o_req_ctrl_addr Requesting address to ICache
|
| 745 |
|
|
--! @param[in] i_resp_ctrl_valid ICache response is valid
|
| 746 |
|
|
--! @param[in] i_resp_ctrl_addr Response address must be equal to the latest request address
|
| 747 |
|
|
--! @param[in] i_resp_ctrl_data Read value
|
| 748 |
|
|
--! @param[out] o_resp_ctrl_ready Response from ICache is accepted
|
| 749 |
|
|
--! @param[in] i_req_data_ready DCache is ready to accept request
|
| 750 |
|
|
--! @param[out] o_req_data_valid Request to DCache is valid
|
| 751 |
|
|
--! @param[out] o_req_data_write Read/Write transaction
|
| 752 |
|
|
--! @param[out] o_req_data_size Size [Bytes]: 0=1B; 1=2B; 2=4B; 3=8B
|
| 753 |
|
|
--! @param[out] o_req_data_addr Requesting address to DCache
|
| 754 |
|
|
--! @param[out] o_req_data_data Writing value
|
| 755 |
|
|
--! @param[in] i_resp_data_valid DCache response is valid
|
| 756 |
|
|
--! @param[in] i_resp_data_addr DCache response address must be equal to the latest request address
|
| 757 |
|
|
--! @param[in] i_resp_data_data Read value
|
| 758 |
|
|
--! @param[out] o_resp_data_ready Response drom DCache is accepted
|
| 759 |
|
|
--! @param[in] i_ext_irq PLIC interrupt accordingly with spec
|
| 760 |
|
|
--! @param[out] o_time Timer in clock except halt state
|
| 761 |
|
|
--! @param[in] i_dport_valid Debug access from DSU is valid
|
| 762 |
|
|
--! @param[in] i_dport_write Write command flag
|
| 763 |
|
|
--! @param[in] i_dport_region Registers region ID: 0=CSR; 1=IREGS; 2=Control
|
| 764 |
|
|
--! @param[in] i_dport_addr Register idx
|
| 765 |
|
|
--! @param[in] i_dport_wdata Write value
|
| 766 |
|
|
--! @param[out] o_dport_ready Response is ready
|
| 767 |
|
|
--! @param[out] o_dport_rdata Response value
|
| 768 |
|
|
--! @param[in] i_istate ICache state machine value
|
| 769 |
|
|
--! @param[in] i_dstate DCache state machine value
|
| 770 |
|
|
--! @param[in] i_cstate cachetop state machine value
|
| 771 |
|
|
component Processor is
|
| 772 |
|
|
port (
|
| 773 |
|
|
i_clk : in std_logic;
|
| 774 |
|
|
i_nrst : in std_logic;
|
| 775 |
|
|
i_req_ctrl_ready : in std_logic;
|
| 776 |
|
|
o_req_ctrl_valid : out std_logic;
|
| 777 |
|
|
o_req_ctrl_addr : out std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 778 |
|
|
i_resp_ctrl_valid : in std_logic;
|
| 779 |
|
|
i_resp_ctrl_addr : in std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 780 |
|
|
i_resp_ctrl_data : in std_logic_vector(31 downto 0);
|
| 781 |
|
|
o_resp_ctrl_ready : out std_logic;
|
| 782 |
|
|
i_req_data_ready : in std_logic;
|
| 783 |
|
|
o_req_data_valid : out std_logic;
|
| 784 |
|
|
o_req_data_write : out std_logic;
|
| 785 |
|
|
o_req_data_size : out std_logic_vector(1 downto 0);
|
| 786 |
|
|
o_req_data_addr : out std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 787 |
|
|
o_req_data_data : out std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 788 |
|
|
i_resp_data_valid : in std_logic;
|
| 789 |
|
|
i_resp_data_addr : in std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 790 |
|
|
i_resp_data_data : in std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 791 |
|
|
o_resp_data_ready : out std_logic;
|
| 792 |
|
|
i_ext_irq : in std_logic;
|
| 793 |
|
|
o_time : out std_logic_vector(63 downto 0);
|
| 794 |
|
|
i_dport_valid : in std_logic;
|
| 795 |
|
|
i_dport_write : in std_logic;
|
| 796 |
|
|
i_dport_region : in std_logic_vector(1 downto 0);
|
| 797 |
|
|
i_dport_addr : in std_logic_vector(11 downto 0);
|
| 798 |
|
|
i_dport_wdata : in std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 799 |
|
|
o_dport_ready : out std_logic;
|
| 800 |
|
|
o_dport_rdata : out std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 801 |
|
|
i_istate : in std_logic_vector(1 downto 0);
|
| 802 |
|
|
i_dstate : in std_logic_vector(1 downto 0);
|
| 803 |
|
|
i_cstate : in std_logic_vector(1 downto 0)
|
| 804 |
|
|
);
|
| 805 |
|
|
end component;
|
| 806 |
|
|
|
| 807 |
|
|
--! @brief CPU cache top level
|
| 808 |
|
|
--! @param[in] i_clk
|
| 809 |
|
|
--! @param[in] i_nrst
|
| 810 |
|
|
--! @param[in] i_req_ctrl_valid
|
| 811 |
|
|
--! @param[in] i_req_ctrl_addr
|
| 812 |
|
|
--! @param[out] o_req_ctrl_ready
|
| 813 |
|
|
--! @param[out] o_resp_ctrl_valid
|
| 814 |
|
|
--! @param[out] o_resp_ctrl_addr
|
| 815 |
|
|
--! @param[out] o_resp_ctrl_data
|
| 816 |
|
|
--! @param[in] i_resp_ctrl_ready
|
| 817 |
|
|
--! @param[out] o_req_data_ready
|
| 818 |
|
|
--! @param[in] i_req_data_valid
|
| 819 |
|
|
--! @param[in] i_req_data_write
|
| 820 |
|
|
--! @param[in] i_req_data_sz
|
| 821 |
|
|
--! @param[in] i_req_data_addr
|
| 822 |
|
|
--! @param[in] i_req_data_data
|
| 823 |
|
|
--! @param[out] o_resp_data_valid
|
| 824 |
|
|
--! @param[out] o_resp_data_addr
|
| 825 |
|
|
--! @param[out] o_resp_data_data
|
| 826 |
|
|
--! @param[in] i_resp_data_ready
|
| 827 |
|
|
--! @param[in] i_req_mem_ready AXI request was accepted
|
| 828 |
|
|
--! @param[out] o_req_mem_valid
|
| 829 |
|
|
--! @param[out] o_req_mem_write
|
| 830 |
|
|
--! @param[out] o_req_mem_addr
|
| 831 |
|
|
--! @param[out] o_req_mem_strob
|
| 832 |
|
|
--! @param[out] o_req_mem_data
|
| 833 |
|
|
--! @param[in] i_resp_mem_data_valid
|
| 834 |
|
|
--! @param[in] i_resp_mem_data
|
| 835 |
|
|
--! @param[out] o_istate ICache state machine value
|
| 836 |
|
|
--! @param[out] o_dstate DCache state machine value
|
| 837 |
|
|
--! @param[out] o_cstate cachetop state machine value
|
| 838 |
|
|
component CacheTop is
|
| 839 |
|
|
port (
|
| 840 |
|
|
i_clk : in std_logic;
|
| 841 |
|
|
i_nrst : in std_logic;
|
| 842 |
|
|
i_req_ctrl_valid : in std_logic;
|
| 843 |
|
|
i_req_ctrl_addr : in std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 844 |
|
|
o_req_ctrl_ready : out std_logic;
|
| 845 |
|
|
o_resp_ctrl_valid : out std_logic;
|
| 846 |
|
|
o_resp_ctrl_addr : out std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 847 |
|
|
o_resp_ctrl_data : out std_logic_vector(31 downto 0);
|
| 848 |
|
|
i_resp_ctrl_ready : in std_logic;
|
| 849 |
|
|
o_req_data_ready : out std_logic;
|
| 850 |
|
|
i_req_data_valid : in std_logic;
|
| 851 |
|
|
i_req_data_write : in std_logic;
|
| 852 |
|
|
i_req_data_size : in std_logic_vector(1 downto 0);
|
| 853 |
|
|
i_req_data_addr : in std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 854 |
|
|
i_req_data_data : in std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 855 |
|
|
o_resp_data_valid : out std_logic;
|
| 856 |
|
|
o_resp_data_addr : out std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 857 |
|
|
o_resp_data_data : out std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 858 |
|
|
i_resp_data_ready : in std_logic;
|
| 859 |
|
|
i_req_mem_ready : in std_logic;
|
| 860 |
|
|
o_req_mem_valid : out std_logic;
|
| 861 |
|
|
o_req_mem_write : out std_logic;
|
| 862 |
|
|
o_req_mem_addr : out std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 863 |
|
|
o_req_mem_strob : out std_logic_vector(BUS_DATA_BYTES-1 downto 0);
|
| 864 |
|
|
o_req_mem_data : out std_logic_vector(BUS_DATA_WIDTH-1 downto 0);
|
| 865 |
|
|
i_resp_mem_data_valid : in std_logic;
|
| 866 |
|
|
i_resp_mem_data : in std_logic_vector(BUS_DATA_WIDTH-1 downto 0);
|
| 867 |
|
|
o_istate : out std_logic_vector(1 downto 0);
|
| 868 |
|
|
o_dstate : out std_logic_vector(1 downto 0);
|
| 869 |
|
|
o_cstate : out std_logic_vector(1 downto 0)
|
| 870 |
|
|
);
|
| 871 |
|
|
end component;
|
| 872 |
|
|
|
| 873 |
|
|
|
| 874 |
|
|
--! @brief "River" CPU Top level.
|
| 875 |
|
|
--! @param[in] i_clk CPU clock
|
| 876 |
|
|
--! @param[in] i_nrst Reset. Active LOW.
|
| 877 |
|
|
--! @param[in] i_req_mem_ready AXI request was accepted
|
| 878 |
|
|
--! @param[out] o_req_mem_valid AXI memory request is valid
|
| 879 |
|
|
--! @param[out] o_req_mem_write AXI memory request is write type
|
| 880 |
|
|
--! @param[out] o_req_mem_addr AXI memory request address
|
| 881 |
|
|
--! @param[out] o_req_mem_strob Writing strob. 1 bit per Byte
|
| 882 |
|
|
--! @param[out] o_req_mem_data Writing data
|
| 883 |
|
|
--! @param[in] i_resp_mem_data_valid AXI response is valid
|
| 884 |
|
|
--! @param[in] i_resp_mem_data Read data
|
| 885 |
|
|
--! @param[in] i_ext_irq Interrupt line from external interrupts controller (PLIC).
|
| 886 |
|
|
--! @param[out] o_time Timer. Clock counter except halt state.
|
| 887 |
|
|
--! @param[in] i_dport_valid Debug access from DSU is valid
|
| 888 |
|
|
--! @param[in] i_dport_write Write command flag
|
| 889 |
|
|
--! @param[in] i_dport_region Registers region ID: 0=CSR; 1=IREGS; 2=Control
|
| 890 |
|
|
--! @param[in] i_dport_addr Register idx
|
| 891 |
|
|
--! @param[in] i_dport_wdata Write value
|
| 892 |
|
|
--! @param[out] o_dport_ready Response is ready
|
| 893 |
|
|
--! @param[out] o_dport_rdata Response value
|
| 894 |
|
|
component RiverTop is
|
| 895 |
|
|
port (
|
| 896 |
|
|
i_clk : in std_logic;
|
| 897 |
|
|
i_nrst : in std_logic;
|
| 898 |
|
|
i_req_mem_ready : in std_logic;
|
| 899 |
|
|
o_req_mem_valid : out std_logic;
|
| 900 |
|
|
o_req_mem_write : out std_logic;
|
| 901 |
|
|
o_req_mem_addr : out std_logic_vector(BUS_ADDR_WIDTH-1 downto 0);
|
| 902 |
|
|
o_req_mem_strob : out std_logic_vector(BUS_DATA_BYTES-1 downto 0);
|
| 903 |
|
|
o_req_mem_data : out std_logic_vector(BUS_DATA_WIDTH-1 downto 0);
|
| 904 |
|
|
i_resp_mem_data_valid : in std_logic;
|
| 905 |
|
|
i_resp_mem_data : in std_logic_vector(BUS_DATA_WIDTH-1 downto 0);
|
| 906 |
|
|
i_ext_irq : in std_logic;
|
| 907 |
|
|
o_time : out std_logic_vector(63 downto 0);
|
| 908 |
|
|
i_dport_valid : in std_logic;
|
| 909 |
|
|
i_dport_write : in std_logic;
|
| 910 |
|
|
i_dport_region : in std_logic_vector(1 downto 0);
|
| 911 |
|
|
i_dport_addr : in std_logic_vector(11 downto 0);
|
| 912 |
|
|
i_dport_wdata : in std_logic_vector(RISCV_ARCH-1 downto 0);
|
| 913 |
|
|
o_dport_ready : out std_logic;
|
| 914 |
|
|
o_dport_rdata : out std_logic_vector(RISCV_ARCH-1 downto 0)
|
| 915 |
|
|
);
|
| 916 |
|
|
end component;
|
| 917 |
|
|
|
| 918 |
|
|
end; -- package body
|