OpenCores
URL https://opencores.org/ocsvn/klc32/klc32/trunk

Subversion Repositories klc32

[/] [klc32/] [trunk/] [rtl/] [verilog/] [EXECUTE.v] - Diff between revs 2 and 10

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 2 Rev 10
Line 23... Line 23...
//
//
EXECUTE:
EXECUTE:
        begin
        begin
                state <= WRITEBACK;
                state <= WRITEBACK;
                case(opcode)
                case(opcode)
                `MISC:
 
                        case(func)
 
                        `STOP:
 
                                if (!sf) begin
 
                                        vector <= `PRIVILEGE_VIOLATION;
 
                                        state <= TRAP;
 
                                end
 
                                else begin
 
                                        im <= imm[18:16];
 
                                        tf <= imm[23];
 
                                        sf <= imm[21];
 
                                        clk_en <= 1'b0;
 
                                        state <= IFETCH;
 
                                end
 
                        endcase
 
                `R:
                `R:
                        begin
                        begin
                                case(func)
                                case(func)
                                `ABS:   res <= a[31] ? -a : a;
                                `ABS:   res <= a[31] ? -a : a;
                                `SGN:   res <= a[31] ? 32'hFFFFFFFF : |a;
                                `SGN:   res <= a[31] ? 32'hFFFFFFFF : |a;
                                `NEG:   res <= -a;
                                `NEG:   res <= -a;
                                `NOT:   res <= ~a;
                                `NOT:   res <= ~a;
                                `EXTB:  res <= {{24{a[7]}},a[7:0]};
                                `EXTB:  res <= {{24{a[7]}},a[7:0]};
                                `EXTH:  res <= {{16{a[15]}},a[15:0]};
                                `EXTH:  res <= {{16{a[15]}},a[15:0]};
                                default:        res <= 32'd0;
                                `MFSPR:
                                endcase
                                        casex(ir[25:21])
                                case(func)
                                        5'b00xxx:       res <= GetCr(ir[23:21]);
                                `EXEC:
                                        5'b01000:       res <= cr;
                                        begin
                                        5'b01001:       res <= usp;
                                        ir <= a;
                                        5'b01010:
                                        Rn <= a[25:21];
                                                        if (!sf) begin
                                        state <= REGFETCHA;
                                                                vector <= `PRIVILEGE_VIOLATION;
 
                                                                state <= TRAP;
                                        end
                                        end
                                `MOV_CRn2CRn:
                                                        else begin
                                        begin
                                                                res <= im;
                                        state <= IFETCH;
 
                                        case(ir[18:16])
 
                                        3'd0:   cr0 <= GetCr(ir[23:21]);
 
                                        3'd1:   cr1 <= GetCr(ir[23:21]);
 
                                        3'd2:   cr2 <= GetCr(ir[23:21]);
 
                                        3'd3:   cr3 <= GetCr(ir[23:21]);
 
                                        3'd4:   cr4 <= GetCr(ir[23:21]);
 
                                        3'd5:   cr5 <= GetCr(ir[23:21]);
 
                                        3'd6:   cr6 <= GetCr(ir[23:21]);
 
                                        3'd7:   cr7 <= GetCr(ir[23:21]);
 
                                        endcase
 
                                        end
                                        end
                                `MOV_REG2CRn:
                                        5'b01111:       res <= tick;
 
                                        endcase
 
                                `MTSPR:
 
                                        casex(ir[20:16])
 
                                        5'b00xxx:       // MTSPR CRn,Rn
                                        begin
                                        begin
 
                                                        state <= IFETCH;
                                        case(ir[18:16])
                                        case(ir[18:16])
                                        3'd0:   cr0 <= a[3:0];
                                        3'd0:   cr0 <= a[3:0];
                                        3'd1:   cr1 <= a[3:0];
                                        3'd1:   cr1 <= a[3:0];
                                        3'd2:   cr2 <= a[3:0];
                                        3'd2:   cr2 <= a[3:0];
                                        3'd3:   cr3 <= a[3:0];
                                        3'd3:   cr3 <= a[3:0];
Line 83... Line 63...
                                        3'd5:   cr5 <= a[3:0];
                                        3'd5:   cr5 <= a[3:0];
                                        3'd6:   cr6 <= a[3:0];
                                        3'd6:   cr6 <= a[3:0];
                                        3'd7:   cr7 <= a[3:0];
                                        3'd7:   cr7 <= a[3:0];
                                        endcase
                                        endcase
                                        end
                                        end
                                `MOV_CRn2REG:
                                        5'b01000:       // MTSPR CR,Rn
                                        res <= GetCr(ir[23:21]);
 
                                `MOV_CR2REG:
 
                                        res <= cr;
 
                                `MOV_REG2CR:
 
                                        begin
                                        begin
                                                state <= IFETCH;
                                                state <= IFETCH;
                                                cr0 <= a[3:0];
                                                cr0 <= a[3:0];
                                                cr1 <= a[7:4];
                                                cr1 <= a[7:4];
                                                cr2 <= a[11:8];
                                                cr2 <= a[11:8];
Line 99... Line 75...
                                                cr4 <= a[19:16];
                                                cr4 <= a[19:16];
                                                cr5 <= a[23:20];
                                                cr5 <= a[23:20];
                                                cr6 <= a[27:24];
                                                cr6 <= a[27:24];
                                                cr7 <= a[31:28];
                                                cr7 <= a[31:28];
                                        end
                                        end
                                `MOV_REG2IM:    if (!sf) begin
                                        5'b01001:       usp <= a;       // MTSPR USP,Rn
 
                                        5'b01010:
 
                                                        if (!sf) begin
                                                                        vector <= `PRIVILEGE_VIOLATION;
                                                                        vector <= `PRIVILEGE_VIOLATION;
                                                                        state <= TRAP;
                                                                        state <= TRAP;
                                                                end
                                                                end
                                                                else begin
                                                                else begin
                                                                        im <= a[2:0];
                                                                        im <= a[2:0];
                                                                        state <= IFETCH;
                                                                        state <= IFETCH;
                                                                end
                                                                end
                                `MOV_IM2REG:    if (!sf) begin
                                        endcase
                                                                        vector <= `PRIVILEGE_VIOLATION;
                                `EXEC:
                                                                        state <= TRAP;
                                        begin
 
                                        ir <= a;
 
                                        Rn <= a[25:21];
 
                                        state <= REGFETCHA;
                                                                end
                                                                end
                                                                else begin
                                `MOV_CRn2CRn:
                                                                        res <= im;
                                        begin
 
                                        state <= IFETCH;
 
                                        case(ir[18:16])
 
                                        3'd0:   cr0 <= GetCr(ir[23:21]);
 
                                        3'd1:   cr1 <= GetCr(ir[23:21]);
 
                                        3'd2:   cr2 <= GetCr(ir[23:21]);
 
                                        3'd3:   cr3 <= GetCr(ir[23:21]);
 
                                        3'd4:   cr4 <= GetCr(ir[23:21]);
 
                                        3'd5:   cr5 <= GetCr(ir[23:21]);
 
                                        3'd6:   cr6 <= GetCr(ir[23:21]);
 
                                        3'd7:   cr7 <= GetCr(ir[23:21]);
 
                                        endcase
                                                                end
                                                                end
                                `MOV_USP2REG:
                                default:        res <= 32'd0;
                                                res <= usp;
 
                                `MOV_REG2USP:
 
                                                usp <= a;
 
                                `MFTICK:
 
                                                res <= tick;
 
                                endcase
                                endcase
                        end
                        end
                `RR:
                `RR:
                        begin
                        begin
                                case(func)
                                case(func)
                                `ADD:   res <= a + b;
 
                                `SUB:   res <= a - b;
                                `SUB:   res <= a - b;
                                `CMP:   res <= a - b;
 
                                `AND:   res <= a & b;
                                `AND:   res <= a & b;
 
                                `ANDC:  res <= a & ~b;
                                `OR:    res <= a | b;
                                `OR:    res <= a | b;
 
                                `ORC:   res <= a | ~b;
                                `EOR:   res <= a ^ b;
                                `EOR:   res <= a ^ b;
                                `NAND:  res <= ~(a & b);
                                `NAND:  res <= ~(a & b);
                                `NOR:   res <= ~(a | b);
                                `NOR:   res <= ~(a | b);
                                `ENOR:  res <= ~(a ^ b);
                                `ENOR:  res <= ~(a ^ b);
                                `SHL:   res <= shlo[31: 0];
                                `SHL:   res <= shlo[31: 0];
Line 154... Line 141...
                                else if (func==`JSR_RR) begin
                                else if (func==`JSR_RR) begin
                                        tgt <= a + b;
                                        tgt <= a + b;
                                        tgt[1:0] <= 2'b00;
                                        tgt[1:0] <= 2'b00;
                                        state <= JSR1;
                                        state <= JSR1;
                                end
                                end
                                else if (func==`CROR) begin
 
                                        state <= IFETCH;
 
                                        case(ir[15:13])
 
                                        3'd0:   cr0[ir[12:11]] <= GetCrBit(ir[25:21])| GetCrBit(ir[20:16]);
 
                                        3'd1:   cr1[ir[12:11]] <= GetCrBit(ir[25:21])| GetCrBit(ir[20:16]);
 
                                        3'd2:   cr2[ir[12:11]] <= GetCrBit(ir[25:21])| GetCrBit(ir[20:16]);
 
                                        3'd3:   cr3[ir[12:11]] <= GetCrBit(ir[25:21])| GetCrBit(ir[20:16]);
 
                                        3'd4:   cr4[ir[12:11]] <= GetCrBit(ir[25:21])| GetCrBit(ir[20:16]);
 
                                        3'd5:   cr5[ir[12:11]] <= GetCrBit(ir[25:21])| GetCrBit(ir[20:16]);
 
                                        3'd6:   cr6[ir[12:11]] <= GetCrBit(ir[25:21])| GetCrBit(ir[20:16]);
 
                                        3'd7:   cr7[ir[12:11]] <= GetCrBit(ir[25:21])| GetCrBit(ir[20:16]);
 
                                        endcase
 
                                end
 
                                else if (func==`CRAND) begin
 
                                        state <= IFETCH;
 
                                        case(ir[15:13])
 
                                        3'd0:   cr0[ir[12:11]] <= GetCrBit(ir[25:21])& GetCrBit(ir[20:16]);
 
                                        3'd1:   cr1[ir[12:11]] <= GetCrBit(ir[25:21])& GetCrBit(ir[20:16]);
 
                                        3'd2:   cr2[ir[12:11]] <= GetCrBit(ir[25:21])& GetCrBit(ir[20:16]);
 
                                        3'd3:   cr3[ir[12:11]] <= GetCrBit(ir[25:21])& GetCrBit(ir[20:16]);
 
                                        3'd4:   cr4[ir[12:11]] <= GetCrBit(ir[25:21])& GetCrBit(ir[20:16]);
 
                                        3'd5:   cr5[ir[12:11]] <= GetCrBit(ir[25:21])& GetCrBit(ir[20:16]);
 
                                        3'd6:   cr6[ir[12:11]] <= GetCrBit(ir[25:21])& GetCrBit(ir[20:16]);
 
                                        3'd7:   cr7[ir[12:11]] <= GetCrBit(ir[25:21])& GetCrBit(ir[20:16]);
 
                                        endcase
 
                                end
 
                                else if (func==`CRXOR) begin
 
                                        state <= IFETCH;
 
                                        case(ir[15:13])
 
                                        3'd0:   cr0[ir[12:11]] <= GetCrBit(ir[25:21])^ GetCrBit(ir[20:16]);
 
                                        3'd1:   cr1[ir[12:11]] <= GetCrBit(ir[25:21])^ GetCrBit(ir[20:16]);
 
                                        3'd2:   cr2[ir[12:11]] <= GetCrBit(ir[25:21])^ GetCrBit(ir[20:16]);
 
                                        3'd3:   cr3[ir[12:11]] <= GetCrBit(ir[25:21])^ GetCrBit(ir[20:16]);
 
                                        3'd4:   cr4[ir[12:11]] <= GetCrBit(ir[25:21])^ GetCrBit(ir[20:16]);
 
                                        3'd5:   cr5[ir[12:11]] <= GetCrBit(ir[25:21])^ GetCrBit(ir[20:16]);
 
                                        3'd6:   cr6[ir[12:11]] <= GetCrBit(ir[25:21])^ GetCrBit(ir[20:16]);
 
                                        3'd7:   cr7[ir[12:11]] <= GetCrBit(ir[25:21])^ GetCrBit(ir[20:16]);
 
                                        endcase
 
                                end
 
                                else if (func==`CRNOR) begin
 
                                        state <= IFETCH;
 
                                        case(ir[15:13])
 
                                        3'd0:   cr0[ir[12:11]] <= ~(GetCrBit(ir[25:21])| GetCrBit(ir[20:16]));
 
                                        3'd1:   cr1[ir[12:11]] <= ~(GetCrBit(ir[25:21])| GetCrBit(ir[20:16]));
 
                                        3'd2:   cr2[ir[12:11]] <= ~(GetCrBit(ir[25:21])| GetCrBit(ir[20:16]));
 
                                        3'd3:   cr3[ir[12:11]] <= ~(GetCrBit(ir[25:21])| GetCrBit(ir[20:16]));
 
                                        3'd4:   cr4[ir[12:11]] <= ~(GetCrBit(ir[25:21])| GetCrBit(ir[20:16]));
 
                                        3'd5:   cr5[ir[12:11]] <= ~(GetCrBit(ir[25:21])| GetCrBit(ir[20:16]));
 
                                        3'd6:   cr6[ir[12:11]] <= ~(GetCrBit(ir[25:21])| GetCrBit(ir[20:16]));
 
                                        3'd7:   cr7[ir[12:11]] <= ~(GetCrBit(ir[25:21])| GetCrBit(ir[20:16]));
 
                                        endcase
 
                                end
 
                                else if (func==`CRNAND) begin
 
                                        state <= IFETCH;
 
                                        case(ir[15:13])
 
                                        3'd0:   cr0[ir[12:11]] <= ~(GetCrBit(ir[25:21])& GetCrBit(ir[20:16]));
 
                                        3'd1:   cr1[ir[12:11]] <= ~(GetCrBit(ir[25:21])& GetCrBit(ir[20:16]));
 
                                        3'd2:   cr2[ir[12:11]] <= ~(GetCrBit(ir[25:21])& GetCrBit(ir[20:16]));
 
                                        3'd3:   cr3[ir[12:11]] <= ~(GetCrBit(ir[25:21])& GetCrBit(ir[20:16]));
 
                                        3'd4:   cr4[ir[12:11]] <= ~(GetCrBit(ir[25:21])& GetCrBit(ir[20:16]));
 
                                        3'd5:   cr5[ir[12:11]] <= ~(GetCrBit(ir[25:21])& GetCrBit(ir[20:16]));
 
                                        3'd6:   cr6[ir[12:11]] <= ~(GetCrBit(ir[25:21])& GetCrBit(ir[20:16]));
 
                                        3'd7:   cr7[ir[12:11]] <= ~(GetCrBit(ir[25:21])& GetCrBit(ir[20:16]));
 
                                        endcase
 
                                end
 
                                else if (func==`CRXNOR) begin
 
                                        state <= IFETCH;
 
                                        case(ir[15:13])
 
                                        3'd0:   cr0[ir[12:11]] <= ~(GetCrBit(ir[25:21])^ GetCrBit(ir[20:16]));
 
                                        3'd1:   cr1[ir[12:11]] <= ~(GetCrBit(ir[25:21])^ GetCrBit(ir[20:16]));
 
                                        3'd2:   cr2[ir[12:11]] <= ~(GetCrBit(ir[25:21])^ GetCrBit(ir[20:16]));
 
                                        3'd3:   cr3[ir[12:11]] <= ~(GetCrBit(ir[25:21])^ GetCrBit(ir[20:16]));
 
                                        3'd4:   cr4[ir[12:11]] <= ~(GetCrBit(ir[25:21])^ GetCrBit(ir[20:16]));
 
                                        3'd5:   cr5[ir[12:11]] <= ~(GetCrBit(ir[25:21])^ GetCrBit(ir[20:16]));
 
                                        3'd6:   cr6[ir[12:11]] <= ~(GetCrBit(ir[25:21])^ GetCrBit(ir[20:16]));
 
                                        3'd7:   cr7[ir[12:11]] <= ~(GetCrBit(ir[25:21])^ GetCrBit(ir[20:16]));
 
                                        endcase
 
                                end
 
                                case(func)
                                case(func)
                                `LWX:   begin ea <= a + b; mopcode <= `LW; state <= MEMORY1; end
                                `LWX:   begin ea <= a + b; mopcode <= `LW; state <= MEMORY1; end
                                `LHX:   begin ea <= a + b; mopcode <= `LH; state <= MEMORY1; end
                                `LHX:   begin ea <= a + b; mopcode <= `LH; state <= MEMORY1; end
                                `LHUX:  begin ea <= a + b; mopcode <= `LHU; state <= MEMORY1; end
                                `LHUX:  begin ea <= a + b; mopcode <= `LHU; state <= MEMORY1; end
                                `LBX:   begin ea <= a + b; mopcode <= `LB; state <= MEMORY1; end
                                `LBX:   begin ea <= a + b; mopcode <= `LB; state <= MEMORY1; end
                                `LBUX:  begin ea <= a + b; mopcode <= `LBU; state <= MEMORY1; end
                                `LBUX:  begin ea <= a + b; mopcode <= `LBU; state <= MEMORY1; end
                                `SBX:   begin ea <= a + b; mopcode <= `SB; b <= c; state <= MEMORY1; end
                                `SBX:   begin ea <= a + b; mopcode <= `SB; b <= c; state <= MEMORY1; end
                                `SHX:   begin ea <= a + b; mopcode <= `SH; b <= c; state <= MEMORY1; end
                                `SHX:   begin ea <= a + b; mopcode <= `SH; b <= c; state <= MEMORY1; end
                                `SWX:   begin ea <= a + b; mopcode <= `SW; b <= c; state <= MEMORY1; end
                                `SWX:   begin ea <= a + b; mopcode <= `SW; b <= c; state <= MEMORY1; end
 
 
 
                                `MULU:  state <= MULTDIV1;
 
                                `MULS:  state <= MULTDIV1;
 
                                `MULUH: state <= MULTDIV1;
 
                                `MULSH: state <= MULTDIV1;
 
                                `DIVU:  state <= MULTDIV1;
 
                                `DIVS:  state <= MULTDIV1;
 
                                `MODU:  state <= MULTDIV1;
 
                                `MODS:  state <= MULTDIV1;
                                endcase
                                endcase
                        end
                        end
                `SETcc:
                `SETcc:
                        begin
                        begin
                                case(cond)
                                case(cond)
Line 269... Line 187...
                `SUBI:  res <= a - imm;
                `SUBI:  res <= a - imm;
                `CMPI:  res <= a - imm;
                `CMPI:  res <= a - imm;
                `ANDI:  res <= a & imm;
                `ANDI:  res <= a & imm;
                `ORI:   res <= a | imm;
                `ORI:   res <= a | imm;
                `EORI:  res <= a ^ imm;
                `EORI:  res <= a ^ imm;
                `CRxx:
/*
                        case(ir[20:16])
                        case(ir[20:16])
                        `ORI_CCR:
                        `ORI_CCR:
                                begin
                                begin
                                        state <= IFETCH;
                                        state <= IFETCH;
                                        cr0 <= cr0 | imm[3:0];
                                        cr0 <= cr0 | imm[3:0];
                                        cr1 <= cr1 | imm[7:4];
                                        cr1 <= cr1 | imm[7:4];
                                        cr2 <= cr2 | imm[11:8];
                                        cr2 <= cr2 | imm[11:8];
                                        cr3 <= cr3 | imm[15:12];
                                        cr3 <= cr3 | imm[15:12];
                                        cr4 <= cr4 | imm[19:16];
                                        cr4 <= cr4 | imm[19:16];
                                        cr5 <= cr5 | imm[23:20];
                                        cr5 <= cr5 | imm[23:20];
                                        cr6 <= cr6 | imm[27:24];
                                        cr6 <= cr6 | imm[27:24];
                                        cr7 <= cr7 | imm[31:28];
                                        cr7 <= cr7 | imm[31:28];
                                end
                                end
                        `ANDI_CCR:
                        `ANDI_CCR:
                                begin
                                begin
                                        state <= IFETCH;
                                        state <= IFETCH;
                                        cr0 <= cr0 & imm[3:0];
                                        cr0 <= cr0 & imm[3:0];
                                        cr1 <= cr1 & imm[7:4];
                                        cr1 <= cr1 & imm[7:4];
                                        cr2 <= cr2 & imm[11:8];
                                        cr2 <= cr2 & imm[11:8];
                                        cr3 <= cr3 & imm[15:12];
                                        cr3 <= cr3 & imm[15:12];
                                        cr4 <= cr4 & imm[19:16];
                                        cr4 <= cr4 & imm[19:16];
                                        cr5 <= cr5 & imm[23:20];
                                        cr5 <= cr5 & imm[23:20];
                                        cr6 <= cr6 & imm[27:24];
                                        cr6 <= cr6 & imm[27:24];
                                        cr7 <= cr7 & imm[31:28];
                                        cr7 <= cr7 & imm[31:28];
                                end
                                end
                        `EORI_CCR:
                        `EORI_CCR:
                                begin
                                begin
                                        state <= IFETCH;
                                        state <= IFETCH;
                                        cr0 <= cr0 ^ imm[3:0];
                                        cr0 <= cr0 ^ imm[3:0];
                                        cr1 <= cr1 ^ imm[7:4];
                                        cr1 <= cr1 ^ imm[7:4];
                                        cr2 <= cr2 ^ imm[11:8];
                                        cr2 <= cr2 ^ imm[11:8];
                                        cr3 <= cr3 ^ imm[15:12];
                                        cr3 <= cr3 ^ imm[15:12];
                                        cr4 <= cr4 ^ imm[19:16];
                                        cr4 <= cr4 ^ imm[19:16];
                                        cr5 <= cr5 ^ imm[23:20];
                                        cr5 <= cr5 ^ imm[23:20];
                                        cr6 <= cr6 ^ imm[27:24];
                                        cr6 <= cr6 ^ imm[27:24];
                                        cr7 <= cr7 ^ imm[31:28];
                                        cr7 <= cr7 ^ imm[31:28];
                                end
                                end
                        endcase
                        endcase
 
*/
                `LINK:  state <= LINK;
                `LINK:  state <= LINK;
 
                `MULUI: state <= MULTDIV1;
 
                `MULSI: state <= MULTDIV1;
 
                `DIVUI: state <= MULTDIV1;
 
                `DIVSI: state <= MULTDIV1;
                default:        res <= 32'd0;
                default:        res <= 32'd0;
                endcase
                endcase
                case(opcode)
                case(opcode)
                `TAS:   begin ea <= a + imm; mopcode <= opcode; state <= TAS; end
                `TAS:   begin ea <= a + imm; mopcode <= opcode; state <= TAS; end
                `LW:    begin ea <= a + imm; mopcode <= opcode; state <= MEMORY1; end
                `LW:    begin ea <= a + imm; mopcode <= opcode; state <= MEMORY1; end

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.