data/full_repos/permissive/205673649/MIPS/Source/alu_control.v
data/verilator_xmls/60d73e5c-cfc3-4899-9714-afabd5a11ebb.xml
module alu_control
#(
    parameter NB_ALU_CONTROL = 4,
    parameter NB_ALU_OP = 2,
    parameter NB_INSTRUCCION = 6
)
(
    input [NB_INSTRUCCION-1:0] i_inst_funcion,
    input [NB_INSTRUCCION-1:0] i_opcode,
    input [NB_ALU_OP-1:0] i_alu_op,
    output reg [NB_ALU_CONTROL-1:0] o_alu_code
);

always @(*)
begin
    case(i_alu_op)
        2'b00:
        begin
            o_alu_code = 4'b0110;
        end
        
        2'b01:
        begin
            o_alu_code = 4'b0111;
        end
        
        2'b10:
        begin
            case(i_inst_funcion)
                6'b000000: o_alu_code = 4'b0000;
                6'b000010: o_alu_code = 4'b0001;
                6'b000011: o_alu_code = 4'b0010;
                6'b000100: o_alu_code = 4'b0000;
                6'b000110: o_alu_code = 4'b0001;
                6'b000111: o_alu_code = 4'b0010;
                6'b100001: o_alu_code = 4'b0110;
                6'b100011: o_alu_code = 4'b0111;
                6'b100100: o_alu_code = 4'b1000;
                6'b100101: o_alu_code = 4'b1001;
                6'b100110: o_alu_code = 4'b1010;
                6'b100111: o_alu_code = 4'b1011;
                6'b101010: o_alu_code = 4'b1100;
                default: o_alu_code = 4'b0110;
            endcase
        end
        2'b11:
        begin
            case(i_opcode)
                6'b001000: o_alu_code=4'b0100;
                6'b001100: o_alu_code=4'b1000;
                6'b001101: o_alu_code=4'b1001;
                6'b001110: o_alu_code=4'b1010;
                6'b001111: o_alu_code=4'b0011;
                6'b001010: o_alu_code=4'b1100;
                default: o_alu_code = 4'b1000; 
            endcase
        end
        default: o_alu_code = 4'b0110;
    endcase
end

endmodule
module alu_control
#(
    parameter NB_ALU_CONTROL = 4,
    parameter NB_ALU_OP = 2,
    parameter NB_INSTRUCCION = 6
)
(
    input [NB_INSTRUCCION-1:0] i_inst_funcion,
    input [NB_INSTRUCCION-1:0] i_opcode,
    input [NB_ALU_OP-1:0] i_alu_op,
    output reg [NB_ALU_CONTROL-1:0] o_alu_code
);


always @(*)
begin
    case(i_alu_op)
        2'b00:
        begin
            o_alu_code = 4'b0110;
        end
        
        2'b01:
        begin
            o_alu_code = 4'b0111;
        end
        
        2'b10:
        begin
            case(i_inst_funcion)
                6'b000000: o_alu_code = 4'b0000;
                6'b000010: o_alu_code = 4'b0001;
                6'b000011: o_alu_code = 4'b0010;
                6'b000100: o_alu_code = 4'b0000;
                6'b000110: o_alu_code = 4'b0001;
                6'b000111: o_alu_code = 4'b0010;
                6'b100001: o_alu_code = 4'b0110;
                6'b100011: o_alu_code = 4'b0111;
                6'b100100: o_alu_code = 4'b1000;
                6'b100101: o_alu_code = 4'b1001;
                6'b100110: o_alu_code = 4'b1010;
                6'b100111: o_alu_code = 4'b1011;
                6'b101010: o_alu_code = 4'b1100;
                default: o_alu_code = 4'b0110;
            endcase
        end
        2'b11:
        begin
            case(i_opcode)
                6'b001000: o_alu_code=4'b0100;
                6'b001100: o_alu_code=4'b1000;
                6'b001101: o_alu_code=4'b1001;
                6'b001110: o_alu_code=4'b1010;
                6'b001111: o_alu_code=4'b0011;
                6'b001010: o_alu_code=4'b1100;
                default: o_alu_code = 4'b1000; 
            endcase
        end
        default: o_alu_code = 4'b0110;
    endcase
end

endmodule