OpenCores
URL https://opencores.org/ocsvn/yifive/yifive/trunk

Subversion Repositories yifive

[/] [yifive/] [trunk/] [caravel_yifive/] [verilog/] [rtl/] [syntacore/] [scr1/] [src/] [includes/] [scr1_riscv_isa_decoding.svh] - Blame information for rev 21

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 11 dinesha
/// Copyright by Syntacore LLC © 2016-2021. See LICENSE for details
2
/// @file       
3
/// @brief      RISC-V ISA definitions file
4
///
5
 
6
`ifndef SCR1_RISCV_ISA_DECODING_SVH
7
`define SCR1_RISCV_ISA_DECODING_SVH
8
 
9
`include "scr1_arch_description.svh"
10
`include "scr1_arch_types.svh"
11
 
12
//-------------------------------------------------------------------------------
13
// Instruction types
14
//-------------------------------------------------------------------------------
15 21 dinesha
//typedef enum logic [1:0] {
16
parameter    SCR1_INSTR_RVC0     = 2'b00;
17
parameter    SCR1_INSTR_RVC1     = 2'b01;
18
parameter    SCR1_INSTR_RVC2     = 2'b10;
19
parameter    SCR1_INSTR_RVI      = 2'b11;
20
//} type_scr1_instr_type_e;
21 11 dinesha
 
22
//-------------------------------------------------------------------------------
23
// RV32I opcodes (bits 6:2)
24
//-------------------------------------------------------------------------------
25 21 dinesha
//typedef enum logic [6:2] {
26
parameter    SCR1_OPCODE_LOAD        = 5'b00000;
27
parameter    SCR1_OPCODE_MISC_MEM    = 5'b00011;
28
parameter    SCR1_OPCODE_OP_IMM      = 5'b00100;
29
parameter    SCR1_OPCODE_AUIPC       = 5'b00101;
30
parameter    SCR1_OPCODE_STORE       = 5'b01000;
31
parameter    SCR1_OPCODE_OP          = 5'b01100;
32
parameter    SCR1_OPCODE_LUI         = 5'b01101;
33
parameter    SCR1_OPCODE_BRANCH      = 5'b11000;
34
parameter    SCR1_OPCODE_JALR        = 5'b11001;
35
parameter    SCR1_OPCODE_JAL         = 5'b11011;
36
parameter    SCR1_OPCODE_SYSTEM      = 5'b11100;
37
//} type_scr1_rvi_opcode_e;
38 11 dinesha
 
39
 
40
//-------------------------------------------------------------------------------
41
// IALU main operands
42
//-------------------------------------------------------------------------------
43
localparam SCR1_IALU_OP_ALL_NUM_E = 2;
44
localparam SCR1_IALU_OP_WIDTH_E   = $clog2(SCR1_IALU_OP_ALL_NUM_E);
45
typedef enum logic [SCR1_IALU_OP_WIDTH_E-1:0] {
46
    SCR1_IALU_OP_REG_IMM,          // op1 = rs1; op2 = imm
47
    SCR1_IALU_OP_REG_REG           // op1 = rs1; op2 = rs2
48
} type_scr1_ialu_op_sel_e;
49
 
50
//-------------------------------------------------------------------------------
51
// IALU main commands
52
//-------------------------------------------------------------------------------
53
`ifdef SCR1_RVM_EXT
54
localparam SCR1_IALU_CMD_ALL_NUM_E    = 23;
55
`else // ~SCR1_RVM_EXT
56
localparam SCR1_IALU_CMD_ALL_NUM_E    = 15;
57
`endif // ~SCR1_RVM_EXT
58
localparam SCR1_IALU_CMD_WIDTH_E      = $clog2(SCR1_IALU_CMD_ALL_NUM_E);
59
typedef enum logic [SCR1_IALU_CMD_WIDTH_E-1:0] {
60
    SCR1_IALU_CMD_NONE  = '0,   // IALU disable
61
    SCR1_IALU_CMD_AND,          // op1 & op2
62
    SCR1_IALU_CMD_OR,           // op1 | op2
63
    SCR1_IALU_CMD_XOR,          // op1 ^ op2
64
    SCR1_IALU_CMD_ADD,          // op1 + op2
65
    SCR1_IALU_CMD_SUB,          // op1 - op2
66
    SCR1_IALU_CMD_SUB_LT,       // op1 < op2
67
    SCR1_IALU_CMD_SUB_LTU,      // op1 u< op2
68
    SCR1_IALU_CMD_SUB_EQ,       // op1 = op2
69
    SCR1_IALU_CMD_SUB_NE,       // op1 != op2
70
    SCR1_IALU_CMD_SUB_GE,       // op1 >= op2
71
    SCR1_IALU_CMD_SUB_GEU,      // op1 u>= op2
72
    SCR1_IALU_CMD_SLL,          // op1 << op2
73
    SCR1_IALU_CMD_SRL,          // op1 >> op2
74
    SCR1_IALU_CMD_SRA           // op1 >>> op2
75
`ifdef SCR1_RVM_EXT
76
    ,
77
    SCR1_IALU_CMD_MUL,          // low(unsig(op1) * unsig(op2))
78
    SCR1_IALU_CMD_MULHU,        // high(unsig(op1) * unsig(op2))
79
    SCR1_IALU_CMD_MULHSU,       // high(op1 * unsig(op2))
80
    SCR1_IALU_CMD_MULH,         // high(op1 * op2)
81
    SCR1_IALU_CMD_DIV,          // op1 / op2
82
    SCR1_IALU_CMD_DIVU,         // op1 u/ op2
83
    SCR1_IALU_CMD_REM,          // op1 % op2
84
    SCR1_IALU_CMD_REMU          // op1 u% op2
85
`endif  // SCR1_RVM_EXT
86
} type_scr1_ialu_cmd_sel_e;
87
 
88
//-------------------------------------------------------------------------------
89
// IALU SUM2 operands (result is JUMP/BRANCH target, LOAD/STORE address)
90
//-------------------------------------------------------------------------------
91
localparam SCR1_SUM2_OP_ALL_NUM_E    = 2;
92
localparam SCR1_SUM2_OP_WIDTH_E      = $clog2(SCR1_SUM2_OP_ALL_NUM_E);
93
typedef enum logic [SCR1_SUM2_OP_WIDTH_E-1:0] {
94
    SCR1_SUM2_OP_PC_IMM,        // op1 = curr_pc; op2 = imm (AUIPC, target new_pc for JAL and branches)
95
    SCR1_SUM2_OP_REG_IMM        // op1 = rs1; op2 = imm (target new_pc for JALR, LOAD/STORE address)
96
`ifdef SCR1_XPROP_EN
97
    ,
98
    SCR1_SUM2_OP_ERROR = 'x
99
`endif // SCR1_XPROP_EN
100
} type_scr1_ialu_sum2_op_sel_e;
101
 
102
//-------------------------------------------------------------------------------
103
// LSU commands
104
//-------------------------------------------------------------------------------
105
localparam SCR1_LSU_CMD_ALL_NUM_E   = 9;
106
localparam SCR1_LSU_CMD_WIDTH_E     = $clog2(SCR1_LSU_CMD_ALL_NUM_E);
107
typedef enum logic [SCR1_LSU_CMD_WIDTH_E-1:0] {
108
    SCR1_LSU_CMD_NONE = '0,
109
    SCR1_LSU_CMD_LB,
110
    SCR1_LSU_CMD_LH,
111
    SCR1_LSU_CMD_LW,
112
    SCR1_LSU_CMD_LBU,
113
    SCR1_LSU_CMD_LHU,
114
    SCR1_LSU_CMD_SB,
115
    SCR1_LSU_CMD_SH,
116
    SCR1_LSU_CMD_SW
117
} type_scr1_lsu_cmd_sel_e;
118
 
119
//-------------------------------------------------------------------------------
120
// CSR operands
121
//-------------------------------------------------------------------------------
122
localparam SCR1_CSR_OP_ALL_NUM_E   = 2;
123
localparam SCR1_CSR_OP_WIDTH_E     = $clog2(SCR1_CSR_OP_ALL_NUM_E);
124
typedef enum logic [SCR1_CSR_OP_WIDTH_E-1:0] {
125
    SCR1_CSR_OP_IMM,
126
    SCR1_CSR_OP_REG
127
} type_scr1_csr_op_sel_e;
128
 
129
//-------------------------------------------------------------------------------
130
// CSR commands
131
//-------------------------------------------------------------------------------
132
localparam SCR1_CSR_CMD_ALL_NUM_E   = 4;
133
localparam SCR1_CSR_CMD_WIDTH_E     = $clog2(SCR1_CSR_CMD_ALL_NUM_E);
134
typedef enum logic [SCR1_CSR_CMD_WIDTH_E-1:0] {
135
    SCR1_CSR_CMD_NONE = '0,
136
    SCR1_CSR_CMD_WRITE,
137
    SCR1_CSR_CMD_SET,
138
    SCR1_CSR_CMD_CLEAR
139
} type_scr1_csr_cmd_sel_e;
140
 
141
//-------------------------------------------------------------------------------
142
// MPRF rd writeback source
143
//-------------------------------------------------------------------------------
144
localparam SCR1_RD_WB_ALL_NUM_E = 7;
145
localparam SCR1_RD_WB_WIDTH_E   = $clog2(SCR1_RD_WB_ALL_NUM_E);
146
typedef enum logic [SCR1_RD_WB_WIDTH_E-1:0] {
147
    SCR1_RD_WB_NONE = '0,
148
    SCR1_RD_WB_IALU,            // IALU main result
149
    SCR1_RD_WB_SUM2,            // IALU SUM2 result (AUIPC)
150
    SCR1_RD_WB_IMM,             // LUI
151
    SCR1_RD_WB_INC_PC,          // JAL(R)
152
    SCR1_RD_WB_LSU,             // Load from DMEM
153
    SCR1_RD_WB_CSR              // Read CSR
154
} type_scr1_rd_wb_sel_e;
155
 
156
//-------------------------------------------------------------------------------
157
// IDU to EXU full command structure
158
//-------------------------------------------------------------------------------
159
localparam SCR1_GPR_FIELD_WIDTH = 5;
160
 
161
typedef struct packed {
162
    logic                               instr_rvc;      // used with a different meaning for IFU access fault exception
163
    type_scr1_ialu_op_sel_e             ialu_op;
164
    type_scr1_ialu_cmd_sel_e            ialu_cmd;
165
    type_scr1_ialu_sum2_op_sel_e        sum2_op;
166
    type_scr1_lsu_cmd_sel_e             lsu_cmd;
167
    type_scr1_csr_op_sel_e              csr_op;
168
    type_scr1_csr_cmd_sel_e             csr_cmd;
169
    type_scr1_rd_wb_sel_e               rd_wb_sel;
170
    logic                               jump_req;
171
    logic                               branch_req;
172
    logic                               mret_req;
173
    logic                               fencei_req;
174
    logic                               wfi_req;
175
    logic [SCR1_GPR_FIELD_WIDTH-1:0]    rs1_addr;       // also used as zimm for CSRRxI instructions
176
    logic [SCR1_GPR_FIELD_WIDTH-1:0]    rs2_addr;
177
    logic [SCR1_GPR_FIELD_WIDTH-1:0]    rd_addr;
178
    logic [`SCR1_XLEN-1:0]              imm;            // used as {funct3, CSR address} for CSR instructions
179
                                                        // used as instruction field for illegal instruction exception
180
    logic                               exc_req;
181
    type_scr1_exc_code_e                exc_code;
182
} type_scr1_exu_cmd_s;
183
 
184
`endif // SCR1_RISCV_ISA_DECODING_SVH
185
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.