`default_nettype none `timescale 1ns/1ps module decode ( input wire [6:2] opcode, input wire [2:0] func3, input wire func7, output reg wb_pc_d, output reg wb_mem_d, output reg wr_mem_d, output reg wr_reg_d, output reg [4:0] alu_op_d, output reg alu_1_d, output reg alu_2_d, output reg branch_d, output reg jump_d, output reg jump_r_d, output reg [3:0] i_b_j_u ); always @ (*) begin wb_pc_d = 1'bx; wb_mem_d = 1'bx; wr_mem_d = 1'bx; wr_reg_d = 1'bx; alu_op_d = 5'bxxxxx; alu_1_d = 1'bx; alu_2_d = 1'bx; branch_d = 1'bx; jump_d = 1'bx; jump_r_d = 1'bx; i_b_j_u = 4'bxxxx; case (opcode[6:2]) 5'b01100: // R Type begin wb_mem_d = 1'b0; wr_mem_d = 1'b0; wr_reg_d = 1'b1; alu_op_d = {1'b0, func7, func3}; alu_1_d = 1'b1; alu_2_d = 1'b1; branch_d = 1'b0; jump_d = 1'b0; i_b_j_u = 4'bxxxx; end 5'b00100: // Math I Type begin wb_mem_d = 1'b0; wr_mem_d = 1'b0; wr_reg_d = 1'b1; alu_op_d = {2'b0, func3}; alu_1_d = 1'b1; alu_2_d = 1'b0; branch_d = 1'b0; jump_d = 1'b0; i_b_j_u = 4'b1000; end 5'b00000: // Load I Type begin wb_mem_d = 1'b1; wr_mem_d = 1'b0; wr_reg_d = 1'b1; alu_op_d = 5'b0; alu_1_d = 1'b1; alu_2_d = 1'b0; branch_d = 1'b0; jump_d = 1'b0; i_b_j_u = 4'b1000; end 5'b01000: // S Type begin wr_mem_d = 1'b1; wr_reg_d = 1'b0; alu_op_d = 5'b0; alu_1_d = 1'b1; alu_2_d = 1'b0; branch_d = 1'b0; jump_d = 1'b0; i_b_j_u = 4'b0; end 5'b11000: // B Type begin wr_mem_d = 1'b0; wr_reg_d = 1'b0; alu_op_d = {2'b0, ~func3[2], func3[2], func3[1]}; alu_1_d = 1'b1; alu_2_d = 1'b1; branch_d = 1'b1; jump_d = 1'b0; jump_r_d = 1'b0; i_b_j_u = 4'b0100; end 5'b11011: // JAL begin wb_pc_d = 1'b1; wr_mem_d = 1'b0; wr_reg_d = 1'b1; branch_d = 1'b0; jump_d = 1'b1; jump_r_d = 1'b0; i_b_j_u = 4'b0010; end 5'b11001: // JALR begin wb_pc_d = 1'b1; wr_mem_d = 1'b0; wr_reg_d = 1'b1; branch_d = 1'b0; jump_d = 1'b1; jump_r_d = 1'b1; i_b_j_u = 4'b0010; end 5'b01101: // LUI begin wb_mem_d = 1'b0; wr_mem_d = 1'b0; wr_reg_d = 1'b1; alu_op_d = 5'b10000; // Pass through alu_2_d = 1'b0; branch_d = 1'b0; jump_d = 1'b0; i_b_j_u = 4'b0001; end 5'b00101: // AUIPC begin wb_mem_d = 1'b0; wr_mem_d = 1'b0; wr_reg_d = 1'b1; alu_op_d = 5'b0; //ADD alu_1_d = 1'b0; alu_2_d = 1'b0; branch_d = 1'b0; jump_d = 1'b0; i_b_j_u = 4'b0001; end default: begin end endcase end endmodule