1 |
11 |
rafaelcalc |
//////////////////////////////////////////////////////////////////////////////////
|
2 |
|
|
// Engineer: Rafael de Oliveira Calçada (rafaelcalcada@gmail.com)
|
3 |
|
|
//
|
4 |
|
|
// Create Date: 25.04.2020 14:49:16
|
5 |
|
|
// Module Name: decoder
|
6 |
|
|
// Project Name: Steel Core
|
7 |
|
|
// Description: Decodes the instruction and generates control signals
|
8 |
|
|
//
|
9 |
|
|
// Dependencies: globals.vh
|
10 |
|
|
//
|
11 |
|
|
// Version 0.01
|
12 |
|
|
//
|
13 |
|
|
//////////////////////////////////////////////////////////////////////////////////
|
14 |
|
|
|
15 |
|
|
/*********************************************************************************
|
16 |
|
|
|
17 |
|
|
MIT License
|
18 |
|
|
|
19 |
|
|
Copyright (c) 2020 Rafael de Oliveira Calçada
|
20 |
|
|
|
21 |
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
22 |
|
|
of this software and associated documentation files (the "Software"), to deal
|
23 |
|
|
in the Software without restriction, including without limitation the rights
|
24 |
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
25 |
|
|
copies of the Software, and to permit persons to whom the Software is
|
26 |
|
|
furnished to do so, subject to the following conditions:
|
27 |
|
|
|
28 |
|
|
The above copyright notice and this permission notice shall be included in all
|
29 |
|
|
copies or substantial portions of the Software.
|
30 |
|
|
|
31 |
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
32 |
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
33 |
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
34 |
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
35 |
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
36 |
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
37 |
|
|
SOFTWARE.
|
38 |
|
|
|
39 |
|
|
********************************************************************************/
|
40 |
|
|
|
41 |
|
|
`timescale 1ns / 1ps
|
42 |
|
|
`include "globals.vh"
|
43 |
|
|
|
44 |
|
|
module decoder(
|
45 |
|
|
|
46 |
|
|
input wire [6:0] OPCODE,
|
47 |
|
|
input wire FUNCT7_5,
|
48 |
|
|
input wire [2:0] FUNCT3,
|
49 |
|
|
input wire [1:0] IADDER_OUT_1_TO_0,
|
50 |
|
|
input wire TRAP_TAKEN,
|
51 |
|
|
|
52 |
|
|
output wire [3:0] ALU_OPCODE,
|
53 |
|
|
output wire MEM_WR_REQ,
|
54 |
|
|
output wire [1:0] LOAD_SIZE,
|
55 |
|
|
output wire LOAD_UNSIGNED,
|
56 |
|
|
output wire ALU_SRC,
|
57 |
|
|
output wire IADDER_SRC,
|
58 |
|
|
output wire CSR_WR_EN,
|
59 |
|
|
output wire RF_WR_EN,
|
60 |
|
|
output wire [2:0] WB_MUX_SEL,
|
61 |
|
|
output wire [2:0] IMM_TYPE,
|
62 |
|
|
output wire [2:0] CSR_OP,
|
63 |
|
|
output wire ILLEGAL_INSTR,
|
64 |
|
|
output wire MISALIGNED_LOAD,
|
65 |
|
|
output wire MISALIGNED_STORE
|
66 |
|
|
|
67 |
|
|
);
|
68 |
|
|
|
69 |
|
|
wire is_branch;
|
70 |
|
|
wire is_jal;
|
71 |
|
|
wire is_jalr;
|
72 |
|
|
wire is_auipc;
|
73 |
|
|
wire is_lui;
|
74 |
|
|
wire is_load;
|
75 |
|
|
wire is_store;
|
76 |
|
|
wire is_system;
|
77 |
|
|
wire is_csr;
|
78 |
|
|
wire is_op;
|
79 |
|
|
wire is_op_imm;
|
80 |
|
|
wire is_misc_mem;
|
81 |
|
|
wire is_addi;
|
82 |
|
|
wire is_slti;
|
83 |
|
|
wire is_sltiu;
|
84 |
|
|
wire is_andi;
|
85 |
|
|
wire is_ori;
|
86 |
|
|
wire is_xori;
|
87 |
|
|
wire is_addiw;
|
88 |
|
|
wire is_implemented_instr;
|
89 |
|
|
wire mal_word;
|
90 |
|
|
wire mal_half;
|
91 |
|
|
wire misaligned;
|
92 |
|
|
|
93 |
|
|
assign LOAD_SIZE[0] = FUNCT3[0];
|
94 |
|
|
assign LOAD_SIZE[1] = FUNCT3[1];
|
95 |
|
|
assign LOAD_UNSIGNED = FUNCT3[2];
|
96 |
|
|
assign ALU_SRC = OPCODE[5];
|
97 |
|
|
assign is_branch = OPCODE[6] & OPCODE[5] & ~OPCODE[4] & ~OPCODE[3] & ~OPCODE[2];
|
98 |
|
|
assign is_jal = OPCODE[6] & OPCODE[5] & ~OPCODE[4] & OPCODE[3] & OPCODE[2];
|
99 |
|
|
assign is_jalr = OPCODE[6] & OPCODE[5] & ~OPCODE[4] & ~OPCODE[3] & OPCODE[2];
|
100 |
|
|
assign is_auipc = ~OPCODE[6] & ~OPCODE[5] & OPCODE[4] & ~OPCODE[3] & OPCODE[2];
|
101 |
|
|
assign is_lui = ~OPCODE[6] & OPCODE[5] & OPCODE[4] & ~OPCODE[3] & OPCODE[2];
|
102 |
|
|
assign is_op = ~OPCODE[6] & OPCODE[5] & OPCODE[4] & ~OPCODE[3] & ~OPCODE[2];
|
103 |
|
|
assign is_op_imm = ~OPCODE[6] & ~OPCODE[5] & OPCODE[4] & ~OPCODE[3] & ~OPCODE[2];
|
104 |
|
|
assign is_addi = is_op_imm & ~FUNCT3[2] & ~FUNCT3[1] & ~FUNCT3[0];
|
105 |
|
|
assign is_slti = is_op_imm & ~FUNCT3[2] & FUNCT3[1] & ~FUNCT3[0];
|
106 |
|
|
assign is_sltiu = is_op_imm & ~FUNCT3[2] & FUNCT3[1] & FUNCT3[0];
|
107 |
|
|
assign is_andi = is_op_imm & FUNCT3[2] & FUNCT3[1] & FUNCT3[0];
|
108 |
|
|
assign is_ori = is_op_imm & FUNCT3[2] & FUNCT3[1] & ~FUNCT3[0];
|
109 |
|
|
assign is_xori = is_op_imm & FUNCT3[2] & ~FUNCT3[1] & ~FUNCT3[0];
|
110 |
|
|
assign is_load = ~OPCODE[6] & ~OPCODE[5] & ~OPCODE[4] & ~OPCODE[3] & ~OPCODE[2];
|
111 |
|
|
assign is_store = ~OPCODE[6] & OPCODE[5] & ~OPCODE[4] & ~OPCODE[3] & ~OPCODE[2];
|
112 |
|
|
assign is_system = OPCODE[6] & OPCODE[5] & OPCODE[4] & ~OPCODE[3] & ~OPCODE[2];
|
113 |
|
|
assign is_misc_mem = ~OPCODE[6] & ~OPCODE[5] & ~OPCODE[4] & OPCODE[3] & OPCODE[2];
|
114 |
|
|
assign is_csr = is_system & (FUNCT3[2] | FUNCT3[1] | FUNCT3[0]);
|
115 |
|
|
assign IADDER_SRC = is_load | is_store | is_jalr;
|
116 |
|
|
assign RF_WR_EN = is_lui | is_auipc | is_jalr | is_jal | is_op | is_load | is_csr | is_op_imm;
|
117 |
|
|
assign CSR_WR_EN = is_csr;
|
118 |
|
|
assign ALU_OPCODE[2:0] = FUNCT3;
|
119 |
|
|
assign ALU_OPCODE[3] = FUNCT7_5 & ~(is_addi | is_slti | is_sltiu | is_andi | is_ori | is_xori);
|
120 |
|
|
assign WB_MUX_SEL[0] = is_load | is_auipc | is_jal | is_jalr;
|
121 |
|
|
assign WB_MUX_SEL[1] = is_lui | is_auipc;
|
122 |
|
|
assign WB_MUX_SEL[2] = is_csr | is_jal | is_jalr;
|
123 |
|
|
assign IMM_TYPE[0] = is_op_imm | is_load | is_jalr | is_branch | is_jal;
|
124 |
|
|
assign IMM_TYPE[1] = is_store | is_branch | is_csr;
|
125 |
|
|
assign IMM_TYPE[2] = is_lui | is_auipc | is_jal | is_csr;
|
126 |
|
|
assign CSR_OP = FUNCT3;
|
127 |
|
|
assign is_implemented_instr = is_op | is_op_imm | is_branch | is_jal | is_jalr | is_auipc | is_lui | is_system | is_misc_mem | is_load | is_store;
|
128 |
|
|
assign ILLEGAL_INSTR = ~OPCODE[1] | ~OPCODE[0] | ~is_implemented_instr;
|
129 |
|
|
assign mal_word = FUNCT3[1] & ~FUNCT3[0] & (IADDER_OUT_1_TO_0[1] | IADDER_OUT_1_TO_0[0]);
|
130 |
|
|
assign mal_half = ~FUNCT3[1] & FUNCT3[0] & IADDER_OUT_1_TO_0[0];
|
131 |
|
|
assign misaligned = mal_word | mal_half;
|
132 |
|
|
assign MISALIGNED_STORE = is_store & misaligned;
|
133 |
|
|
assign MISALIGNED_LOAD = is_load & misaligned;
|
134 |
|
|
assign MEM_WR_REQ = is_store & ~misaligned & ~TRAP_TAKEN;
|
135 |
|
|
|
136 |
|
|
|
137 |
|
|
endmodule
|