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

Subversion Repositories rf68000

[/] [rf68000/] [trunk/] [rtl/] [cpu/] [rf68000.sv] - Diff between revs 6 and 8

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

Rev 6 Rev 8
Line 423... Line 423...
 
 
        FETCH_HEXI1,
        FETCH_HEXI1,
        FETCH_HEXI2,
        FETCH_HEXI2,
        FETCH_HEXI3,
        FETCH_HEXI3,
        FETCH_HEXI4,
        FETCH_HEXI4,
 
        FETCH_NOP_HEXI,
        STORE_HEXI1,
        STORE_HEXI1,
        STORE_HEXI2,
        STORE_HEXI2,
        STORE_HEXI3,
        STORE_HEXI3,
        STORE_HEXI4,
        STORE_HEXI4,
 
 
 
        FMOVEM1,
 
 
 
        FETCH_IMM96,
 
        FETCH_IMM96b,
 
        FETCH_IMM96c,
 
        FETCH_IMM96d,
 
 
 
        CCHK,
 
 
        FSDATA2
        FSDATA2
} state_t;
} state_t;
 
 
typedef enum logic [4:0] {
typedef enum logic [4:0] {
        FU_NONE = 5'd0,
        FU_NONE = 5'd0,
Line 491... Line 501...
state_t rstate;
state_t rstate;
state_t state_stk1;
state_t state_stk1;
state_t state_stk2;
state_t state_stk2;
state_t state_stk3;
state_t state_stk3;
state_t state_stk4;
state_t state_stk4;
 
state_t state_stk5;
state_t sz_state;
state_t sz_state;
flag_update_t flag_update;
flag_update_t flag_update;
reg [31:0] d0 = 'd0;
reg [31:0] d0 = 'd0;
reg [31:0] d1 = 'd0;
reg [31:0] d1 = 'd0;
reg [31:0] d2 = 'd0;
reg [31:0] d2 = 'd0;
Line 571... Line 582...
reg [31:0] isr;
reg [31:0] isr;
reg [3:0] ifmt;
reg [3:0] ifmt;
reg [7:0] fpcnt;
reg [7:0] fpcnt;
reg [31:0] pc;
reg [31:0] pc;
reg [31:0] opc;                 // pc for branch references
reg [31:0] opc;                 // pc for branch references
 
reg [31:0] fpiar;
reg [31:0] ssp,usp;
reg [31:0] ssp,usp;
reg [31:0] disp;
reg [31:0] disp;
reg [31:0] s,d,dd,imm,immx;
reg [31:0] s,d,dd,imm,immx;
reg [31:0] bit2test;
reg [31:0] bit2test;
reg wl;
reg wl;
Line 746... Line 758...
reg [4:0] rst_cnt;
reg [4:0] rst_cnt;
reg [2:0] shift_op;
reg [2:0] shift_op;
reg rtr;
reg rtr;
reg bsr;
reg bsr;
reg lea;
reg lea;
reg fsub;
reg fsub,fabs;
reg bcdsub, bcdneg;
reg bcdsub, bcdneg;
 
reg fmovem;
reg [31:0] dati_buf;    // input data from bus error
reg [31:0] dati_buf;    // input data from bus error
reg [31:0] dato_buf;
reg [31:0] dato_buf;
 
 
// CSR's
// CSR's
reg [31:0] tick;        // FF0
reg [31:0] tick;        // FF0
Line 763... Line 776...
reg [31:0] apc;
reg [31:0] apc;
reg [7:0] cpl;
reg [7:0] cpl;
reg [31:0] tr;
reg [31:0] tr;
reg [31:0] tcba;
reg [31:0] tcba;
reg [31:0] mmus, ios, iops;
reg [31:0] mmus, ios, iops;
 
reg [31:0] canary;
assign mmus_o = adr_o[31:20] == mmus[31:20];
assign mmus_o = adr_o[31:20] == mmus[31:20];
assign iops_o = adr_o[31:16] == iops[31:16];
assign iops_o = adr_o[31:16] == iops[31:16];
assign ios_o  = adr_o[31:20] == ios [31:20];
assign ios_o  = adr_o[31:20] == ios [31:20];
 
 
wire [16:0] lfsr_o;
wire [16:0] lfsr_o;
Line 1181... Line 1195...
        rtr <= 1'b0;
        rtr <= 1'b0;
        bsr <= 1'b0;
        bsr <= 1'b0;
        lea <= 1'b0;
        lea <= 1'b0;
        divs <= 1'b0;
        divs <= 1'b0;
        fsub <= 1'b0;
        fsub <= 1'b0;
 
        fabs <= 1'b0;
        bcdsub <= 1'b0;
        bcdsub <= 1'b0;
        bcdneg <= 1'b0;
        bcdneg <= 1'b0;
 
        fmovem <= 1'b0;
        icnt <= 'd0;
        icnt <= 'd0;
        is_bus_err <= 1'b0;
        is_bus_err <= 1'b0;
        is_adr_err <= 1'b0;
        is_adr_err <= 1'b0;
        is_trace <= 1'b0;
        is_trace <= 1'b0;
        is_priv <= 1'b0;
        is_priv <= 1'b0;
Line 1200... Line 1216...
        use_dfc <= 'd0;
        use_dfc <= 'd0;
        ext_ir <= 1'b0;
        ext_ir <= 1'b0;
        ios  <= 32'hFD000000;
        ios  <= 32'hFD000000;
        iops <= 32'hFD100000;
        iops <= 32'hFD100000;
        mmus <= 32'hFDC00000;
        mmus <= 32'hFDC00000;
 
        canary <= 'd0;
end
end
else begin
else begin
 
 
if (rst_cnt != 5'd0)
if (rst_cnt != 5'd0)
    rst_cnt <= rst_cnt - 5'd1;
    rst_cnt <= rst_cnt - 5'd1;
Line 1793... Line 1810...
                MMMRRR <= 1'b0;
                MMMRRR <= 1'b0;
                rtr <= 1'b0;
                rtr <= 1'b0;
                bsr <= 1'b0;
                bsr <= 1'b0;
                lea <= 1'b0;
                lea <= 1'b0;
                fsub <= 1'b0;
                fsub <= 1'b0;
 
                fabs <= 1'b0;
                bcdsub <= 1'b0;
                bcdsub <= 1'b0;
                bcdneg <= 1'b0;
                bcdneg <= 1'b0;
 
                fmovem <= 1'b0;
                is_illegal <= 1'b0;
                is_illegal <= 1'b0;
                use_sfc <= 1'b0;
                use_sfc <= 1'b0;
                use_dfc <= 1'b0;
                use_dfc <= 1'b0;
                fpcnt <= 'd0;
                fpcnt <= 'd0;
 
                fpiar <= pc;
                if (!cyc_o) begin
                if (!cyc_o) begin
                        is_nmi <= 1'b0;
                        is_nmi <= 1'b0;
                        is_irq <= 1'b0;
                        is_irq <= 1'b0;
                        /*
                        /*
                        if (pe_nmi) begin
                        if (pe_nmi) begin
Line 2620... Line 2640...
                                16'h0001:
                                16'h0001:
                                        begin
                                        begin
                                                d <= rfoDnn;
                                                d <= rfoDnn;
                                                goto (BCD2BIN1);
                                                goto (BCD2BIN1);
                                        end
                                        end
 
                                16'h0003:
 
                                        begin
 
                                                push(CCHK);
 
                                                fs_data(mmm,rrr,FETCH_LWORD,S);
 
                                        end
                                default:        tIllegal();
                                default:        tIllegal();
                                endcase
                                endcase
                        end
                        end
                        else
                        else
                                tIllegal();
                                tIllegal();
Line 2636... Line 2661...
                        ext_ir <= 1'b0;
                        ext_ir <= 1'b0;
                        if (ir[11:9]==3'b001) begin
                        if (ir[11:9]==3'b001) begin
                                casez(ir2[15:8])
                                casez(ir2[15:8])
                                8'h6?,8'h7?:    // FMOVE to memory
                                8'h6?,8'h7?:    // FMOVE to memory
                                        begin
                                        begin
                                                if (ir2[12:10]==3'b000) begin
                                                case(ir2[12:10])
 
                                                3'b000,3'b100,3'b110:
 
                                                        begin
                                                        fps <= rfoFpdst;
                                                        fps <= rfoFpdst;
                                                        goto (DF2I1);
                                                        goto (DF2I1);
                                                end
                                                end
                                                else begin
                                                3'b011:
 
                                                        begin
                                                        fpd <= rfoFpdst;
                                                        fpd <= rfoFpdst;
                                                        fs_data(mmm,rrr,STORE_HEXI1,D);
                                                        fs_data(mmm,rrr,STORE_HEXI1,D);
                                                end
                                                end
 
                                                default:
 
                                                        begin
 
                                                                fpd <= rfoFpdst;
 
                                                                fs_data(mmm,rrr,STORE_HEXI1,D);
 
                                                        end
 
                                                endcase
                                        end
                                        end
                                8'b10????00:    // PG 4-71
                                8'b10????00:    // PG 4-71
                                        if (ir2[13])
                                        if (ir2[13])
                                                case(ir2[7:0])
                                                case(ir2[7:0])
                                                8'h00:  // FMOVE
                                                8'h00:  // FMOVE
                                                        case(ir2[12:10])
                                                        case(ir2[12:10])
                                                        3'b001: tIllegal();     // FPIAR
                                                        3'b001: // FPIAR
 
                                                                begin
 
                                                                        d <= fpiar;
 
                                                                        fs_data(mmm,rrr,STORE_LWORD,D);
 
                                                                end
                                                        3'b010: // FPSR
                                                        3'b010: // FPSR
                                                                begin
                                                                begin
                                                                        d <= fpsr;
                                                                        d <= fpsr;
                                                                        fs_data(mmm,rrr,STORE_LWORD,D);
                                                                        fs_data(mmm,rrr,STORE_LWORD,D);
                                                                end
                                                                end
Line 2663... Line 2701...
                                                        endcase
                                                        endcase
                                                default:        tIllegal();
                                                default:        tIllegal();
                                                endcase
                                                endcase
                                        else
                                        else
                                                tIllegal();
                                                tIllegal();
 
                                8'b11??????:    // FMOVEM
 
                                        begin
 
                                                fmovem <= 1'b1;
 
                                                if (ir2[11]) begin      // dynamic list?
 
                                                        rrr <= ir2[6:4];
 
                                                        goto (FMOVEM1);
 
                                                end
 
                                                else begin
 
                                                        imm <= ir2[7:0];
 
                                                        if (ir2[13])
 
                                                                goto(MOVEM_Xn2D);
 
                                                        else
 
                                                                goto(MOVEM_s2Xn);
 
                                                end
 
                                        end
                                8'h??:
                                8'h??:
                                        case(ir2[6:0])
                                        case(ir2[6:0])
                                        7'b0000000:     // FMOVE
                                        7'b0000000:     // FMOVE
                                                if (ir2[14]) begin      // RM
                                                if (ir2[14]) begin      // RM
                                                        push(FMOVE);
                                                        push(FMOVE);
                                                        if (ir2[12:10]==3'b000)
                                                        case(ir2[12:10])
                                                                fs_data(mmm,rrr,FETCH_LWORD,S);
                                                        3'b000: fs_data(mmm,rrr,FETCH_LWORD,S);
                                                        else
                                                        3'b100: fs_data(mmm,rrr,FETCH_WORD,S);
                                                                fs_data(mmm,rrr,FETCH_HEXI1,S);
                                                        3'b110: fs_data(mmm,rrr,FETCH_BYTE,S);
 
                                                        default:        fs_data(mmm,rrr,FETCH_HEXI1,S);
 
                                                        endcase
                                                end
                                                end
                                                else begin
                                                else begin
                                                        fps <= rfoFpsrc;
                                                        fps <= rfoFpsrc;
                                                        goto(FMOVE);
                                                        goto(FMOVE);
                                                end
                                                end
Line 2723... Line 2778...
                                                        fsub <= 1'b1;
                                                        fsub <= 1'b1;
                                                        fpd <= rfoFpdst;
                                                        fpd <= rfoFpdst;
                                                        fps <= rfoFpsrc;
                                                        fps <= rfoFpsrc;
                                                        goto(FADD);
                                                        goto(FADD);
                                                end
                                                end
 
                                        7'b0011000:     // FABS
 
                                                if (ir2[14]) begin      // RM
 
                                                        fabs <= 1'b1;
 
                                                        push(FNEG);
 
                                                        fs_data(mmm,rrr,FETCH_HEXI1,S);
 
                                                end
 
                                                else begin
 
                                                        fabs <= 1'b1;
 
                                                        fps <= rfoFpsrc;
 
                                                        goto(FNEG);
 
                                                end
                                        7'b0011010:     // FNEG
                                        7'b0011010:     // FNEG
                                                if (ir2[14]) begin      // RM
                                                if (ir2[14]) begin      // RM
                                                        push(FNEG);
                                                        push(FNEG);
                                                        fs_data(mmm,rrr,FETCH_HEXI1,S);
                                                        fs_data(mmm,rrr,FETCH_HEXI1,S);
                                                end
                                                end
Line 2746... Line 2812...
                                                        goto(FCMP);
                                                        goto(FCMP);
                                                end
                                                end
                                        7'b0111010:     // FTST
                                        7'b0111010:     // FTST
                                                if (ir2[14]) begin
                                                if (ir2[14]) begin
                                                        push (FTST);
                                                        push (FTST);
                                                        fs_data(mmm,rrr,FETCH_HEXI1,S);
                                                        case(ir2[12:10])
 
                                                        3'b000: fs_data(mmm,rrr,FETCH_LWORD,S);
 
                                                        3'b011: fs_data(mmm,rrr,FETCH_HEXI1,S);
 
                                                        3'b100: fs_data(mmm,rrr,FETCH_WORD,S);
 
                                                        3'b110: fs_data(mmm,rrr,FETCH_BYTE,S);
 
                                                        default:        fs_data(mmm,rrr,FETCH_HEXI1,S);
 
                                                        endcase
                                                end
                                                end
                                                else begin
                                                else begin
                                                        fnf <= rfoFpsrc[95];
                                                        fnf <= rfoFpsrc[95];
                                                        fzf <= rfoFpsrc[94:0]=='d0;
                                                        fzf <= rfoFpsrc[94:0]=='d0;
                                                        ret();
                                                        ret();
Line 2766... Line 2838...
                                                        default:        fs_data(mmm,rrr,FETCH_LWORD,S);
                                                        default:        fs_data(mmm,rrr,FETCH_LWORD,S);
                                                        endcase
                                                        endcase
                                                end
                                                end
                                                else begin
                                                else begin
                                                        fpd <= rfoFpdst;
                                                        fpd <= rfoFpdst;
                                                        push(FSCALE);
                                                        fps <= rfoFpsrc;
                                                        fs_data(3'b000,FLTSRC,FETCH_LWORD,S);
 
                                                        goto(FSCALE);
                                                        goto(FSCALE);
                                                end
                                                end
/*
/*
                                        7'b0011011:     // FGETEXP2
                                        7'b0011011:     // FGETEXP2
                                                begin
                                                begin
Line 3203... Line 3274...
                Rt <= rrrr;
                Rt <= rrrr;
                ret();
                ret();
        end
        end
 
 
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
 
// Flags are not updated if the target is an address register.
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
 
 
STORE_IN_DEST:
STORE_IN_DEST:
        begin
        begin
//              state <= IFETCH;        // In event of bad ir
 
//              ret();
 
                resL <= s;
                resL <= s;
                resW <= s[15:0];
                resW <= s[15:0];
                resB <= s[7:0];
                resB <= s[7:0];
                d <= s;
                d <= s;
 
                if (ir[8:6]!=3'b001) begin
                case(ir[15:12])
                case(ir[15:12])
                4'd1:   begin zf <= s[ 7:0]== 8'h00; nf <= s[7]; end
                4'd1:   begin zf <= s[ 7:0]== 8'h00; nf <= s[7]; end
                4'd3:   begin zf <= s[15:0]==16'h00; nf <= s[15]; end
                4'd3:   begin zf <= s[15:0]==16'h00; nf <= s[15]; end
                4'd2:   begin zf <= s[31:0]==32'd0;  nf <= s[31]; end
                4'd2:   begin zf <= s[31:0]==32'd0;  nf <= s[31]; end
                default:        ;
                default:        ;
                endcase
                endcase
                cf <= 1'b0;
                cf <= 1'b0;
                vf <= 1'b0;
                vf <= 1'b0;
 
                end
                case(ir[15:12])
                case(ir[15:12])
                4'd1:   fs_data(MMM,RRR,STORE_BYTE,D);
                4'd1:   fs_data(MMM,RRR,STORE_BYTE,D);
                4'd2:   fs_data(MMM,RRR,STORE_LWORD,D);
                4'd2:   fs_data(MMM,RRR,STORE_LWORD,D);
                4'd3:   fs_data(MMM,RRR,STORE_WORD,D);
                4'd3:   fs_data(MMM,RRR,STORE_WORD,D);
                default:        ;       // cant get here
                default:        ;       // cant get here
Line 4263... Line 4336...
        begin
        begin
                pc <= pc + 32'd4;
                pc <= pc + 32'd4;
                ret();
                ret();
        end
        end
 
 
 
`ifdef SUPPORT_DECFLT
 
FETCH_IMM96:
 
        begin
 
                call(FETCH_IMM32,FETCH_IMM96b);
 
        end
 
FETCH_IMM96b:
 
        begin
 
`ifdef BIG_ENDIAN
 
                fps[95:64] <= imm;
 
`else
 
                fps[31: 0] <= imm;
 
`endif
 
                call(FETCH_IMM32,FETCH_IMM96c);
 
        end
 
FETCH_IMM96c:
 
        begin
 
`ifdef BIG_ENDIAN
 
                fps[63:32] <= imm;
 
`else
 
                fps[63:32] <= imm;
 
`endif
 
                call(FETCH_IMM32,FETCH_IMM96d);
 
        end
 
FETCH_IMM96d:
 
        begin
 
`ifdef BIG_ENDIAN
 
                fps[31: 0] <= imm;
 
`else
 
                fps[95:64] <= imm;
 
`endif
 
                ret();
 
        end
 
`endif
 
 
// Fetch 32 bit displacement
// Fetch 32 bit displacement
//
//
FETCH_D32:
FETCH_D32:
        if (!cyc_o) begin
        if (!cyc_o) begin
                fc_o <= {sf,2'b10};
                fc_o <= {sf,2'b10};
Line 4503... Line 4610...
                sel_o <= 4'b00;
                sel_o <= 4'b00;
                if (ea[1]) begin
                if (ea[1]) begin
`ifdef BIG_ENDIAN
`ifdef BIG_ENDIAN
      if (ds==D)
      if (ds==D)
        d[31:16] <= {dat_i[23:16],dat_i[31:24]};
        d[31:16] <= {dat_i[23:16],dat_i[31:24]};
      else begin
      else
        s[31:16] <= {dat_i[23:16],dat_i[31:24]};
        s[31:16] <= {dat_i[23:16],dat_i[31:24]};
        fps[31:16] <= {dat_i[23:16],dat_i[31:24]};
 
      end
 
`else
`else
      if (ds==D)
      if (ds==D)
        d[15:0] <= dat_i[31:16];
        d[15:0] <= dat_i[31:16];
      else begin
      else
        s[15:0] <= dat_i[31:16];
        s[15:0] <= dat_i[31:16];
        fps[15:0] <= dat_i[31:16];
 
      end
 
`endif
`endif
                goto (FETCH_LWORDa);
                goto (FETCH_LWORDa);
    end
    end
    else begin
    else begin
      cyc_o <= `LOW;
      cyc_o <= `LOW;
`ifdef BIG_ENDIAN
`ifdef BIG_ENDIAN
      if (ds==D)
      if (ds==D)
        d <= rbo(dat_i);
        d <= rbo(dat_i);
      else begin
      else
        s <= rbo(dat_i);
        s <= rbo(dat_i);
        fps <= rbo(dat_i);
 
      end
 
`else
`else
      if (ds==D)
      if (ds==D)
        d <= dat_i;
        d <= dat_i;
      else begin
      else
        s <= dat_i;
        s <= dat_i;
        fps <= dat_i;
 
      end
 
`endif
`endif
      ret();
      ret();
    end
    end
        end
        end
FETCH_LWORDa:
FETCH_LWORDa:
Line 4551... Line 4650...
                stb_o <= 1'b0;
                stb_o <= 1'b0;
                sel_o <= 4'b00;
                sel_o <= 4'b00;
`ifdef BIG_ENDIAN
`ifdef BIG_ENDIAN
                if (ds==D)
                if (ds==D)
                        d[15:0] <= {dat_i[7:0],dat_i[15:8]};
                        d[15:0] <= {dat_i[7:0],dat_i[15:8]};
                else begin
                else
                        s[15:0] <= {dat_i[7:0],dat_i[15:8]};
                        s[15:0] <= {dat_i[7:0],dat_i[15:8]};
                        fps[15:0] <= {dat_i[7:0],dat_i[15:8]};
 
                end
 
`else
`else
                if (ds==D)
                if (ds==D)
                        d[31:16] <= dat_i[15:0];
                        d[31:16] <= dat_i[15:0];
                else begin
                else
                        s[31:16] <= dat_i[15:0];
                        s[31:16] <= dat_i[15:0];
                        fps[31:16] <= dat_i[15:0];
 
                end
 
`endif
`endif
                ret();
                ret();
        end
        end
 
 
`ifdef SUPPORT_DECFLT
`ifdef SUPPORT_DECFLT
/*
 
FETCH_HEXI1:
FETCH_HEXI1:
        if (!cyc_o) begin
        call (FETCH_LWORD,FETCH_HEXI2);
                fc_o <= {sf,2'b01};
FETCH_HEXI2:
                cyc_o <= 1'b1;
        begin
                stb_o <= 1'b1;
 
                sel_o <= 4'b1111;
 
                adr_o <= ea;
 
        end
 
        else if (ack_i) begin
 
`ifdef BIG_ENDIAN
 
                if (ds==S)
 
                        fps[127:96] <= rbo(dat_i);
 
                else
 
                        fpd[127:96] <= rbo(dat_i);
 
`else
 
                if (ds==S)
 
                        fps[31:0] <= dat_i;
 
                else
 
                        fpd[31:0] <= dat_i;
 
`endif
 
                stb_o <= 1'b0;
 
                goto (FETCH_HEXI2);
 
        end
 
*/
 
FETCH_HEXI1:
 
        if (!stb_o) begin
 
                fc_o <= {sf,2'b01};
 
                cyc_o <= 1'b1;
 
                stb_o <= 1'b1;
 
                sel_o <= 4'b1111;
 
                adr_o <= ea + 4'd0;
 
        end
 
        else if (ack_i) begin
 
`ifdef BIG_ENDIAN
`ifdef BIG_ENDIAN
                if (ds==S)
                if (ds==S)
                        fps[95:64] <= rbo(dat_i);
                        fps[95:64] <= s;
                else
                else
                        fpd[95:64] <= rbo(dat_i);
                        fpd[95:64] <= d;
`else
`else
                if (ds==S)
                if (ds==S)
                        fps[63:32] <= dat_i;
                        fps[31: 0] <= s;
                else
                else
                        fpd[63:32] <= dat_i;
                        fpd[31: 0] <= d;
`endif
`endif
                stb_o <= 1'b0;
                ea <= ea + 4'd4;
                goto (FETCH_HEXI3);
                call (FETCH_LWORD,FETCH_HEXI3);
        end
        end
FETCH_HEXI3:
FETCH_HEXI3:
        if (!stb_o) begin
        begin
                stb_o <= 1'b1;
 
                adr_o <= ea + 4'd4;
 
        end
 
        else if (ack_i) begin
 
`ifdef BIG_ENDIAN
`ifdef BIG_ENDIAN
                if (ds==S)
                if (ds==S)
                        fps[63:32] <= rbo(dat_i);
                        fps[63:32] <= s;
                else
                else
                        fpd[63:32] <= rbo(dat_i);
                        fpd[63:32] <= d;
`else
`else
                if (ds==S)
                if (ds==S)
                        fps[95:64] <= dat_i;
                        fps[63:32] <= s;
                else
                else
                        fpd[95:64] <= dat_i;
                        fpd[63:32] <= d;
`endif
`endif
                stb_o <= 1'b0;
                ea <= ea + 4'd4;
                goto (FETCH_HEXI4);
                call (FETCH_LWORD,FETCH_HEXI4);
        end
        end
FETCH_HEXI4:
FETCH_HEXI4:
        if (!stb_o) begin
        begin
                stb_o <= 1'b1;
 
                adr_o <= ea + 4'd8;
 
        end
 
        else if (ack_i) begin
 
`ifdef BIG_ENDIAN
`ifdef BIG_ENDIAN
                if (ds==S)
                if (ds==S)
                        fps[31:0] <= rbo(dat_i);
                        fps[31: 0] <= s;
                else
                else
                        fpd[31:0] <= rbo(dat_i);
                        fpd[31: 0] <= d;
`else
`else
                if (ds==S)
                if (ds==S)
                        fps[127:96] <= dat_i;
                        fps[95:64] <= s;
                else
                else
                        fpd[127:96] <= dat_i;
                        fpd[95:64] <= d;
`endif
`endif
                cyc_o <= 1'b0;
                ea <= ea - 4'd8;
                stb_o <= 1'b0;
 
                sel_o <= 4'b0000;
 
                ret();
                ret();
        end
        end
 
 
/*
 
STORE_HEXI1:
STORE_HEXI1:
        if (!cyc_o) begin
        begin
                fc_o <= {sf,2'b01};
 
                cyc_o <= 1'b1;
 
                stb_o <= 1'b1;
 
                we_o <= 1'b1;
 
                sel_o <= 4'b1111;
 
                adr_o <= ea;
 
`ifdef BIG_ENDIAN
`ifdef BIG_ENDIAN
                dat_o <= rbo(fpd[127:96]);
                d <= fpd[95:64];
`else
`else
                dat_o <= fpd[31:0];
                d <= fpd[31: 0];
`endif
`endif
 
                call (STORE_LWORD,STORE_HEXI2);
        end
        end
        else if (ack_i) begin
STORE_HEXI2:
                stb_o <= 1'b0;
        begin
                goto (STORE_HEXI2);
 
        end
 
*/
 
STORE_HEXI1:
 
        if (!stb_o) begin
 
                fc_o <= {sf,2'b01};
 
                cyc_o <= 1'b1;
 
                stb_o <= 1'b1;
 
                we_o <= 1'b1;
 
                sel_o <= 4'b1111;
 
                adr_o <= ea + 4'd0;
 
`ifdef BIG_ENDIAN
`ifdef BIG_ENDIAN
                dat_o <= rbo(fpd[95:64]);
                d <= fpd[63:32];
`else
`else
                dat_o <= fpd[63:32];
                d <= fpd[63:32];
`endif
`endif
        end
                ea <= ea + 4'd4;
        else if (ack_i) begin
                call (STORE_LWORD,STORE_HEXI3);
                stb_o <= 1'b0;
 
                goto (STORE_HEXI3);
 
        end
        end
STORE_HEXI3:
STORE_HEXI3:
        if (!stb_o) begin
        begin
                stb_o <= 1'b1;
 
                adr_o <= ea + 4'd4;
 
`ifdef BIG_ENDIAN
`ifdef BIG_ENDIAN
                dat_o <= rbo(fpd[63:32]);
                d <= fpd[31: 0];
`else
`else
                dat_o <= fpd[95:64];
                d <= fpd[95:32];
`endif
`endif
        end
                ea <= ea + 4'd4;
        else if (ack_i) begin
                call (STORE_LWORD,STORE_HEXI4);
                stb_o <= 1'b0;
 
                goto (STORE_HEXI4);
 
        end
        end
STORE_HEXI4:
STORE_HEXI4:
        if (!stb_o) begin
        begin
                stb_o <= 1'b1;
                ea <= ea - 4'd8;
                adr_o <= ea + 4'd8;
 
`ifdef BIG_ENDIAN
 
                dat_o <= rbo(fpd[31:0]);
 
`else
 
                dat_o <= fpd[127:96];
 
`endif
 
        end
 
        else if (ack_i) begin
 
                cyc_o <= 1'b0;
 
                stb_o <= 1'b0;
 
                we_o <= 1'b0;
 
                sel_o <= 4'b0000;
 
                ret();
                ret();
        end
        end
 
 
`endif
`endif
 
 
STORE_BYTE:
STORE_BYTE:
        if (!cyc_o) begin
        if (!cyc_o) begin
                if (use_sfc)
                if (use_sfc)
Line 5374... Line 5395...
//----------------------------------------------------
//----------------------------------------------------
MOVEM_Xn2D:
MOVEM_Xn2D:
`ifdef OPT_PERF
`ifdef OPT_PERF
        if (imm[15:0]!=16'h0000) begin
        if (imm[15:0]!=16'h0000) begin
                push(MOVEM_Xn2D2);
                push(MOVEM_Xn2D2);
                fs_data(mmm,rrr,ir[6] ? FETCH_NOP_LWORD : FETCH_NOP_WORD,D);
                fs_data(mmm,rrr,fmovem ? FETCH_NOP_HEXI : ir[6] ? FETCH_NOP_LWORD : FETCH_NOP_WORD,D);
        end
        end
        else
        else
                fs_data(mmm,rrr,ir[6] ? FETCH_NOP_LWORD : FETCH_NOP_WORD,D);
                fs_data(mmm,rrr,fmovem ? FETCH_NOP_HEXI : ir[6] ? FETCH_NOP_LWORD : FETCH_NOP_WORD,D);
`else
`else
        begin
        begin
                push(MOVEM_Xn2D2);
                push(MOVEM_Xn2D2);
                fs_data(mmm,rrr,ir[6] ? FETCH_NOP_LWORD : FETCH_NOP_WORD,D);
                fs_data(mmm,rrr,fmovem ? FETCH_NOP_HEXI : ir[6] ? FETCH_NOP_LWORD : FETCH_NOP_WORD,D);
        end
        end
`endif
`endif
MOVEM_Xn2D2:
MOVEM_Xn2D2:
        begin
        begin
                if (imm[15:0]!=16'h0000)
                if (imm[15:0]!=16'h0000)
Line 5393... Line 5414...
                else begin
                else begin
                        case(mmm)
                        case(mmm)
                        3'b100: // -(An)
                        3'b100: // -(An)
                                begin
                                begin
                                        Rt <= {1'b1,rrr};
                                        Rt <= {1'b1,rrr};
                                        resL <= ea + (ir[6] ? 32'd4 : 32'd2);
                                        resL <= ea + (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
                                        rfwrL <= 1'b1;
                                        rfwrL <= 1'b1;
                                end
                                end
                        endcase
                        endcase
                        ret();
                        ret();
                end
                end
                if (mmm!=3'b100) begin
                if (mmm!=3'b100) begin
                        if (imm[0]) begin
                        if (imm[0]) begin
                                imm[0] <= 1'b0;
                                imm[0] <= 1'b0;
                                rrrr <= 4'd0;
                                rrrr <= 4'd0;
 
                                FLTSRC <= 3'd7;
                        end
                        end
                        else if (imm[1]) begin
                        else if (imm[1]) begin
                                imm[1] <= 1'b0;
                                imm[1] <= 1'b0;
                                rrrr <= 4'd1;
                                rrrr <= 4'd1;
 
                                FLTSRC <= 3'd6;
                        end
                        end
                        else if (imm[2]) begin
                        else if (imm[2]) begin
                                imm[2] <= 1'b0;
                                imm[2] <= 1'b0;
                                rrrr <= 4'd2;
                                rrrr <= 4'd2;
 
                                FLTSRC <= 3'd5;
                        end
                        end
                        else if (imm[3]) begin
                        else if (imm[3]) begin
                                imm[3] <= 1'b0;
                                imm[3] <= 1'b0;
                                rrrr <= 4'd3;
                                rrrr <= 4'd3;
 
                                FLTSRC <= 3'd4;
                        end
                        end
                        else if (imm[4]) begin
                        else if (imm[4]) begin
                                imm[4] <= 1'b0;
                                imm[4] <= 1'b0;
                                rrrr <= 4'd4;
                                rrrr <= 4'd4;
 
                                FLTSRC <= 3'd3;
                        end
                        end
                        else if (imm[5]) begin
                        else if (imm[5]) begin
                                imm[5] <= 1'b0;
                                imm[5] <= 1'b0;
                                rrrr <= 4'd5;
                                rrrr <= 4'd5;
 
                                FLTSRC <= 3'd2;
                        end
                        end
                        else if (imm[6]) begin
                        else if (imm[6]) begin
                                imm[6] <= 1'b0;
                                imm[6] <= 1'b0;
                                rrrr <= 4'd6;
                                rrrr <= 4'd6;
 
                                FLTSRC <= 3'd1;
                        end
                        end
                        else if (imm[7]) begin
                        else if (imm[7]) begin
                                imm[7] <= 1'b0;
                                imm[7] <= 1'b0;
                                rrrr <= 4'd7;
                                rrrr <= 4'd7;
 
                                FLTSRC <= 3'd0;
                        end
                        end
                        else if (imm[8]) begin
                        else if (imm[8]) begin
                                imm[8] <= 1'b0;
                                imm[8] <= 1'b0;
                                rrrr <= 4'd8;
                                rrrr <= 4'd8;
                        end
                        end
Line 5469... Line 5498...
                end
                end
                else begin
                else begin
                        if (imm[0]) begin
                        if (imm[0]) begin
                                imm[0] <= 1'b0;
                                imm[0] <= 1'b0;
                                rrrr <= 4'd15;
                                rrrr <= 4'd15;
 
                                FLTSRC <= 3'd0;
                        end
                        end
                        else if (imm[1]) begin
                        else if (imm[1]) begin
                                imm[1] <= 1'b0;
                                imm[1] <= 1'b0;
                                rrrr <= 4'd14;
                                rrrr <= 4'd14;
 
                                FLTSRC <= 3'd1;
                        end
                        end
                        else if (imm[2]) begin
                        else if (imm[2]) begin
                                imm[2] <= 1'b0;
                                imm[2] <= 1'b0;
                                rrrr <= 4'd13;
                                rrrr <= 4'd13;
 
                                FLTSRC <= 3'd2;
                        end
                        end
                        else if (imm[3]) begin
                        else if (imm[3]) begin
                                imm[3] <= 1'b0;
                                imm[3] <= 1'b0;
                                rrrr <= 4'd12;
                                rrrr <= 4'd12;
 
                                FLTSRC <= 3'd3;
                        end
                        end
                        else if (imm[4]) begin
                        else if (imm[4]) begin
                                imm[4] <= 1'b0;
                                imm[4] <= 1'b0;
                                rrrr <= 4'd11;
                                rrrr <= 4'd11;
 
                                FLTSRC <= 3'd4;
                        end
                        end
                        else if (imm[5]) begin
                        else if (imm[5]) begin
                                imm[5] <= 1'b0;
                                imm[5] <= 1'b0;
                                rrrr <= 4'd10;
                                rrrr <= 4'd10;
 
                                FLTSRC <= 3'd5;
                        end
                        end
                        else if (imm[6]) begin
                        else if (imm[6]) begin
                                imm[6] <= 1'b0;
                                imm[6] <= 1'b0;
                                rrrr <= 4'd9;
                                rrrr <= 4'd9;
 
                                FLTSRC <= 3'd6;
                        end
                        end
                        else if (imm[7]) begin
                        else if (imm[7]) begin
                                imm[7] <= 1'b0;
                                imm[7] <= 1'b0;
                                rrrr <= 4'd8;
                                rrrr <= 4'd8;
 
                                FLTSRC <= 3'd7;
                        end
                        end
                        else if (imm[8]) begin
                        else if (imm[8]) begin
                                imm[8] <= 1'b0;
                                imm[8] <= 1'b0;
                                rrrr <= 4'd7;
                                rrrr <= 4'd7;
                        end
                        end
Line 5536... Line 5573...
        end
        end
MOVEM_Xn2D3:
MOVEM_Xn2D3:
        begin
        begin
                resL <= rfoRnn;
                resL <= rfoRnn;
                resW <= rfoRnn[15:0];
                resW <= rfoRnn[15:0];
 
                if (fmovem)
 
                        fpd <= rfoFpsrc;
 
                else
                d <= rfoRnn;
                d <= rfoRnn;
                ds <= D;
                ds <= D;
                call(ir[6] ? STORE_LWORD : STORE_WORD,MOVEM_Xn2D4);
                call(fmovem ? STORE_HEXI1 : ir[6] ? STORE_LWORD : STORE_WORD,MOVEM_Xn2D4);
        end
        end
MOVEM_Xn2D4:
MOVEM_Xn2D4:
        begin
        begin
                case(mmm)
                case(mmm)
                3'b011: ea <= ea + (ir[6] ? 32'd4 : 32'd2);
                // ea is updated by STORE_HEXI1, incremented by 8
                3'b100: ea <= ea - (ir[6] ? 32'd4 : 32'd2);
                3'b011: ea <= ea + (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
 
                3'b100: ea <= ea - (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
                default:
                default:
                        ea <= ea + (ir[6] ? 32'd4 : 32'd2);
                        ea <= ea + (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
                endcase
                endcase
                if (imm[15:0]!=16'h0000)
                if (imm[15:0]!=16'h0000)
                        state <= MOVEM_Xn2D3;
                        state <= MOVEM_Xn2D3;
                else begin
                else begin
                        case(mmm)
                        case(mmm)
                        3'b011:
                        3'b011:
                                begin
                                begin
                                        Rt <= {1'b1,rrr};
                                        Rt <= {1'b1,rrr};
                                        resL <= ea + (ir[6] ? 32'd4 : 32'd2);
                                        resL <= ea + (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
                                        rfwrL <= 1'b1;
                                        rfwrL <= 1'b1;
                                end
                                end
                        3'b100:
                        3'b100:
                                begin
                                begin
                                        Rt <= {1'b1,rrr};
                                        Rt <= {1'b1,rrr};
Line 5571... Line 5612...
                end
                end
                if (mmm!=3'b100) begin
                if (mmm!=3'b100) begin
                        if (imm[0]) begin
                        if (imm[0]) begin
                                imm[0] <= 1'b0;
                                imm[0] <= 1'b0;
                                rrrr <= 4'd0;
                                rrrr <= 4'd0;
 
                                FLTSRC <= 3'd7;
                        end
                        end
                        else if (imm[1]) begin
                        else if (imm[1]) begin
                                imm[1] <= 1'b0;
                                imm[1] <= 1'b0;
                                rrrr <= 4'd1;
                                rrrr <= 4'd1;
 
                                FLTSRC <= 3'd6;
                        end
                        end
                        else if (imm[2]) begin
                        else if (imm[2]) begin
                                imm[2] <= 1'b0;
                                imm[2] <= 1'b0;
                                rrrr <= 4'd2;
                                rrrr <= 4'd2;
 
                                FLTSRC <= 3'd5;
                        end
                        end
                        else if (imm[3]) begin
                        else if (imm[3]) begin
                                imm[3] <= 1'b0;
                                imm[3] <= 1'b0;
                                rrrr <= 4'd3;
                                rrrr <= 4'd3;
 
                                FLTSRC <= 3'd4;
                        end
                        end
                        else if (imm[4]) begin
                        else if (imm[4]) begin
                                imm[4] <= 1'b0;
                                imm[4] <= 1'b0;
                                rrrr <= 4'd4;
                                rrrr <= 4'd4;
 
                                FLTSRC <= 3'd3;
                        end
                        end
                        else if (imm[5]) begin
                        else if (imm[5]) begin
                                imm[5] <= 1'b0;
                                imm[5] <= 1'b0;
                                rrrr <= 4'd5;
                                rrrr <= 4'd5;
 
                                FLTSRC <= 3'd2;
                        end
                        end
                        else if (imm[6]) begin
                        else if (imm[6]) begin
                                imm[6] <= 1'b0;
                                imm[6] <= 1'b0;
                                rrrr <= 4'd6;
                                rrrr <= 4'd6;
 
                                FLTSRC <= 3'd1;
                        end
                        end
                        else if (imm[7]) begin
                        else if (imm[7]) begin
                                imm[7] <= 1'b0;
                                imm[7] <= 1'b0;
                                rrrr <= 4'd7;
                                rrrr <= 4'd7;
 
                                FLTSRC <= 3'd0;
                        end
                        end
                        else if (imm[8]) begin
                        else if (imm[8]) begin
                                imm[8] <= 1'b0;
                                imm[8] <= 1'b0;
                                rrrr <= 4'd8;
                                rrrr <= 4'd8;
                        end
                        end
Line 5637... Line 5686...
                end
                end
                else begin
                else begin
                        if (imm[0]) begin
                        if (imm[0]) begin
                                imm[0] <= 1'b0;
                                imm[0] <= 1'b0;
                                rrrr <= 4'd15;
                                rrrr <= 4'd15;
 
                                FLTSRC <= 3'd0;
                        end
                        end
                        else if (imm[1]) begin
                        else if (imm[1]) begin
                                imm[1] <= 1'b0;
                                imm[1] <= 1'b0;
                                rrrr <= 4'd14;
                                rrrr <= 4'd14;
 
                                FLTSRC <= 3'd1;
                        end
                        end
                        else if (imm[2]) begin
                        else if (imm[2]) begin
                                imm[2] <= 1'b0;
                                imm[2] <= 1'b0;
                                rrrr <= 4'd13;
                                rrrr <= 4'd13;
 
                                FLTSRC <= 3'd2;
                        end
                        end
                        else if (imm[3]) begin
                        else if (imm[3]) begin
                                imm[3] <= 1'b0;
                                imm[3] <= 1'b0;
                                rrrr <= 4'd12;
                                rrrr <= 4'd12;
 
                                FLTSRC <= 3'd3;
                        end
                        end
                        else if (imm[4]) begin
                        else if (imm[4]) begin
                                imm[4] <= 1'b0;
                                imm[4] <= 1'b0;
                                rrrr <= 4'd11;
                                rrrr <= 4'd11;
 
                                FLTSRC <= 3'd4;
                        end
                        end
                        else if (imm[5]) begin
                        else if (imm[5]) begin
                                imm[5] <= 1'b0;
                                imm[5] <= 1'b0;
                                rrrr <= 4'd10;
                                rrrr <= 4'd10;
 
                                FLTSRC <= 3'd5;
                        end
                        end
                        else if (imm[6]) begin
                        else if (imm[6]) begin
                                imm[6] <= 1'b0;
                                imm[6] <= 1'b0;
                                rrrr <= 4'd9;
                                rrrr <= 4'd9;
 
                                FLTSRC <= 3'd6;
                        end
                        end
                        else if (imm[7]) begin
                        else if (imm[7]) begin
                                imm[7] <= 1'b0;
                                imm[7] <= 1'b0;
                                rrrr <= 4'd8;
                                rrrr <= 4'd8;
 
                                FLTSRC <= 3'd7;
                        end
                        end
                        else if (imm[8]) begin
                        else if (imm[8]) begin
                                imm[8] <= 1'b0;
                                imm[8] <= 1'b0;
                                rrrr <= 4'd7;
                                rrrr <= 4'd7;
                        end
                        end
Line 5706... Line 5763...
//----------------------------------------------------
//----------------------------------------------------
MOVEM_s2Xn:
MOVEM_s2Xn:
`ifdef OPT_PERF
`ifdef OPT_PERF
        if (imm[15:0]!=16'h0000) begin
        if (imm[15:0]!=16'h0000) begin
                push(MOVEM_s2Xn2);
                push(MOVEM_s2Xn2);
                fs_data(mmm,rrr,ir[6] ? FETCH_NOP_LWORD : FETCH_NOP_WORD,S);
                fs_data(mmm,rrr,fmovem ? FETCH_NOP_HEXI : ir[6] ? FETCH_NOP_LWORD : FETCH_NOP_WORD,S);
        end
        end
        else
        else
                fs_data(mmm,rrr,ir[6] ? FETCH_NOP_LWORD : FETCH_NOP_WORD,S);
                fs_data(mmm,rrr,fmovem ? FETCH_NOP_HEXI : ir[6] ? FETCH_NOP_LWORD : FETCH_NOP_WORD,S);
`else
`else
        begin
        begin
                push(MOVEM_s2Xn2);
                push(MOVEM_s2Xn2);
                fs_data(mmm,rrr,ir[6] ? FETCH_NOP_LWORD : FETCH_NOP_WORD,S);
                fs_data(mmm,rrr,fmovem ? FETCH_NOP_HEXI : ir[6] ? FETCH_NOP_LWORD : FETCH_NOP_WORD,S);
        end
        end
`endif
`endif
MOVEM_s2Xn2:
MOVEM_s2Xn2:
        if (imm[15:0] != 16'h0000) begin
        if (imm[15:0] != 16'h0000) begin
                ds <= S;
                ds <= S;
                call(ir[6] ? FETCH_LWORD : FETCH_WORD,MOVEM_s2Xn3);
                call(fmovem ? FETCH_HEXI1 : ir[6] ? FETCH_LWORD : FETCH_WORD,MOVEM_s2Xn3);
        end
        end
        else begin
        else begin
                case(mmm)
                case(mmm)
                3'b011: // (An)+
                3'b011: // (An)+
                        begin
                        begin
Line 5732... Line 5789...
                                rfwrL <= 1'b1;
                                rfwrL <= 1'b1;
                        end
                        end
                3'b100: // -(An)
                3'b100: // -(An)
                        begin
                        begin
                                Rt <= {1'b1,rrr};
                                Rt <= {1'b1,rrr};
                                resL <= ea + (ir[6] ? 32'd4 : 32'd2);
                                resL <= ea + (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
                                rfwrL <= 1'b1;
                                rfwrL <= 1'b1;
                        end
                        end
                endcase
                endcase
                ret();
                ret();
        end
        end
MOVEM_s2Xn3:
MOVEM_s2Xn3:
        begin
        begin
                case(mmm)
                case(mmm)
                3'b011: ea <= ea + (ir[6] ? 32'd4 : 32'd2);
                3'b011: ea <= ea + (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
                3'b100: ea <= ea - (ir[6] ? 32'd4 : 32'd2);
                3'b100: ea <= ea - (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
                default:
                default:
                        ea <= ea + (ir[6] ? 32'd4 : 32'd2);
                        ea <= ea + (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
                endcase
                endcase
                goto (MOVEM_s2Xn2);
                goto (MOVEM_s2Xn2);
                // Another bizzare gotcha. Word values moved to a data register are sign
                // Another bizzare gotcha. Word values moved to a data register are sign
                // extended to long-word width.
                // extended to long-word width.
                rfwrL <= 1'b1;
                rfwrL <= 1'b1;
                if (ir[6])
                if (ir[6])
                        resL <= s;
                        resL <= s;
                else
                else
                        resL <= {{16{s[15]}},s[15:0]};
                        resL <= {{16{s[15]}},s[15:0]};
 
                resF <= fps;
                if (mmm!=3'b100) begin
                if (mmm!=3'b100) begin
                        if (imm[0]) begin
                        if (imm[0]) begin
                                imm[0] <= 1'b0;
                                imm[0] <= 1'b0;
                                Rt <= 4'd0;
                                Rt <= 4'd0 ^ {3{fmovem}};
                        end
                        end
                        else if (imm[1]) begin
                        else if (imm[1]) begin
                                imm[1] <= 1'b0;
                                imm[1] <= 1'b0;
                                Rt <= 4'd1;
                                Rt <= 4'd1 ^ {3{fmovem}};
                        end
                        end
                        else if (imm[2]) begin
                        else if (imm[2]) begin
                                imm[2] <= 1'b0;
                                imm[2] <= 1'b0;
                                Rt <= 4'd2;
                                Rt <= 4'd2 ^ {3{fmovem}};
                        end
                        end
                        else if (imm[3]) begin
                        else if (imm[3]) begin
                                imm[3] <= 1'b0;
                                imm[3] <= 1'b0;
                                Rt <= 4'd3;
                                Rt <= 4'd3 ^ {3{fmovem}};
                        end
                        end
                        else if (imm[4]) begin
                        else if (imm[4]) begin
                                imm[4] <= 1'b0;
                                imm[4] <= 1'b0;
                                Rt <= 4'd4;
                                Rt <= 4'd4 ^ {3{fmovem}};
                        end
                        end
                        else if (imm[5]) begin
                        else if (imm[5]) begin
                                imm[5] <= 1'b0;
                                imm[5] <= 1'b0;
                                Rt <= 4'd5;
                                Rt <= 4'd5 ^ {3{fmovem}};
                        end
                        end
                        else if (imm[6]) begin
                        else if (imm[6]) begin
                                imm[6] <= 1'b0;
                                imm[6] <= 1'b0;
                                Rt <= 4'd6;
                                Rt <= 4'd6 ^ {3{fmovem}};
                        end
                        end
                        else if (imm[7]) begin
                        else if (imm[7]) begin
                                imm[7] <= 1'b0;
                                imm[7] <= 1'b0;
                                Rt <= 4'd7;
                                Rt <= 4'd7 ^ {3{fmovem}};
                        end
                        end
                        else if (imm[8]) begin
                        else if (imm[8]) begin
                                imm[8] <= 1'b0;
                                imm[8] <= 1'b0;
                                Rt <= 4'd8;
                                Rt <= 4'd8;
                        end
                        end
Line 5823... Line 5881...
                        end
                        end
                end
                end
                else begin
                else begin
                        if (imm[0]) begin
                        if (imm[0]) begin
                                imm[0] <= 1'b0;
                                imm[0] <= 1'b0;
                                Rt <= 4'd15;
                                Rt <= 4'd15 ^ {4{fmovem}};
                        end
                        end
                        else if (imm[1]) begin
                        else if (imm[1]) begin
                                imm[1] <= 1'b0;
                                imm[1] <= 1'b0;
                                Rt <= 4'd14;
                                Rt <= 4'd14 ^ {4{fmovem}};
                        end
                        end
                        else if (imm[2]) begin
                        else if (imm[2]) begin
                                imm[2] <= 1'b0;
                                imm[2] <= 1'b0;
                                Rt <= 4'd13;
                                Rt <= 4'd13 ^ {4{fmovem}};
                        end
                        end
                        else if (imm[3]) begin
                        else if (imm[3]) begin
                                imm[3] <= 1'b0;
                                imm[3] <= 1'b0;
                                Rt <= 4'd12;
                                Rt <= 4'd12 ^ {4{fmovem}};
                        end
                        end
                        else if (imm[4]) begin
                        else if (imm[4]) begin
                                imm[4] <= 1'b0;
                                imm[4] <= 1'b0;
                                Rt <= 4'd11;
                                Rt <= 4'd11 ^ {4{fmovem}};
                        end
                        end
                        else if (imm[5]) begin
                        else if (imm[5]) begin
                                imm[5] <= 1'b0;
                                imm[5] <= 1'b0;
                                Rt <= 4'd10;
                                Rt <= 4'd10 ^ {4{fmovem}};
                        end
                        end
                        else if (imm[6]) begin
                        else if (imm[6]) begin
                                imm[6] <= 1'b0;
                                imm[6] <= 1'b0;
                                Rt <= 4'd9;
                                Rt <= 4'd9 ^ {4{fmovem}};
                        end
                        end
                        else if (imm[7]) begin
                        else if (imm[7]) begin
                                imm[7] <= 1'b0;
                                imm[7] <= 1'b0;
                                Rt <= 4'd8;
                                Rt <= 4'd8 ^ {4{fmovem}};
                        end
                        end
                        else if (imm[8]) begin
                        else if (imm[8]) begin
                                imm[8] <= 1'b0;
                                imm[8] <= 1'b0;
                                Rt <= 4'd7;
                                Rt <= 4'd7;
                        end
                        end
Line 6034... Line 6092...
        12'h012:  begin tr <= rfoRnn; ret(); end
        12'h012:  begin tr <= rfoRnn; ret(); end
        12'h013:  begin tcba <= rfoRnn; ret(); end
        12'h013:  begin tcba <= rfoRnn; ret(); end
        12'h014:        begin mmus <= rfoRnn; ret(); end
        12'h014:        begin mmus <= rfoRnn; ret(); end
        12'h015:        begin ios <= rfoRnn; ret(); end
        12'h015:        begin ios <= rfoRnn; ret(); end
        12'h016:        begin iops <= rfoRnn; ret(); end
        12'h016:        begin iops <= rfoRnn; ret(); end
 
        12'h020:        begin canary <= rfoRnn; ret(); end
        12'h800:        begin usp <= rfoRnn; ret(); end
        12'h800:        begin usp <= rfoRnn; ret(); end
        12'h801:        begin vbr <= rfoRnn; ret(); end
        12'h801:        begin vbr <= rfoRnn; ret(); end
/*
/*
        12'hFE1:
        12'hFE1:
                begin
                begin
Line 6073... Line 6132...
        12'h012:  begin resL <= tr; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
        12'h012:  begin resL <= tr; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
        12'h013:  begin resL <= tcba; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
        12'h013:  begin resL <= tcba; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
        12'h014:  begin resL <= mmus; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
        12'h014:  begin resL <= mmus; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
        12'h015:  begin resL <= ios; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
        12'h015:  begin resL <= ios; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
        12'h016:  begin resL <= iops; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
        12'h016:  begin resL <= iops; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
 
        12'h020:  begin resL <= canary; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
        12'h800:        begin resL <= usp; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
        12'h800:        begin resL <= usp; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
        12'h801:        begin resL <= vbr; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
        12'h801:        begin resL <= vbr; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
        12'hFE0:        begin resL <= coreno_i; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
        12'hFE0:        begin resL <= coreno_i; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
//      12'hFE1:        begin resL <= srx; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
//      12'hFE1:        begin resL <= srx; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
        12'hFF0:        begin resL <= tick; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
        12'hFF0:        begin resL <= tick; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
Line 6119... Line 6179...
                resL <= resL2;
                resL <= resL2;
                rfwrL <= 1'b1;
                rfwrL <= 1'b1;
                Rt <= {1'b0,rrr};
                Rt <= {1'b0,rrr};
                ret();
                ret();
        end
        end
 
CCHK:
 
        begin
 
                if (s != canary) begin
 
                isr <= srx;
 
                tf <= 1'b0;
 
                sf <= 1'b1;
 
                        vecno <= `CHK_VEC;
 
            goto (TRAP3);
 
                end
 
                else
 
                        ret();
 
        end
`ifdef SUPPORT_DECFLT
`ifdef SUPPORT_DECFLT
FADD:
FADD:
        begin
        begin
                fpcnt <= fpcnt + 2'd1;
                fpcnt <= fpcnt + 2'd1;
                if (fpcnt==8'd50) begin
                if (fpcnt==8'd50) begin
Line 6152... Line 6224...
                                rfwrF <= 1'b1;
                                rfwrF <= 1'b1;
                        end
                        end
                        ret();
                        ret();
                end
                end
        end
        end
FNEG:
FNEG:   // Also FABS
        begin
        begin
                if (DECFLT) begin
                if (DECFLT) begin
                        resF <= {~fps[95],fps[94:0]};
                        resF <= {~fps[95] & ~fabs,fps[94:0]};
                        fzf <= fps[94:0]==95'd0;
                        fzf <= fps[94:0]==95'd0;
                        fnf <= ~fps[95];
                        fnf <= ~fps[95] & ~fabs;
                        Rt <= {1'b0,FLTDST};
                        Rt <= {1'b0,FLTDST};
                        rfwrF <= 1'b1;
                        rfwrF <= 1'b1;
                end
                end
                ret();
                ret();
        end
        end
Line 6180... Line 6252...
                        ret();
                        ret();
                end
                end
        end
        end
        else
        else
                ret();
                ret();
 
        // For divide the done signal may take several cycles to go inactive after
 
        // the load signal is activated. Prevent a premature recognition of done
 
        // using a counter.
FDIV1:
FDIV1:
 
        begin
 
                fpcnt <= fpcnt + 2'd1;
 
                if (fpcnt == 8'd50)
        goto (FDIV2);
        goto (FDIV2);
 
        end
FDIV2:
FDIV2:
        if (dfdivdone) begin
        if (dfdivdone) begin
                if (DECFLT) begin
                if (DECFLT) begin
                        fzf <= dfdivo[94:0]==95'd0;
                        fzf <= dfdivo[94:0]==95'd0;
                        fnf <= dfdivo[95];
                        fnf <= dfdivo[95];
Line 6210... Line 6289...
                ret();
                ret();
        end
        end
FMOVE:
FMOVE:
        begin
        begin
                if (DECFLT) begin
                if (DECFLT) begin
                        if (ir2[12:10]==3'b000) begin
                        if (ir2[14])
 
                                case(ir2[12:10])
 
                                3'b000:
 
                                        begin
                                fps <= {64'd0,s};
                                fps <= {64'd0,s};
                                goto (I2DF1);
                                goto (I2DF1);
                        end
                        end
 
                                3'b100:
 
                                        begin
 
                                                fps <= {80'd0,s[15:0]};
 
                                                goto (I2DF1);
 
                                        end
 
                                3'b110:
 
                                        begin
 
                                                fps <= {88'd0,s[7:0]};
 
                                                goto (I2DF1);
 
                                        end
 
                                default:
 
                                        begin
 
                                                resF <= fps[95:0];
 
                                                fzf <= fps[94:0]==95'd0;
 
                                                fnf <= fps[95];
 
                                                Rt <= {1'b0,FLTDST};
 
                                                rfwrF <= 1'b1;
 
                                                ret();
 
                                        end
 
                                endcase
                        else begin
                        else begin
                                resF <= fps[95:0];
                                resF <= fps[95:0];
                                fzf <= fps[94:0]==95'd0;
                                fzf <= fps[94:0]==95'd0;
                                fnf <= fps[95];
                                fnf <= fps[95];
                                Rt <= {1'b0,FLTDST};
                                Rt <= {1'b0,FLTDST};
Line 6249... Line 6351...
        goto (DF2I2);
        goto (DF2I2);
DF2I2:
DF2I2:
        begin
        begin
                if (DECFLT) begin
                if (DECFLT) begin
                        if (df2idone) begin
                        if (df2idone) begin
 
                                case(ir2[12:10])
 
                                3'b000: fs_data(mmm,rrr,STORE_LWORD,D);
 
                                3'b100: fs_data(mmm,rrr,STORE_WORD,D);
 
                                3'b110: fs_data(mmm,rrr,STORE_BYTE,D);
 
                                default:        ret();
 
                                endcase
                                resF <= df2io;
                                resF <= df2io;
                                resL <= df2io;
                                resL <= df2io[31:0];
 
                                resW <= df2io[15:0];
 
                                resB <= df2io[ 7:0];
 
                                d <= df2io;
                                fzf <= df2io[94:0]==95'd0;
                                fzf <= df2io[94:0]==95'd0;
                                fnf <= df2io[95];
                                fnf <= df2io[95];
                                fvf <= df2iover;
                                fvf <= df2iover;
                                Rt <= {1'b0,FLTDST};
                                //Rt <= {1'b0,FLTDST};
                                rfwrL <= 1'b1;
                                //rfwrL <= 1'b1;
                                ret();
 
                        end
                        end
                end
                end
                else
                else
                        ret();
                        ret();
        end
        end
FTST:
FTST:
        begin
        begin
 
                case(ir2[12:10])
 
                3'b000: begin fnf <= s[31]; fzf <= s[31:0]==32'd0; fnanf <= 1'b0; fvf <= 1'b0; end
 
                3'b100: begin fnf <= s[15]; fzf <= s[15:0]==16'd0; fnanf <= 1'b0; fvf <= 1'b0; end
 
                3'b110: begin fnf <= s[ 7]; fzf <= s[ 7:0]== 8'd0; fnanf <= 1'b0; fvf <= 1'b0; end
 
                default:
 
                        begin
                fnf <= fps[95];
                fnf <= fps[95];
                fzf <= fps[94:0]=='d0;
                fzf <= fps[94:0]=='d0;
 
                                fnanf <= fps[94:90]==5'b11111;
 
                                fvf <= fps[94:90]==5'b11110;
 
                        end
 
                endcase
                ret();
                ret();
        end
        end
FBCC:
FBCC:
        begin
        begin
                if (ftakb)
                if (ftakb)
Line 6283... Line 6403...
                rfwrF <= 1'b1;
                rfwrF <= 1'b1;
                Rt <= {1'b0,FLTDST};
                Rt <= {1'b0,FLTDST};
                ret();
                ret();
        end
        end
*/
*/
 
FMOVEM1:
 
        begin
 
                imm <= rfoDnn[7:0];
 
                if (ir2[13])
 
                        goto(MOVEM_Xn2D);
 
                else
 
                        goto(MOVEM_s2Xn);
 
        end
 
 
`endif
`endif
 
 
default:
default:
        goto(RESET);
        goto(RESET);
endcase
endcase
Line 6396... Line 6525...
                                case(size_state)
                                case(size_state)
                                LFETCH_BYTE,FETCH_BYTE,STORE_BYTE,USTORE_BYTE:  resL <= (MMMRRR ? rfoAna : rfoAn) + 4'd1;
                                LFETCH_BYTE,FETCH_BYTE,STORE_BYTE,USTORE_BYTE:  resL <= (MMMRRR ? rfoAna : rfoAn) + 4'd1;
                                FETCH_WORD,STORE_WORD:  resL <= (MMMRRR ? rfoAna : rfoAn) + 4'd2;
                                FETCH_WORD,STORE_WORD:  resL <= (MMMRRR ? rfoAna : rfoAn) + 4'd2;
                                FETCH_LWORD,STORE_LWORD:        resL <= (MMMRRR ? rfoAna : rfoAn) + 4'd4;
                                FETCH_LWORD,STORE_LWORD:        resL <= (MMMRRR ? rfoAna : rfoAn) + 4'd4;
`ifdef SUPPORT_DECFLT
`ifdef SUPPORT_DECFLT
                                FETCH_HEXI1,STORE_HEXI1: resL <= (MMMRRR ? rfoAna : rfoAn) + 5'd12;
                                FETCH_HEXI1,STORE_HEXI1: resL <= rfoAn + 5'd12;
`endif
`endif
                                default:        ;
                                default:        ;
                                endcase
                                endcase
                                goto(size_state);
                                goto(size_state);
                        end
                        end
Line 6412... Line 6541...
                                case(size_state)
                                case(size_state)
                                FETCH_NOP_BYTE,LFETCH_BYTE,FETCH_BYTE,STORE_BYTE,USTORE_BYTE:   ea <= (MMMRRR ? rfoAna : rfoAn) - 4'd1;
                                FETCH_NOP_BYTE,LFETCH_BYTE,FETCH_BYTE,STORE_BYTE,USTORE_BYTE:   ea <= (MMMRRR ? rfoAna : rfoAn) - 4'd1;
                                FETCH_NOP_WORD,FETCH_WORD,STORE_WORD:   ea <= (MMMRRR ? rfoAna : rfoAn) - 4'd2;
                                FETCH_NOP_WORD,FETCH_WORD,STORE_WORD:   ea <= (MMMRRR ? rfoAna : rfoAn) - 4'd2;
                                FETCH_NOP_LWORD,FETCH_LWORD,STORE_LWORD:        ea <= (MMMRRR ? rfoAna : rfoAn) - 4'd4;
                                FETCH_NOP_LWORD,FETCH_LWORD,STORE_LWORD:        ea <= (MMMRRR ? rfoAna : rfoAn) - 4'd4;
`ifdef SUPPORT_DECFLT
`ifdef SUPPORT_DECFLT
                                FETCH_HEXI1,STORE_HEXI1: ea <= (MMMRRR ? rfoAna : rfoAn) - 5'd12;
                                FETCH_NOP_HEXI,FETCH_HEXI1,STORE_HEXI1: ea <= rfoAn - 5'd12;
`endif
`endif
                                default:        ;
                                default:        ;
                                endcase
                                endcase
                                case(size_state)
                                case(size_state)
                                LFETCH_BYTE,FETCH_BYTE,STORE_BYTE,USTORE_BYTE:  resL <= (MMMRRR ? rfoAna : rfoAn) - 4'd1;
                                LFETCH_BYTE,FETCH_BYTE,STORE_BYTE,USTORE_BYTE:  resL <= (MMMRRR ? rfoAna : rfoAn) - 4'd1;
                                FETCH_WORD,STORE_WORD:  resL <= (MMMRRR ? rfoAna : rfoAn) - 4'd2;
                                FETCH_WORD,STORE_WORD:  resL <= (MMMRRR ? rfoAna : rfoAn) - 4'd2;
                                FETCH_LWORD,STORE_LWORD:        resL <= (MMMRRR ? rfoAna : rfoAn) - 4'd4;
                                FETCH_LWORD,STORE_LWORD:        resL <= (MMMRRR ? rfoAna : rfoAn) - 4'd4;
`ifdef SUPPORT_DECFLT
`ifdef SUPPORT_DECFLT
                                FETCH_HEXI1,STORE_HEXI1: resL <= (MMMRRR ? rfoAna : rfoAn) - 5'd12;
                                FETCH_HEXI1,STORE_HEXI1: resL <= rfoAn - 5'd12;
`endif
`endif
                                default:        ;
                                default:        ;
                                endcase
                                endcase
                                goto(size_state);
                                goto(size_state);
                        end
                        end
Line 6479... Line 6608...
                                                        dsix <= dsi;
                                                        dsix <= dsi;
                                                        goto (FSDATA2);
                                                        goto (FSDATA2);
                                                end
                                                end
                                                // ToDo: add FETCH_IMM128
                                                // ToDo: add FETCH_IMM128
                                3'd4:   begin   // #i16
                                3'd4:   begin   // #i16
                                                        goto((size_state==FETCH_LWORD||size_state==FETCH_NOP_LWORD)?FETCH_IMM32:FETCH_IMM16);
                                                        goto(size_state==FETCH_NOP_HEXI ? FETCH_IMM96:(size_state==FETCH_LWORD||size_state==FETCH_NOP_LWORD)?FETCH_IMM32:FETCH_IMM16);
                                                end
                                                end
                                3'd5:   begin   // #i32
                                3'd5:   begin   // #i32
                                                        state <= FETCH_IMM32;
                                                        state <= FETCH_IMM32;
                                                        goto (FETCH_IMM32);
                                                        goto (FETCH_IMM32);
                                                end
                                                end
Line 6526... Line 6655...
                                3'd3:   begin   // d8(PC,Xn)
                                3'd3:   begin   // d8(PC,Xn)
                                                        ea <= pc;
                                                        ea <= pc;
                                                        call(FETCH_NDX,size_state);
                                                        call(FETCH_NDX,size_state);
                                                end
                                                end
                                3'd4:   begin   // #i16
                                3'd4:   begin   // #i16
                                                        goto((size_state==FETCH_LWORD||size_state==FETCH_NOP_LWORD)?FETCH_IMM32:FETCH_IMM16);
                                                        goto((size_state==FETCH_LWORD||size_state==FETCH_NOP_LWORD||size_state==FETCH_NOP_HEXI)?FETCH_IMM32:FETCH_IMM16);
                                                        end
                                                        end
                                3'd5:   begin   // #i32
                                3'd5:   begin   // #i32
                                                        state <= FETCH_IMM32;
                                                        state <= FETCH_IMM32;
                                                        goto (FETCH_IMM32);
                                                        goto (FETCH_IMM32);
                                                end
                                                end
Line 6552... Line 6681...
begin
begin
        state_stk1 <= state;
        state_stk1 <= state;
        state_stk2 <= state_stk1;
        state_stk2 <= state_stk1;
        state_stk3 <= state_stk2;
        state_stk3 <= state_stk2;
        state_stk4 <= state_stk3;
        state_stk4 <= state_stk3;
 
        state_stk5 <= state_stk4;
        state <= tgt;
        state <= tgt;
end
end
endtask
endtask
 
 
task call;
task call;
Line 6564... Line 6694...
begin
begin
        state_stk1 <= retst;
        state_stk1 <= retst;
        state_stk2 <= state_stk1;
        state_stk2 <= state_stk1;
        state_stk3 <= state_stk2;
        state_stk3 <= state_stk2;
        state_stk4 <= state_stk3;
        state_stk4 <= state_stk3;
 
        state_stk5 <= state_stk4;
        state <= tgt;
        state <= tgt;
end
end
endtask
endtask
 
 
task push;
task push;
Line 6575... Line 6706...
begin
begin
        state_stk1 <= st;
        state_stk1 <= st;
        state_stk2 <= state_stk1;
        state_stk2 <= state_stk1;
        state_stk3 <= state_stk2;
        state_stk3 <= state_stk2;
        state_stk4 <= state_stk3;
        state_stk4 <= state_stk3;
 
        state_stk5 <= state_stk4;
end
end
endtask
endtask
 
 
task tIllegal;
task tIllegal;
begin
begin
Line 6625... Line 6757...
        else
        else
                state <= state_stk1;
                state <= state_stk1;
        state_stk1 <= state_stk2;
        state_stk1 <= state_stk2;
        state_stk2 <= state_stk3;
        state_stk2 <= state_stk3;
        state_stk3 <= state_stk4;
        state_stk3 <= state_stk4;
 
        state_stk4 <= state_stk5;
end
end
endtask
endtask
 
 
endmodule
endmodule
 
 

powered by: WebSVN 2.1.0

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