diff options
author | Flavian Kaufmann <flavian@flaviankaufmann.ch> | 2024-05-21 13:50:28 +0200 |
---|---|---|
committer | Flavian Kaufmann <flavian@flaviankaufmann.ch> | 2024-05-21 13:50:28 +0200 |
commit | cb0be9e2039569ee7d18657e8f675d1f8369b407 (patch) | |
tree | 91fa71b3960d1ad5217759371143efbdd833d475 /rtl/src/alu_op_decode.v | |
parent | 98d0dd96611dc2c0e444eaf9410f8adf2924c6b5 (diff) | |
download | riscv_cpu-cb0be9e2039569ee7d18657e8f675d1f8369b407.tar.gz riscv_cpu-cb0be9e2039569ee7d18657e8f675d1f8369b407.zip |
restructured project
Diffstat (limited to 'rtl/src/alu_op_decode.v')
-rw-r--r-- | rtl/src/alu_op_decode.v | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/rtl/src/alu_op_decode.v b/rtl/src/alu_op_decode.v new file mode 100644 index 0000000..4523255 --- /dev/null +++ b/rtl/src/alu_op_decode.v @@ -0,0 +1,43 @@ +module alu_op_decode ( + input [6:0] opcode, + input [2:0] funct3, + input [6:0] funct7, + + input alu_ctrl, + + output reg [3:0] alu_op +); + +`include "include/consts.vh" + +always @ (*) begin + if (alu_ctrl == ALU_CTRL_ADD) begin + alu_op = ALU_OP_ADD; + end else if (opcode == OPCODE_REG || opcode == OPCODE_IMM) begin + case (funct3) + FUNCT3_ALU_ADD_SUB: alu_op = (opcode == OPCODE_REG && funct7 == FUNCT7_ALU_SUB) ? ALU_OP_SUB : ALU_OP_ADD; + FUNCT3_ALU_SLL: alu_op = ALU_OP_SLL; + FUNCT3_ALU_SLT: alu_op = ALU_OP_SLT; + FUNCT3_ALU_SLTU: alu_op = ALU_OP_SLTU; + FUNCT3_ALU_XOR: alu_op = ALU_OP_XOR; + FUNCT3_ALU_SR: alu_op = funct7 == FUNCT7_ALU_SRL ? ALU_OP_SRL : ALU_OP_SRA; + FUNCT3_ALU_OR: alu_op = ALU_OP_OR; + FUNCT3_ALU_AND: alu_op = ALU_OP_AND; + default: alu_op = ALU_OP_ADD; + endcase + end else if (opcode == OPCODE_BRANCH) begin + case (funct3) + FUNCT3_BRANCH_BEQ: alu_op = ALU_OP_SUB; + FUNCT3_BRANCH_BNE: alu_op = ALU_OP_SUB; + FUNCT3_BRANCH_BLT: alu_op = ALU_OP_SLT; + FUNCT3_BRANCH_BGE: alu_op = ALU_OP_SLT; + FUNCT3_BRANCH_BLTU: alu_op = ALU_OP_SLTU; + FUNCT3_BRANCH_BGEU: alu_op = ALU_OP_SLTU; + default: alu_op = ALU_OP_ADD; + endcase + end else begin + alu_op = ALU_OP_ADD; + end +end + +endmodule |