summaryrefslogblamecommitdiff
path: root/verilog/decode.v
blob: 15108b672c584543d2cce89f1113200cfd22edb6 (plain) (tree)


















































































































































                                                                         
`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