|
| 1 | +`include "alu_op.v" |
| 2 | +`include "opcodes.v" |
| 3 | + |
| 4 | +module ALUControlUnit(input [31:0] instr, |
| 5 | + output reg [7:0] alu_op); |
| 6 | + |
| 7 | + wire [6:0] opcode = instr[6:0]; |
| 8 | + wire [2:0] funct3 = instr[14:12]; |
| 9 | + wire Instr30 = instr[30]; |
| 10 | + |
| 11 | + wire [6:0] funct7; |
| 12 | + assign funct7 = {1'b0, Instr30, 5'b00000}; |
| 13 | + |
| 14 | + always @(*) begin |
| 15 | + case(opcode) |
| 16 | + `ARITHMETIC : begin |
| 17 | + case(funct3) |
| 18 | + `FUNCT3_ADD : begin // with `FUNCT7_SUB |
| 19 | + if(funct7 == `FUNCT7_SUB) alu_op = `SUB; |
| 20 | + else alu_op = `ADD; |
| 21 | + end |
| 22 | + `FUNCT3_SLL : alu_op = `SLL; |
| 23 | + `FUNCT3_XOR : alu_op = `XOR; |
| 24 | + `FUNCT3_OR : alu_op = `OR; |
| 25 | + `FUNCT3_AND : alu_op = `AND; |
| 26 | + `FUNCT3_SRL : alu_op = `SRL; |
| 27 | + default: alu_op = `ADD; |
| 28 | + endcase |
| 29 | + end |
| 30 | + `ARITHMETIC_IMM : begin |
| 31 | + case(funct3) |
| 32 | + `FUNCT3_ADD : alu_op = `ADD; |
| 33 | + `FUNCT3_SLL : alu_op = `SLL; |
| 34 | + `FUNCT3_XOR : alu_op = `XOR; |
| 35 | + `FUNCT3_OR : alu_op = `OR; |
| 36 | + `FUNCT3_AND : alu_op = `AND; |
| 37 | + `FUNCT3_SRL : alu_op = `SRL; |
| 38 | + default: alu_op = `ADD; |
| 39 | + endcase |
| 40 | + end |
| 41 | + `LOAD, `STORE, `JALR : begin |
| 42 | + alu_op = `ADD; |
| 43 | + end |
| 44 | + `BRANCH : begin |
| 45 | + case(funct3) |
| 46 | + `FUNCT3_BEQ : alu_op = `BEQ; |
| 47 | + `FUNCT3_BNE : alu_op = `BNE; |
| 48 | + `FUNCT3_BLT : alu_op = `BLT; |
| 49 | + `FUNCT3_BGE : alu_op = `BGE; |
| 50 | + default: alu_op = `BEQ; |
| 51 | + endcase |
| 52 | + end |
| 53 | + default: alu_op = `ADD; |
| 54 | + endcase |
| 55 | + end |
| 56 | + |
| 57 | +endmodule |
0 commit comments