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

Subversion Repositories raptor64

[/] [raptor64/] [trunk/] [rtl/] [verilog/] [Raptor64sc.v] - Diff between revs 19 and 21

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

Rev 19 Rev 21
Line 19... Line 19...
// You should have received a copy of the GNU General Public License        
// You should have received a copy of the GNU General Public License        
// along with this program.  If not, see <http://www.gnu.org/licenses/>.    
// along with this program.  If not, see <http://www.gnu.org/licenses/>.    
//                                                                          
//                                                                          
// ============================================================================
// ============================================================================
//
//
//`define RAS_PREDICTION                1
`define ADDRESS_RESERVATION     1
 
`define RAS_PREDICTION          1
//`define BTB                                   1
//`define BTB                                   1
//`define TLB           1
//`define TLB           1
//`define BRANCH_PREDICTION_SIMPLE      1
//`define BRANCH_PREDICTION_SIMPLE      1
 
 
`define RESET_VECTOR    64'hFFFF_FFFF_FFFF_FFF0
`define RESET_VECTOR    64'hFFFF_FFFF_FFFF_FFF0
Line 74... Line 75...
`define MISC    7'd0
`define MISC    7'd0
`define         BRK             7'd0
`define         BRK             7'd0
`define         IRQ             7'd1
`define         IRQ             7'd1
`define         ICACHE_ON       7'd10
`define         ICACHE_ON       7'd10
`define         ICACHE_OFF      7'd11
`define         ICACHE_OFF      7'd11
 
`define         DCACHE_ON       7'd12
 
`define         DCACHE_OFF      7'd13
`define     FIP         7'd20
`define     FIP         7'd20
`define         IRET    7'd32
`define         IRET    7'd32
`define         ERET    7'd33
`define         ERET    7'd33
`define         WAIT    7'd40
`define         WAIT    7'd40
`define         TLBP    7'd49
`define         TLBP    7'd49
Line 89... Line 92...
`define R               7'd1
`define R               7'd1
`define         COM             7'd4
`define         COM             7'd4
`define         NOT             7'd5
`define         NOT             7'd5
`define         NEG             7'd6
`define         NEG             7'd6
`define         ABS             7'd7
`define         ABS             7'd7
 
`define         MOV             7'd9
`define         SWAP    7'd13
`define         SWAP    7'd13
`define         CTLZ    7'd16
`define         CTLZ    7'd16
`define         CTLO    7'd17
`define         CTLO    7'd17
`define         CTPOP   7'd18
`define         CTPOP   7'd18
`define         SEXT8   7'd19
`define         SEXT8   7'd19
Line 122... Line 126...
`define                 Tick                    6'd22
`define                 Tick                    6'd22
`define                 EPC                             6'd23
`define                 EPC                             6'd23
`define                 CauseCode               6'd24
`define                 CauseCode               6'd24
`define                 TBA                             6'd25
`define                 TBA                             6'd25
`define                 NON_ICACHE_SEG  6'd26
`define                 NON_ICACHE_SEG  6'd26
 
`define                 FPCR                    6'd32
 
`define                 IPC                             6'd33
`define         OMG             7'd50
`define         OMG             7'd50
`define         CMG             7'd51
`define         CMG             7'd51
`define         OMGI    7'd52
`define         OMGI    7'd52
`define         CMGI    7'd53
`define         CMGI    7'd53
`define         EXEC    7'd58
`define         EXEC    7'd58
 
`define         MYST    7'd59
`define RR      7'd2
`define RR      7'd2
`define         ADD             7'd2
`define         ADD             7'd2
`define         ADDU    7'd3
`define         ADDU    7'd3
`define         SUB             7'd4
`define         SUB             7'd4
`define         SUBU    7'd5
`define         SUBU    7'd5
Line 186... Line 193...
`define ROLAMI          7'd5
`define ROLAMI          7'd5
`define BFINS           7'd8
`define BFINS           7'd8
`define BFSET           7'd9
`define BFSET           7'd9
`define BFCLR           7'd10
`define BFCLR           7'd10
`define BFCHG           7'd11
`define BFCHG           7'd11
 
 
`define ADDI    7'd4
`define ADDI    7'd4
`define ADDUI   7'd5
`define ADDUI   7'd5
`define SUBI    7'd6
`define SUBI    7'd6
`define SUBUI   7'd7
`define SUBUI   7'd7
`define CMPI    7'd8
`define CMPI    7'd8
Line 279... Line 285...
`define OUTB    7'd72
`define OUTB    7'd72
`define OUTC    7'd73
`define OUTC    7'd73
`define OUTH    7'd74
`define OUTH    7'd74
`define OUTW    7'd75
`define OUTW    7'd75
 
 
 
`define LM              7'd78
 
`define SM              7'd79
 
 
`define BLTI    7'd80
`define BLTI    7'd80
`define BGEI    7'd81
`define BGEI    7'd81
`define BLEI    7'd82
`define BLEI    7'd82
`define BGTI    7'd83
`define BGTI    7'd83
`define BLTUI   7'd84
`define BLTUI   7'd84
`define BGEUI   7'd85
`define BGEUI   7'd85
`define BLEUI   7'd86
`define BLEUI   7'd86
`define BGTUI   7'd87
`define BGTUI   7'd87
`define BEQI    7'd88
`define BEQI    7'd88
`define BNEI    7'd89
`define BNEI    7'd89
`define BRAI    7'd90
 
`define BRNI    7'd91
 
 
 
`define BTRI    7'd94
`define BTRI    7'd94
`define         BLTRI   5'd0
`define         BLTRI   5'd0
`define         BGERI   5'd1
`define         BGERI   5'd1
`define         BLERI   5'd2
`define         BLERI   5'd2
Line 323... Line 330...
`define         BRA             5'd10
`define         BRA             5'd10
`define         BRN             5'd11
`define         BRN             5'd11
`define         BAND    5'd12
`define         BAND    5'd12
`define         BOR             5'd13
`define         BOR             5'd13
`define         BNR             5'd14
`define         BNR             5'd14
 
`define         LOOP    5'd15
`define         BLTR    5'd16
`define         BLTR    5'd16
`define         BGER    5'd17
`define         BGER    5'd17
`define         BLER    5'd18
`define         BLER    5'd18
`define         BGTR    5'd19
`define         BGTR    5'd19
`define         BLTUR   5'd20
`define         BLTUR   5'd20
Line 415... Line 423...
input sys_adv;
input sys_adv;
input [63:5] sys_adr;
input [63:5] sys_adr;
 
 
reg resetA;
reg resetA;
reg im,bu_im;                   // interrupt mask
reg im,bu_im;                   // interrupt mask
 
reg im1;                        // temporary interrupt mask for LM/SM
reg [1:0] rm;            // fp rounding mode
reg [1:0] rm;            // fp rounding mode
reg [41:0] dIR;
reg [41:0] dIR;
 
reg [41:0] ndIR;
 
wire [6:0] dOpcode = dIR[41:35];
reg [41:0] xIR;
reg [41:0] xIR;
reg [63:0] pc;
reg [63:0] pc;
reg [63:0] ErrorEPC,EPC,IPC;
reg [63:0] ErrorEPC,EPC,IPC;
reg [63:0] dpc,m1pc,m2pc,wpc;
reg [63:0] dpc,m1pc,m2pc,wpc;
reg dpcv,xpcv,m1pcv,m2pcv,wpcv; // PC valid indicators
reg dpcv,xpcv,m1pcv,m2pcv,wpcv; // PC valid indicators
Line 438... Line 449...
reg [63:0] mutex_gate;
reg [63:0] mutex_gate;
reg [63:0] TBA;
reg [63:0] TBA;
reg [1:0] dhwxtype,xhwxtype,m1hwxtype,m2hwxtype,whwxtype;
reg [1:0] dhwxtype,xhwxtype,m1hwxtype,m2hwxtype,whwxtype;
reg [3:0] AXC,dAXC,xAXC;
reg [3:0] AXC,dAXC,xAXC;
reg dtinit;
reg dtinit;
 
reg dcache_on;
reg [63:32] nonICacheSeg;
reg [63:32] nonICacheSeg;
 
 
//reg wr_icache;
 
reg dccyc;
reg dccyc;
wire [63:0] cdat;
wire [63:0] cdat;
reg [63:0] wr_addr;
reg [63:0] wr_addr;
reg [41:0] insn;
reg [41:0] insn;
wire [63:0] rfoa,rfob;
wire [63:0] rfoa,rfob;
Line 600... Line 611...
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Instruction Cache
// Instruction Cache
// 8kB
// 8kB
// 
// 
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
 
//reg lfdir;
 
wire lfdir = ((dOpcode==`LM || dOpcode==`SM) && dIR[31:0]!=32'd0) &&     ndIR[31:0]!=32'd0;
 
wire ldnop = ((dOpcode==`LM || dOpcode==`SM) && (dIR[31:0]==32'd0 || ndIR[31:0]==32'd0));
reg icaccess;
reg icaccess;
//wire nonICachedArea;
 
 
 
//Raptor64_icache_ram_x32 u1
 
//(
 
//      .clk(clk),
 
//      .wr(icaccess & ack_i),
 
//      .adr_i(adr_o[12:0]),
 
//      .dat_i(dat_i),
 
//      .pc(pc),
 
//      .insn(insn)
 
//);
 
reg ICacheOn;
reg ICacheOn;
wire ibufrdy;
wire ibufrdy;
reg [63:0] tmpbuf;
reg [63:0] tmpbuf;
wire [127:0] insnbundle;
wire [127:0] insnbundle;
reg [127:0] insnbuf;
reg [127:0] insnbuf0,insnbuf1;
reg [63:4] ibuftag;
reg [63:4] ibuftag0,ibuftag1;
wire isICached = ppc[63:32]!=nonICacheSeg;
wire isICached = ppc[63:32]!=nonICacheSeg;
wire ICacheAct = ICacheOn & isICached;
wire ICacheAct = ICacheOn & isICached;
 
 
Raptor64_icache_ram u1
Raptor64_icache_ram u1
(
(
        .clka(clk), // input clka
        .clka(clk), // input clka
        .wea(icaccess & ack_i), // input [0 : 0] wea
        .wea(icaccess & ack_i), // input [0 : 0] wea
        .addra(adr_o[12:3]), // input [9 : 0] addra
        .addra(adr_o[12:3]), // input [9 : 0] addra
        .dina(dat_i), // input [63 : 0] dina
        .dina(dat_i), // input [63 : 0] dina
        .clkb(~clk), // input clkb
        .clkb(~clk), // input clkb
        .addrb(pc[12:4]), // input [9 : 0] addrb
        .addrb(pc[12:4]), // input [8 : 0] addrb
        .doutb(insnbundle) // output [63 : 0] doutb
        .doutb(insnbundle) // output [127 : 0] doutb
);
);
 
 
always @(pc or insnbundle or ICacheAct or insnbuf)
always @(ppc or insnbundle or ICacheAct or insnbuf0 or insnbuf1 or ndIR or lfdir or ldnop)
begin
begin
        case({ICacheAct,pc[3:2]})
        casex({ldnop,lfdir,ICacheAct,ibuftag1==ppc[63:4],pc[3:2]})
        3'd0:   insn <= insnbuf[ 41: 0];
        6'b1xxxxx:      insn <= 42'h37800000000;
        3'd1:   insn <= insnbuf[ 83:42];
        6'b01xxxx:      insn <= ndIR;
        3'd2:   insn <= insnbuf[125:84];
        6'b001x00:      insn <= insnbundle[ 41: 0];
        3'd3:   insn <= 42'h37800000000;
        6'b001x01:      insn <= insnbundle[ 83:42];
        3'd4:   insn <= insnbundle[ 41: 0];
        6'b001x10:      insn <= insnbundle[125:84];
        3'd5:   insn <= insnbundle[ 83:42];
        6'b001x11:      insn <= 42'h37800000000;        // NOP instruction
        3'd6:   insn <= insnbundle[125:84];
        6'b000000:      insn <= insnbuf0[ 41: 0];
        3'd7:   insn <= 42'h37800000000;        // NOP instruction
        6'b000001:      insn <= insnbuf0[ 83:42];
 
        6'b000010:      insn <= insnbuf0[125:84];
 
        6'b000011:      insn <= 42'h37800000000;
 
        6'b000100:      insn <= insnbuf1[ 41: 0];
 
        6'b000101:      insn <= insnbuf1[ 83:42];
 
        6'b000110:      insn <= insnbuf1[125:84];
 
        6'b000111:      insn <= 42'h37800000000;
        endcase
        endcase
end
end
 
 
 
 
reg [63:13] tmem [127:0];
reg [63:13] tmem [127:0];
Line 660... Line 669...
end
end
 
 
wire [64:13] tgout;
wire [64:13] tgout;
assign tgout = {tvalid[pc[12:6]],tmem[pc[12:6]]};
assign tgout = {tvalid[pc[12:6]],tmem[pc[12:6]]};
assign ihit = (tgout=={1'b1,ppc[63:13]});
assign ihit = (tgout=={1'b1,ppc[63:13]});
assign ibufrdy = ibuftag==ppc[63:4];
assign ibufrdy = ibuftag0==ppc[63:4] || ibuftag1==ppc[63:4];
 
 
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Data Cache
// Data Cache
// No-allocate on write
// No-allocate on write
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
Line 675... Line 684...
reg [7:0] dsel_o;
reg [7:0] dsel_o;
reg [63:0] dadr_o;
reg [63:0] dadr_o;
reg [31:0] ddat;
reg [31:0] ddat;
reg wr_dcache;
reg wr_dcache;
 
 
// cache RAM 16Kb
// cache RAM 32Kb
/*Raptor64_dcache_ram u10
 
(
 
        .clk(clk),
 
        .wr(dcaccess ? wr_dcache : wrhit ? (dram_bus ? wr_en: we_o): 1'b0),
 
        .sel(dcaccess ? 4'b1111 : wrhit ? ~wr_mask : 4'b0000),
 
        .wadr(dcaccess ? dadr_o[13:2] : wr_addr[13:2]),
 
        .i(dcaccess ? ddat : wr_data),
 
        .radr(pea[13:3]),
 
        .o(cdat)
 
);
 
*/
 
Raptor64_dcache_ram u10
Raptor64_dcache_ram u10
(
(
        .clka(clk), // input clka
        .clka(clk), // input clka
        .ena(1'b1),
        .ena(1'b1),
        .wea(dcaccess ? {8{ack_i}} : wrhit ? sel_o : 8'h00), // input [7 : 0] wea
        .wea(dcaccess ? {8{ack_i}} : wrhit ? sel_o : 8'h00), // input [7 : 0] wea
        .addra(adr_o[14:3]), // input [11 : 0] addra
        .addra(adr_o[14:3]), // input [11 : 0] addra
        .dina(dcaccess ? dat_i : dat_o), // input [63 : 0] dina
        .dina(dcaccess ? dat_i : dat_o), // input [63 : 0] dina
 
 
        .clkb(~clk), // input clkb
        .clkb(~clk), // input clkb
        .addrb(adr_o[14:3]), // input [11 : 0] addrb
        .addrb(pea[14:3]), // input [11 : 0] addrb
        .doutb(cdat) // output [63 : 0] doutb
        .doutb(cdat) // output [63 : 0] doutb
);
);
 
 
 
 
Raptor64_dcache_tagram u11
Raptor64_dcache_tagram u11
Line 713... Line 711...
 
 
        .clkb(~clk), // input clkb
        .clkb(~clk), // input clkb
        .addrb({1'b0,pea[14:6]}), // input [9 : 0] addrb
        .addrb({1'b0,pea[14:6]}), // input [9 : 0] addrb
        .doutb(dtgout) // output [48 : 0] doutb
        .doutb(dtgout) // output [48 : 0] doutb
);
);
// tag ram
 
//syncRam512x64_1rw1r u11
 
//(
 
//      .wrst(1'b0),
 
//      .wclk(clk),
 
//      .wce(adr_o[4:2]==3'b111),
 
//      .we(ack_i),
 
//      .wadr(adr_o[14:5]),
 
//      .i({14'h3FFF,dadr_o[63:14]}),
 
//      .wo(),
 
//
 
//      .rrst(1'b0),
 
//      .rclk(~clk),
 
//      .rce(1'b1),
 
//      .radr(pea[13:5]),
 
//      .ro({dtign,dtgout})
 
//);
 
 
 
assign dhit = (dtgout=={1'b1,pea[63:15]});
assign dhit = (dtgout=={1'b1,pea[63:15]});
 
 
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
 
 
reg [64:0] xData;
reg [64:0] xData;
wire xisCacheElement = xData[63:52] != 12'hFFD && xData[63:52]!=12'hFFF;
wire xisCacheElement = (xData[63:52] != 12'hFFD && xData[63:52]!=12'hFFF) && dcache_on;
reg m1IsCacheElement;
reg m1IsCacheElement;
 
 
reg nopI;
reg nopI;
wire [6:0] iFunc = insn[6:0];
wire [6:0] iFunc = insn[6:0];
wire [6:0] dFunc = dIR[6:0];
wire [6:0] dFunc = dIR[6:0];
wire [6:0] xFunc = xIR[6:0];
wire [6:0] xFunc = xIR[6:0];
wire [6:0] iOpcode = insn[41:35];
wire [6:0] iOpcode = insn[41:35];
wire [6:0] xOpcode = xIR[41:35];
wire [6:0] xOpcode = xIR[41:35];
wire [6:0] dOpcode = dIR[41:35];
 
reg [6:0] m1Opcode,m2Opcode;
reg [6:0] m1Opcode,m2Opcode;
reg [6:0] m1Func,m2Func;
reg [6:0] m1Func,m2Func;
reg [63:0] m1Data,m2Data,wData,tData;
reg [63:0] m1Data,m2Data,wData,tData;
reg [63:0] m2Addr;
reg [63:0] m2Addr;
reg [63:0] tick;
reg [63:0] tick;
Line 930... Line 910...
6'b111111:      popcnt6 = 3'd6;
6'b111111:      popcnt6 = 3'd6;
endcase
endcase
end
end
endfunction
endfunction
 
 
 
function [5:0] popcnt36;
 
input [35:0] a;
 
begin
 
popcnt36 = popcnt6(a[5:0]) +
 
                        popcnt6(a[11:6]) +
 
                        popcnt6(a[17:12]) +
 
                        popcnt6(a[23:18]) +
 
                        popcnt6(a[29:24]) +
 
                        popcnt6(a[35:30]);
 
end
 
endfunction
 
 
wire [63:0] jmp_tgt = dOpcode[6:4]==`IMM ? {dIR[26:0],insn[34:0],2'b00} : {pc[63:37],insn[34:0],2'b00};
wire [63:0] jmp_tgt = dOpcode[6:4]==`IMM ? {dIR[26:0],insn[34:0],2'b00} : {pc[63:37],insn[34:0],2'b00};
 
 
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
 
// Stack for return address predictor
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
`ifdef RAS_PREDICTION
`ifdef RAS_PREDICTION
reg [63:0] ras [63:0];    // return address stack, return predictions
reg [63:0] ras [63:0];    // return address stack, return predictions
reg [5:0] ras_sp;
reg [5:0] ras_sp;                // stack pointer
`endif
`endif
`ifdef BTB
`ifdef BTB
reg [63:0] btb [63:0];    // branch target buffer
reg [63:0] btb [63:0];    // branch target buffer
`endif
`endif
 
 
Line 977... Line 970...
wire [7:0] bht_ra2 = {pc[5:0],gbl_branch_hist[2:1]};      // read address (IF stage)
wire [7:0] bht_ra2 = {pc[5:0],gbl_branch_hist[2:1]};      // read address (IF stage)
wire [1:0] bht_xbits = branch_history_table[bht_ra1];
wire [1:0] bht_xbits = branch_history_table[bht_ra1];
wire [1:0] bht_ibits = branch_history_table[bht_ra2];
wire [1:0] bht_ibits = branch_history_table[bht_ra2];
wire predict_taken = bht_ibits==2'd0 || bht_ibits==2'd1;
wire predict_taken = bht_ibits==2'd0 || bht_ibits==2'd1;
 
 
wire isxBranchI = (xOpcode==`BRAI || xOpcode==`BRNI || xOpcode==`BEQI || xOpcode==`BNEI ||
wire isxBranchI = (xOpcode==`BEQI || xOpcode==`BNEI ||
                                        xOpcode==`BLTI || xOpcode==`BLEI || xOpcode==`BGTI || xOpcode==`BGEI ||
                                        xOpcode==`BLTI || xOpcode==`BLEI || xOpcode==`BGTI || xOpcode==`BGEI ||
                                        xOpcode==`BLTUI || xOpcode==`BLEUI || xOpcode==`BGTUI || xOpcode==`BGEUI)
                                        xOpcode==`BLTUI || xOpcode==`BLEUI || xOpcode==`BGTUI || xOpcode==`BGEUI)
                                ;
                                ;
wire isxBranch = isxBranchI || xOpcode==`TRAPcc || xOpcode==`TRAPcci || xOpcode==`BTRI || xOpcode==`BTRR;
wire isxBranch = isxBranchI || xOpcode==`TRAPcc || xOpcode==`TRAPcci || xOpcode==`BTRI || xOpcode==`BTRR;
 
 
Line 1042... Line 1035...
        `BGTU:  takb = !(ltu|eq);
        `BGTU:  takb = !(ltu|eq);
        `BGEU:  takb = !ltu;
        `BGEU:  takb = !ltu;
        `BOR:   takb = !aeqz || !beqz;
        `BOR:   takb = !aeqz || !beqz;
        `BAND:  takb = !aeqz && !beqz;
        `BAND:  takb = !aeqz && !beqz;
        `BNR:   takb = !rsf;
        `BNR:   takb = !rsf;
 
        `LOOP:  takb = !beqz;
        `BEQR:  takb = eq;
        `BEQR:  takb = eq;
        `BNER:  takb = !eq;
        `BNER:  takb = !eq;
        `BLTR:  takb = lt;
        `BLTR:  takb = lt;
        `BLER:  takb = lt|eq;
        `BLER:  takb = lt|eq;
        `BGTR:  takb = !(lt|eq);
        `BGTR:  takb = !(lt|eq);
Line 1054... Line 1048...
        `BLEUR: takb = ltu|eq;
        `BLEUR: takb = ltu|eq;
        `BGTUR: takb = !(ltu|eq);
        `BGTUR: takb = !(ltu|eq);
        `BGEUR: takb = !ltu;
        `BGEUR: takb = !ltu;
        default:        takb = 1'b0;
        default:        takb = 1'b0;
        endcase
        endcase
`BRAI:  takb = 1'b1;
 
`BRNI:  takb = 1'b0;
 
`BEQI:  takb = eqi;
`BEQI:  takb = eqi;
`BNEI:  takb = !eqi;
`BNEI:  takb = !eqi;
`BLTI:  takb = lti;
`BLTI:  takb = lti;
`BLEI:  takb = lti|eqi;
`BLEI:  takb = lti|eqi;
`BGTI:  takb = !(lti|eqi);
`BGTI:  takb = !(lti|eqi);
Line 1157... Line 1149...
        shfto or masko or bcdaddo or bcdsubo or fpLooOut or fpZLOut
        shfto or masko or bcdaddo or bcdsubo or fpLooOut or fpZLOut
`ifdef TLB
`ifdef TLB
        or Wired or Index or Random or TLBPhysPage0 or TLBPhysPage1 or TLBVirtPage or TLBASID or
        or Wired or Index or Random or TLBPhysPage0 or TLBPhysPage1 or TLBVirtPage or TLBASID or
        PageTableAddr or BadVAddr or ASID or TLBPageMask
        PageTableAddr or BadVAddr or ASID or TLBPageMask
`endif
`endif
 
        or ASID or EPC or mutex_gate or IPC or CauseCode or TBA or xAXC or nonICacheSeg or rm
)
)
casex(xOpcode)
casex(xOpcode)
`R:
`R:
        casex(xFunc)
        casex(xFunc)
        `COM:   xData = ~a;
        `COM:   xData = ~a;
        `NOT:   xData = ~|a;
        `NOT:   xData = ~|a;
        `NEG:   xData = -a;
        `NEG:   xData = -a;
        `ABS:   xData = a[63] ? -a : a;
        `ABS:   xData = a[63] ? -a : a;
 
        `MOV:   xData = a;
        `SQRT:  xData = sqrt_out;
        `SQRT:  xData = sqrt_out;
        `SWAP:  xData = {a[31:0],a[63:32]};
        `SWAP:  xData = {a[31:0],a[63:32]};
 
 
        `REDOR:         xData = |a;
        `REDOR:         xData = |a;
        `REDAND:        xData = &a;
        `REDAND:        xData = &a;
Line 1212... Line 1206...
                `BadVAddr:              xData = {BadVAddr,13'd0};
                `BadVAddr:              xData = {BadVAddr,13'd0};
`endif
`endif
                `ASID:                  xData = ASID;
                `ASID:                  xData = ASID;
                `Tick:                  xData = tick;
                `Tick:                  xData = tick;
                `EPC:                   xData = EPC;
                `EPC:                   xData = EPC;
 
                `IPC:                   xData = IPC;
                `CauseCode:             xData = CauseCode;
                `CauseCode:             xData = CauseCode;
                `TBA:                   xData = TBA;
                `TBA:                   xData = TBA;
                `AXC:                   xData = xAXC;
                `AXC:                   xData = xAXC;
                `NON_ICACHE_SEG:        xData = nonICacheSeg;
                `NON_ICACHE_SEG:        xData = nonICacheSeg;
 
                `FPCR:                  xData = {rm,30'd0};
                default:        xData = 65'd0;
                default:        xData = 65'd0;
                endcase
                endcase
        `OMG:           xData = mutex_gate[a[5:0]];
        `OMG:           xData = mutex_gate[a[5:0]];
        `CMG:           xData = mutex_gate[a[5:0]];
        `CMG:           xData = mutex_gate[a[5:0]];
        `OMGI:          begin
        `OMGI:          begin
Line 1289... Line 1285...
        `BFSET:         begin for (n = 0; n < 64; n = n + 1) xData[n] = masko[n] ? 1'b1 : b[n]; xData[64] = 1'b0; end
        `BFSET:         begin for (n = 0; n < 64; n = n + 1) xData[n] = masko[n] ? 1'b1 : b[n]; xData[64] = 1'b0; end
        `BFCLR:         begin for (n = 0; n < 64; n = n + 1) xData[n] = masko[n] ? 1'b0 : b[n]; xData[64] = 1'b0; end
        `BFCLR:         begin for (n = 0; n < 64; n = n + 1) xData[n] = masko[n] ? 1'b0 : b[n]; xData[64] = 1'b0; end
        `BFCHG:         begin for (n = 0; n < 64; n = n + 1) xData[n] = masko[n] ? ~b[n] : b[n]; xData[64] = 1'b0; end
        `BFCHG:         begin for (n = 0; n < 64; n = n + 1) xData[n] = masko[n] ? ~b[n] : b[n]; xData[64] = 1'b0; end
        default:        xData = 65'd0;
        default:        xData = 65'd0;
        endcase
        endcase
 
`BTRR:
 
        case(xIR[4:0])
 
        `LOOP:  xData = b - 64'd1;
 
        default:        xData = 64'd0;
 
        endcase
`SETLO: xData = {{32{xIR[31]}},xIR[31:0]};
`SETLO: xData = {{32{xIR[31]}},xIR[31:0]};
`SETHI: xData = {xIR[31:0],a[31:0]};
`SETHI: xData = {xIR[31:0],a[31:0]};
`ADDI:  xData = a + imm;
`ADDI:  xData = a + imm;
`ADDUI: xData = a + imm;
`ADDUI: xData = a + imm;
`SUBI:  xData = a - imm;
`SUBI:  xData = a - imm;
Line 1318... Line 1319...
`SGEUI: xData = !ltui;
`SGEUI: xData = !ltui;
`INB,`INCH,`INH,`INW:
`INB,`INCH,`INH,`INW:
                xData = a + imm;
                xData = a + imm;
`OUTB,`OUTC,`OUTH,`OUTW:
`OUTB,`OUTC,`OUTH,`OUTW:
                xData = a + imm;
                xData = a + imm;
`LW,`LH,`LC,`LB,`LHU,`LCU,`LBU,`LWR:
`LW,`LH,`LC,`LB,`LHU,`LCU,`LBU,`LWR,`LF,`LFD:
                xData = a + imm;
                xData = a + imm;
`SW,`SH,`SC,`SB,`SWC:
`SW,`SH,`SC,`SB,`SWC,`SF,`SFD:
                xData = a + imm;
                xData = a + imm;
`MEMNDX:
`MEMNDX:
                xData = a + b + imm;
                xData = a + b + imm;
`BEQ,`BNE,`BLT,`BLE,`BGT,`BGE,`BLTU,`BLEU,`BGTU,`BGEU,`BOR,`BAND:
`SM:    xData = a + {popcnt36(xIR[31:0]),3'b000};
                xData = 64'd0;
`LM:    xData = a + {popcnt36(xIR[31:0]),3'b000};
`TRAPcc:        xData = fnIncPC(xpc);
`TRAPcc:        xData = fnIncPC(xpc);
`TRAPcci:       xData = fnIncPC(xpc);
`TRAPcci:       xData = fnIncPC(xpc);
`CALL:          xData = fnIncPC(xpc);
`CALL:          xData = fnIncPC(xpc);
`JAL:           xData = xpc + {xIR[29:25],2'b00};
`JAL:           xData = xpc + {xIR[29:25],2'b00};
`RET:   xData = a + {imm,2'b00};
`RET:   xData = a + imm;
`FPLOO: xData = fpLooOut;
`FPLOO: xData = fpLooOut;
`FPZL:  xData = fpZLOut;
`FPZL:  xData = fpZLOut;
default:        xData = 65'd0;
default:        xData = 65'd0;
endcase
endcase
 
 
Line 1355... Line 1356...
        xOpcode==`DIVSI || xOpcode==`DIVUI;
        xOpcode==`DIVSI || xOpcode==`DIVUI;
 
 
wire xIsLoad =
wire xIsLoad =
        xOpcode==`LW || xOpcode==`LH || xOpcode==`LB || xOpcode==`LWR ||
        xOpcode==`LW || xOpcode==`LH || xOpcode==`LB || xOpcode==`LWR ||
        xOpcode==`LHU || xOpcode==`LBU ||
        xOpcode==`LHU || xOpcode==`LBU ||
        xOpcode==`LC || xOpcode==`LCU ||
        xOpcode==`LC || xOpcode==`LCU || xOpcode==`LM ||
        xOpcode==`INW || xOpcode==`INB || xOpcode==`INH || xOpcode==`INCH
        xOpcode==`LF || xOpcode==`LFD
        ;
        ;
wire xIsStore =
wire xIsStore =
        xOpcode==`SW || xOpcode==`SH || xOpcode==`SB || xOpcode==`SC || xOpcode==`SWC ||
        xOpcode==`SW || xOpcode==`SH || xOpcode==`SB || xOpcode==`SC || xOpcode==`SWC || xOpcode==`SM ||
 
        xOpcode==`SF || xOpcode==`SFD ||
        xOpcode==`OUTW || xOpcode==`OUTH || xOpcode==`OUTB || xOpcode==`OUTC
        xOpcode==`OUTW || xOpcode==`OUTH || xOpcode==`OUTB || xOpcode==`OUTC
        ;
        ;
wire xIsSWC = xOpcode==`SWC;
wire xIsSWC = xOpcode==`SWC;
wire xIsIn =
wire xIsIn =
        xOpcode==`INW || xOpcode==`INH || xOpcode==`INCH || xOpcode==`INB
        xOpcode==`INW || xOpcode==`INH || xOpcode==`INCH || xOpcode==`INB
Line 1375... Line 1377...
//      mOpcode==`LHU || mOpcode==`LBU || mOpcode==`LCU ||
//      mOpcode==`LHU || mOpcode==`LBU || mOpcode==`LCU ||
//      mOpcode==`INW || mOpcode==`INB || mOpcode==`INH
//      mOpcode==`INW || mOpcode==`INB || mOpcode==`INH
//      ;
//      ;
wire m1IsLoad =
wire m1IsLoad =
        m1Opcode==`LW || m1Opcode==`LH || m1Opcode==`LB || m1Opcode==`LC || m1Opcode==`LWR ||
        m1Opcode==`LW || m1Opcode==`LH || m1Opcode==`LB || m1Opcode==`LC || m1Opcode==`LWR ||
        m1Opcode==`LHU || m1Opcode==`LBU || m1Opcode==`LCU
        m1Opcode==`LHU || m1Opcode==`LBU || m1Opcode==`LCU || m1Opcode==`LM ||
 
        m1Opcode==`LF || m1Opcode==`LFD
        ;
        ;
wire m1IsIn =
wire m1IsIn =
        m1Opcode==`INW || m1Opcode==`INH || m1Opcode==`INCH || m1Opcode==`INB
        m1Opcode==`INW || m1Opcode==`INH || m1Opcode==`INCH || m1Opcode==`INB
        ;
        ;
wire m2IsInW = m2Opcode==`INW;
wire m2IsInW = m2Opcode==`INW;
wire m1IsStore =
wire m1IsStore = m1Opcode==`SW || m1Opcode==`SH || m1Opcode==`SB || m1Opcode==`SC || m1Opcode==`SWC || m1Opcode==`SM ||
        m1Opcode==`SW || m1Opcode==`SH || m1Opcode==`SB || m1Opcode==`SC || m1Opcode==`SWC
                                m1Opcode==`SF || m1Opcode==`SFD;
        ;
wire m2IsStore = m2Opcode==`SW || m2Opcode==`SWC || m2Opcode==`SH || m2Opcode==`SC || m2Opcode==`SB || m2Opcode==`SM ||
 
                                m2Opcode==`SF || m2Opcode==`SFD;
wire xIsIO =
wire xIsIO =
        xIsIn ||
        xIsIn ||
        xOpcode==`OUTW || xOpcode==`OUTH || xOpcode==`OUTC || xOpcode==`OUTB
        xOpcode==`OUTW || xOpcode==`OUTH || xOpcode==`OUTC || xOpcode==`OUTB
        ;
        ;
wire m1IsIO =
wire m1IsIO =
        m1IsIn ||
        m1IsIn ||
        m1Opcode==`OUTW || m1Opcode==`OUTH || m1Opcode==`OUTC || m1Opcode==`OUTB
        m1Opcode==`OUTW || m1Opcode==`OUTH || m1Opcode==`OUTC || m1Opcode==`OUTB
        ;
        ;
wire m2IsLoad =
wire m2IsLoad =
        m2Opcode==`LW || m2Opcode==`LH || m2Opcode==`LB || m2Opcode==`LC || m2Opcode==`LWR ||
        m2Opcode==`LW || m2Opcode==`LH || m2Opcode==`LB || m2Opcode==`LC || m2Opcode==`LWR ||
        m2Opcode==`LHU || m2Opcode==`LBU || m2Opcode==`LCU
        m2Opcode==`LHU || m2Opcode==`LBU || m2Opcode==`LCU || m2Opcode==`LM ||
 
        m2Opcode==`LF || m2Opcode==`LFD
        ;
        ;
wire m2IsStore =
 
        m2Opcode==`SW || m2Opcode==`SWC || m2Opcode==`SH || m2Opcode==`SC || m2Opcode==`SB;
 
 
 
wire xIsFPLoo = xOpcode==`FPLOO;
wire xIsFPLoo = xOpcode==`FPLOO;
 
 
wire xneedBus = xIsIO;
wire xneedBus = xIsIO;
wire m1needBus = (m1IsLoad & !m1IsCacheElement) || m1IsStore || m1IsIO;
wire m1needBus = (m1IsLoad & !m1IsCacheElement) || m1IsStore || m1IsIO;
Line 1412... Line 1415...
wire StallR =   (((xIsLoad||xIsIn) && ((xRt==dRa)||(xRt==dRb)||(xRt==dRt))) || xIsSWC) ||
wire StallR =   (((xIsLoad||xIsIn) && ((xRt==dRa)||(xRt==dRb)||(xRt==dRt))) || xIsSWC) ||
                                (((m1IsLoad||m1IsIn) && ((m1Rt==dRa)||(m1Rt==dRb)||(m1Rt==dRt)))) ||
                                (((m1IsLoad||m1IsIn) && ((m1Rt==dRa)||(m1Rt==dRb)||(m1Rt==dRt)))) ||
                                (((m2IsLoad) && ((m2Rt==dRa)||(m2Rt==dRb)||(m2Rt==dRt))))
                                (((m2IsLoad) && ((m2Rt==dRa)||(m2Rt==dRb)||(m2Rt==dRt))))
                                ;
                                ;
wire StallX = xneedBus & (m1needBus|m2needBus|icaccess|dcaccess);
wire StallX = xneedBus & (m1needBus|m2needBus|icaccess|dcaccess);
wire StallM1 = m1needBus & (m2needBus|icaccess|dcaccess);
wire StallM1 = (m1needBus & (m2needBus|icaccess|dcaccess)) ||
 
                                ( m1IsLoad & m1IsCacheElement & m2IsStore)      // wait for a preceding store to complete
 
                                ;
wire StallM2 =  icaccess|dcaccess;
wire StallM2 =  icaccess|dcaccess;
 
 
wire advanceT = !resetA;
wire advanceT = !resetA;
wire advanceW = advanceT;
wire advanceW = advanceT;
wire advanceM2 = advanceW &&
wire advanceM2 = advanceW &&
Line 1441... Line 1446...
wire triggerDCacheLoad = (m1IsLoad & m1IsCacheElement & !dhit) &&       // there is a miss
wire triggerDCacheLoad = (m1IsLoad & m1IsCacheElement & !dhit) &&       // there is a miss
                                                !(icaccess | dcaccess) &&       // caches are not active
                                                !(icaccess | dcaccess) &&       // caches are not active
                                                m2Opcode==`NOPI                         // and the pipeline is free of memory-ops
                                                m2Opcode==`NOPI                         // and the pipeline is free of memory-ops
                                                ;
                                                ;
// Since IMM is "sticky" we have to check for it.
// Since IMM is "sticky" we have to check for it.
wire triggerICacheLoad = (ICacheAct ? !ihit : !ibufrdy) && !triggerDCacheLoad &&        // There is a miss
wire triggerICacheLoad1 = ICacheAct && !ihit && !triggerDCacheLoad &&   // There is a miss
                                                !(icaccess | dcaccess) &&       // caches are not active
                                                !(icaccess | dcaccess) &&       // caches are not active
                                                (dOpcode==`NOPI || dOpcode[6:4]==`IMM) &&                       // and the pipeline is flushed
                                                (dOpcode==`NOPI || dOpcode[6:4]==`IMM) &&                       // and the pipeline is flushed
                                                (xOpcode==`NOPI || xOpcode[6:4]==`IMM) &&
                                                (xOpcode==`NOPI || xOpcode[6:4]==`IMM) &&
                                                m1Opcode==`NOPI &&
                                                m1Opcode==`NOPI &&
                                                m2Opcode==`NOPI
                                                m2Opcode==`NOPI
                                                ;
                                                ;
 
wire triggerICacheLoad2 = (!ICacheAct && !ibufrdy) && !triggerDCacheLoad &&     // There is a miss
 
                                                !(icaccess | dcaccess)  // caches are not active
 
                                                ;
 
wire triggerICacheLoad = triggerICacheLoad1 | triggerICacheLoad2;
 
 
wire EXexception_pending = ovr_error || dbz_error || priv_violation || xOpcode==`TRAPcci || xOpcode==`TRAPcc;
wire EXexception_pending = ovr_error || dbz_error || priv_violation || xOpcode==`TRAPcci || xOpcode==`TRAPcc;
`ifdef TLB
`ifdef TLB
wire M1exception_pending = advanceM1 & (m1IsLoad|m1IsStore) & DTLBMiss;
wire M1exception_pending = advanceM1 & (m1IsLoad|m1IsStore) & DTLBMiss;
`else
`else
wire M1exception_pending = 1'b0;
wire M1exception_pending = 1'b0;
`endif
`endif
wire exception_pending = EXexception_pending | M1exception_pending;
wire exception_pending = EXexception_pending | M1exception_pending;
 
 
wire xWillLoadStore = (xIsLoad||xIsStore) & advanceX;
 
wire stallCacheLoad = xWillLoadStore;
 
 
 
reg prev_nmi,nmi_edge;
reg prev_nmi,nmi_edge;
 
 
 
always @(dOpcode or dIR)
 
begin
 
        ndIR <= dIR;
 
        if ((dOpcode==`LM || dOpcode==`SM) && dIR[31:0]!=32'd0) begin
 
                $display("LM/SM %h",dIR[31:0]);
 
                if (dIR[0])
 
                        ndIR[0] <= 1'b0;
 
                else if (dIR[1])
 
                        ndIR[1] <= 1'b0;
 
                else if (dIR[2])
 
                        ndIR[2] <= 1'b0;
 
                else if (dIR[3])
 
                        ndIR[3] <= 1'b0;
 
                else if (dIR[4])
 
                        ndIR[4] <= 1'b0;
 
                else if (dIR[5])
 
                        ndIR[5] <= 1'b0;
 
                else if (dIR[6])
 
                        ndIR[6] <= 1'b0;
 
                else if (dIR[7])
 
                        ndIR[7] <= 1'b0;
 
                else if (dIR[8])
 
                        ndIR[8] <= 1'b0;
 
                else if (dIR[9])
 
                        ndIR[9] <= 1'b0;
 
                else if (dIR[10])
 
                        ndIR[10] <= 1'b0;
 
                else if (dIR[11])
 
                        ndIR[11] <= 1'b0;
 
                else if (dIR[12])
 
                        ndIR[12] <= 1'b0;
 
                else if (dIR[13])
 
                        ndIR[13] <= 1'b0;
 
                else if (dIR[14])
 
                        ndIR[14] <= 1'b0;
 
                else if (dIR[15])
 
                        ndIR[15] <= 1'b0;
 
                else if (dIR[16])
 
                        ndIR[16] <= 1'b0;
 
                else if (dIR[17])
 
                        ndIR[17] <= 1'b0;
 
                else if (dIR[18])
 
                        ndIR[18] <= 1'b0;
 
                else if (dIR[19])
 
                        ndIR[19] <= 1'b0;
 
                else if (dIR[20])
 
                        ndIR[20] <= 1'b0;
 
                else if (dIR[21])
 
                        ndIR[21] <= 1'b0;
 
                else if (dIR[22])
 
                        ndIR[22] <= 1'b0;
 
                else if (dIR[23])
 
                        ndIR[23] <= 1'b0;
 
                else if (dIR[24])
 
                        ndIR[24] <= 1'b0;
 
                else if (dIR[25])
 
                        ndIR[25] <= 1'b0;
 
                else if (dIR[26])
 
                        ndIR[26] <= 1'b0;
 
                else if (dIR[27])
 
                        ndIR[27] <= 1'b0;
 
                else if (dIR[28])
 
                        ndIR[28] <= 1'b0;
 
                else if (dIR[29])
 
                        ndIR[29] <= 1'b0;
 
                else if (dIR[30])
 
                        ndIR[30] <= 1'b0;
 
                else
 
                        ndIR[31] <= 1'b0;
 
        end
 
end
 
 
//---------------------------------------------------------
//---------------------------------------------------------
// Register file.
// Register file.
//---------------------------------------------------------
//---------------------------------------------------------
 
 
Line 1498... Line 1576...
);
);
 
 
 
 
reg m1clkoff,m2clkoff,m3clkoff,m4clkoff,wclkoff;
reg m1clkoff,m2clkoff,m3clkoff,m4clkoff,wclkoff;
reg dFip,xFip,m1Fip,m2Fip,m3Fip,m4Fip,wFip;
reg dFip,xFip,m1Fip,m2Fip,m3Fip,m4Fip,wFip;
 
reg cyc1;
 
 
 
reg [63:0] nxt_c;
 
always @(dRc or xData or m1Data or m2Data or wData or tData or rfoc)
 
        casex(dRc)
 
        9'bxxxx00000:   nxt_c <= 64'd0;
 
        xRt:    nxt_c <= xData;
 
        m1Rt:   nxt_c <= m1Data;
 
        m2Rt:   nxt_c <= m2Data;
 
        wRt:    nxt_c <= wData;
 
        tRt:    nxt_c <= tData;
 
        default:        nxt_c <= rfoc;
 
        endcase
 
 
always @(posedge clk)
always @(posedge clk)
if (rst_i) begin
if (rst_i) begin
        bte_o <= 2'b00;
        bte_o <= 2'b00;
        cti_o <= 3'b000;
        cti_o <= 3'b000;
Line 1571... Line 1662...
        resetA <= 1'b1;
        resetA <= 1'b1;
        mutex_gate <= 64'h0;
        mutex_gate <= 64'h0;
`ifndef BRANCH_PREDICTION_SIMPLE
`ifndef BRANCH_PREDICTION_SIMPLE
        gbl_branch_hist <= 3'b000;
        gbl_branch_hist <= 3'b000;
`endif
`endif
 
        dcache_on <= 1'b0;
        ICacheOn <= 1'b0;
        ICacheOn <= 1'b0;
        ibuftag <= 64'h0;
        ibuftag0 <= 64'h0;
 
        ibuftag1 <= 64'h0;
        m1IsCacheElement <= 1'b0;
        m1IsCacheElement <= 1'b0;
        dtinit <= 1'b1;
        dtinit <= 1'b1;
`ifdef RAS_PREDICTION
`ifdef RAS_PREDICTION
        ras_sp <= 6'd63;
        ras_sp <= 6'd63;
`endif
`endif
 
        im <= 1'b1;
 
        im1 <= 1'b1;
end
end
else begin
else begin
 
 
//---------------------------------------------------------
//---------------------------------------------------------
// Initialize program counters
// Initialize program counters
Line 1608... Line 1703...
prev_nmi <= nmi_i;
prev_nmi <= nmi_i;
if (!prev_nmi & nmi_i)
if (!prev_nmi & nmi_i)
        nmi_edge <= 1'b1;
        nmi_edge <= 1'b1;
 
 
 
 
 
`ifdef ADDRESS_RESERVATION
// A store by any device in the system to a reserved address blcok
// A store by any device in the system to a reserved address blcok
// clears the reservation.
// clears the reservation.
 
 
if (sys_adv && sys_adr[63:5]==resv_address)
if (sys_adv && sys_adr[63:5]==resv_address)
        resv_address <= 59'd0;
        resv_address <= 59'd0;
 
`endif
 
 
//---------------------------------------------------------
//---------------------------------------------------------
// TRAILER:
// TRAILER:
// - placeholder to allow the use of synchronous register
// - placeholder to allow the use of synchronous register
//   memory
//   memory
Line 1684... Line 1781...
        m2clkoff <= 1'b0;
        m2clkoff <= 1'b0;
        m2pc <= 64'd0;
        m2pc <= 64'd0;
        m2extype <= `EX_NON;
        m2extype <= `EX_NON;
        if (m2extype==`EX_NON) begin
        if (m2extype==`EX_NON) begin
                case(m2Opcode)
                case(m2Opcode)
                `SH,`SC,`SB,`SW,`SWC:
                `SH,`SC,`SB,`SW,`SWC,`SM,`SF,`SFD:
                        begin
                        begin
                                cyc_o <= 1'b0;
                                cyc_o <= 1'b0;
                                stb_o <= 1'b0;
                                stb_o <= 1'b0;
                                we_o <= 1'b0;
                                we_o <= 1'b0;
                                sel_o <= 4'h0;
                                sel_o <= 4'h0;
                        end
                        end
                `LH:
                `LH,`LF:
                        begin
                        begin
                                cyc_o <= 1'b0;
                                cyc_o <= 1'b0;
                                stb_o <= 1'b0;
                                stb_o <= 1'b0;
                                sel_o <= 8'h00;
                                sel_o <= 8'h00;
                                wData <= sel_o[7] ? {{32{dat_i[63]}},dat_i[63:32]}:{{32{dat_i[31]}},dat_i[31: 0]};
                                wData <= sel_o[7] ? {{32{dat_i[63]}},dat_i[63:32]}:{{32{dat_i[31]}},dat_i[31: 0]};
                        end
                        end
                `LW,`LWR:
                `LW,`LWR,`LM,`LFD:
                        begin
                        begin
                                cyc_o <= 1'b0;
                                cyc_o <= 1'b0;
                                stb_o <= 1'b0;
                                stb_o <= 1'b0;
                                sel_o <= 8'h00;
                                sel_o <= 8'h00;
                                wData <= dat_i;
                                wData <= dat_i;
Line 1940... Line 2037...
                                we_o <= 1'b0;
                                we_o <= 1'b0;
                                sel_o <= 8'h00;
                                sel_o <= 8'h00;
                                m2Opcode <= `NOPI;
                                m2Opcode <= `NOPI;
                        end
                        end
 
 
                `LW:
                `LW,`LM,`LFD:
                        if (!m1IsCacheElement) begin
                        if (!m1IsCacheElement) begin
                                cyc_o <= 1'b1;
                                cyc_o <= 1'b1;
                                stb_o <= 1'b1;
                                stb_o <= 1'b1;
                                sel_o <= 8'hFF;
                                sel_o <= 8'hFF;
                                adr_o <= {pea[63:3],3'b000};
                                adr_o <= {pea[63:3],3'b000};
Line 1952... Line 2049...
                        end
                        end
                        else if (dhit) begin
                        else if (dhit) begin
                                m2Opcode <= `NOPI;
                                m2Opcode <= `NOPI;
                                m2Data <= cdat;
                                m2Data <= cdat;
                        end
                        end
 
`ifdef ADDRESS_RESERVATION
                `LWR:
                `LWR:
                        if (!m1IsCacheElement) begin
                        if (!m1IsCacheElement) begin
                                rsv_o <= 1'b1;
                                rsv_o <= 1'b1;
                                resv_address <= pea[63:5];
                                resv_address <= pea[63:5];
                                cyc_o <= 1'b1;
                                cyc_o <= 1'b1;
Line 1969... Line 2066...
                                m2Opcode <= `NOPI;
                                m2Opcode <= `NOPI;
                                m2Data <= cdat;
                                m2Data <= cdat;
                                rsv_o <= 1'b1;
                                rsv_o <= 1'b1;
                                resv_address <= pea[63:5];
                                resv_address <= pea[63:5];
                        end
                        end
 
`endif
                `LH:
                `LH,`LF:
                        if (!m1IsCacheElement) begin
                        if (!m1IsCacheElement) begin
                                cyc_o <= 1'b1;
                                cyc_o <= 1'b1;
                                stb_o <= 1'b1;
                                stb_o <= 1'b1;
                                sel_o <= pea[2] ? 8'b11110000 : 8'b00001111;
                                sel_o <= pea[2] ? 8'b11110000 : 8'b00001111;
                                adr_o <= {pea[63:2],2'b00};
                                adr_o <= {pea[63:2],2'b00};
Line 2016... Line 2113...
                                endcase
                                endcase
                                adr_o <= {pea[63:1],1'b0};
                                adr_o <= {pea[63:1],1'b0};
                                m2Addr <= {pea[63:1],1'b0};
                                m2Addr <= {pea[63:1],1'b0};
                        end
                        end
                        else if (dhit) begin
                        else if (dhit) begin
 
                                $display("dhit=1, cdat=%h",cdat);
                                m2Opcode <= `NOPI;
                                m2Opcode <= `NOPI;
                                case(pea[2:1])
                                case(pea[2:1])
                                2'd0:   m2Data <= {{48{cdat[15]}},cdat[15:0]};
                                2'd0:   m2Data <= {{48{cdat[15]}},cdat[15:0]};
                                2'd1:   m2Data <= {{48{cdat[31]}},cdat[31:16]};
                                2'd1:   m2Data <= {{48{cdat[31]}},cdat[31:16]};
                                2'd2:   m2Data <= {{48{cdat[47]}},cdat[47:32]};
                                2'd2:   m2Data <= {{48{cdat[47]}},cdat[47:32]};
Line 2111... Line 2209...
                                3'b110: m2Data <= {56'd0,cdat[55:48]};
                                3'b110: m2Data <= {56'd0,cdat[55:48]};
                                3'b111: m2Data <= {56'd0,cdat[63:56]};
                                3'b111: m2Data <= {56'd0,cdat[63:56]};
                                endcase
                                endcase
                        end
                        end
 
 
                `SW:
                `SW,`SM,`SFD:
                        begin
                        begin
 
                                $display("SW/SM");
                                m2Addr <= {pea[63:3],3'b000};
                                m2Addr <= {pea[63:3],3'b000};
                                wrhit <= dhit;
                                wrhit <= dhit;
`ifdef TLB
`ifdef TLB
                                if (!m1UnmappedDataArea & !q[3])
                                if (!m1UnmappedDataArea & !q[3])
                                        ITLBD[{q[2:0],pea[15:13]}] <= 1'b1;
                                        ITLBD[{q[2:0],pea[15:13]}] <= 1'b1;
`endif
`endif
 
`ifdef ADDRESS_RESERVATION
                                if (resv_address==pea[63:5])
                                if (resv_address==pea[63:5])
                                        resv_address <= 59'd0;
                                        resv_address <= 59'd0;
 
`endif
                                cyc_o <= 1'b1;
                                cyc_o <= 1'b1;
                                stb_o <= 1'b1;
                                stb_o <= 1'b1;
                                we_o <= 1'b1;
                                we_o <= 1'b1;
                                sel_o <= 8'hFF;
                                sel_o <= 8'hFF;
                                adr_o <= {pea[63:3],3'b000};
                                adr_o <= {pea[63:3],3'b000};
                                dat_o <= m1Data;
                                dat_o <= m1Data;
                        end
                        end
 
 
                `SH:
                `SH,`SF:
                        begin
                        begin
                                wrhit <= dhit;
                                wrhit <= dhit;
                                m2Addr <= {pea[63:2],2'b00};
                                m2Addr <= {pea[63:2],2'b00};
`ifdef TLB
`ifdef TLB
                                if (!m1UnmappedDataArea & !q[3])
                                if (!m1UnmappedDataArea & !q[3])
                                        ITLBD[{q[2:0],pea[15:13]}] <= 1'b1;
                                        ITLBD[{q[2:0],pea[15:13]}] <= 1'b1;
`endif
`endif
 
`ifdef ADDRESS_RESERVATION
                                if (resv_address==pea[63:5])
                                if (resv_address==pea[63:5])
                                        resv_address <= 59'd0;
                                        resv_address <= 59'd0;
 
`endif
                                cyc_o <= 1'b1;
                                cyc_o <= 1'b1;
                                stb_o <= 1'b1;
                                stb_o <= 1'b1;
                                we_o <= 1'b1;
                                we_o <= 1'b1;
                                sel_o <= pea[2] ? 8'b11110000 : 8'b00001111;
                                sel_o <= pea[2] ? 8'b11110000 : 8'b00001111;
                                adr_o <= {pea[63:2],2'b00};
                                adr_o <= {pea[63:2],2'b00};
Line 2156... Line 2259...
                                m2Addr <= {pea[63:2],2'b00};
                                m2Addr <= {pea[63:2],2'b00};
`ifdef TLB
`ifdef TLB
                                if (!m1UnmappedDataArea & !q[3])
                                if (!m1UnmappedDataArea & !q[3])
                                        ITLBD[{q[2:0],pea[15:13]}] <= 1'b1;
                                        ITLBD[{q[2:0],pea[15:13]}] <= 1'b1;
`endif
`endif
 
`ifdef ADDRESS_RESERVATION
                                if (resv_address==pea[63:5])
                                if (resv_address==pea[63:5])
                                        resv_address <= 59'd0;
                                        resv_address <= 59'd0;
 
`endif
                                cyc_o <= 1'b1;
                                cyc_o <= 1'b1;
                                stb_o <= 1'b1;
                                stb_o <= 1'b1;
                                we_o <= 1'b1;
                                we_o <= 1'b1;
                                case(pea[2:1])
                                case(pea[2:1])
                                2'b00:  sel_o <= 8'b00000011;
                                2'b00:  sel_o <= 8'b00000011;
Line 2175... Line 2280...
 
 
                `SB:
                `SB:
                        begin
                        begin
                                wrhit <= dhit;
                                wrhit <= dhit;
                                m2Addr <= {pea[63:2],2'b00};
                                m2Addr <= {pea[63:2],2'b00};
 
`ifdef ADDRESS_RESERVATION
                                if (resv_address==pea[63:5])
                                if (resv_address==pea[63:5])
                                        resv_address <= 59'd0;
                                        resv_address <= 59'd0;
 
`endif
`ifdef TLB
`ifdef TLB
                                if (!m1UnmappedDataArea & !q[3])
                                if (!m1UnmappedDataArea & !q[3])
                                        ITLBD[{q[2:0],pea[15:13]}] <= 1'b1;
                                        ITLBD[{q[2:0],pea[15:13]}] <= 1'b1;
`endif
`endif
                                cyc_o <= 1'b1;
                                cyc_o <= 1'b1;
Line 2198... Line 2305...
                                endcase
                                endcase
                                adr_o <= {pea[63:2],2'b00};
                                adr_o <= {pea[63:2],2'b00};
                                dat_o <= {8{m1Data[7:0]}};
                                dat_o <= {8{m1Data[7:0]}};
                        end
                        end
 
 
 
`ifdef ADDRESS_RESERVATION
                `SWC:
                `SWC:
                        begin
                        begin
                                rsf <= 1'b0;
                                rsf <= 1'b0;
                                if (resv_address==pea[63:5]) begin
                                if (resv_address==pea[63:5]) begin
`ifdef TLB
`ifdef TLB
Line 2220... Line 2328...
                                        rsf <= 1'b1;
                                        rsf <= 1'b1;
                                end
                                end
                                else
                                else
                                        m2Opcode <= `NOPI;
                                        m2Opcode <= `NOPI;
                        end
                        end
 
`endif
                endcase
                endcase
        end
        end
end
end
 
 
//---------------------------------------------------------
//---------------------------------------------------------
Line 2263... Line 2372...
        `MISC:
        `MISC:
                case(xFunc)
                case(xFunc)
                `WAIT:  m1clkoff <= 1'b1;
                `WAIT:  m1clkoff <= 1'b1;
                `ICACHE_ON:             ICacheOn <= 1'b1;
                `ICACHE_ON:             ICacheOn <= 1'b1;
                `ICACHE_OFF:    ICacheOn <= 1'b0;
                `ICACHE_OFF:    ICacheOn <= 1'b0;
 
                `DCACHE_ON:             dcache_on <= 1'b1;
 
                `DCACHE_OFF:    dcache_on <= 1'b0;
`ifdef TLB
`ifdef TLB
                `TLBP:  ea <= TLBVirtPage;
                `TLBP:  ea <= TLBVirtPage;
                `TLBR,`TLBWI:
                `TLBR,`TLBWI:
                        begin
                        begin
                                i <= {Index[2:0],TLBVirtPage[15:13]};
                                i <= {Index[2:0],TLBVirtPage[15:13]};
Line 2301... Line 2412...
                        `ASID:                  ASID <= a[7:0];
                        `ASID:                  ASID <= a[7:0];
                        `EPC:                   EPC <= a;
                        `EPC:                   EPC <= a;
                        `TBA:                   TBA <= {a[63:12],12'h000};
                        `TBA:                   TBA <= {a[63:12],12'h000};
                        `AXC:                   AXC <= a[3:0];
                        `AXC:                   AXC <= a[3:0];
                        `NON_ICACHE_SEG:        nonICacheSeg <= a[63:32];
                        `NON_ICACHE_SEG:        nonICacheSeg <= a[63:32];
 
                        `FPCR:                  rm <= a[31:30];
 
                        `IPC:                   IPC <= a;
                        default:        ;
                        default:        ;
                        endcase
                        endcase
                `OMG:   mutex_gate[a[5:0]] <= 1'b1;
                `OMG:   mutex_gate[a[5:0]] <= 1'b1;
                `CMG:   mutex_gate[a[5:0]] <= 1'b0;
                `CMG:   mutex_gate[a[5:0]] <= 1'b0;
                `OMGI:  mutex_gate[xIR[12:7]] <= 1'b1;
                `OMGI:  mutex_gate[xIR[12:7]] <= 1'b1;
Line 2402... Line 2515...
                        3'b111: sel_o <= 8'b10000000;
                        3'b111: sel_o <= 8'b10000000;
                        endcase
                        endcase
                        adr_o <= xData;
                        adr_o <= xData;
                        dat_o <= {8{b[7:0]}};
                        dat_o <= {8{b[7:0]}};
                        end
                        end
        `LB,`LBU,`LC,`LCU,`LH,`LHU,`LW,`LWR,`SW,`SH,`SC,`SB,`SWC:
        `LB,`LBU,`LC,`LCU,`LH,`LHU,`LW,`LWR,`LF,`LFD,`LM,
 
        `SW,`SH,`SC,`SB,`SWC,`SF,`SFD,`SM:
                        begin
                        begin
                        m1Data <= b;
                        m1Data <= b;
                        ea <= xData;
                        ea <= xData;
                        end
                        end
        `MEMNDX:
        `MEMNDX:
Line 2437... Line 2551...
if (advanceR) begin
if (advanceR) begin
        xAXC <= dAXC;
        xAXC <= dAXC;
        xhwxtype <= dhwxtype;
        xhwxtype <= dhwxtype;
        xFip <= dFip;
        xFip <= dFip;
        xextype <= dextype;
        xextype <= dextype;
 
        if (dOpcode==`R && dFunc==`MYST)
 
                xIR <= nxt_c;
 
        else
        xIR <= dIR;
        xIR <= dIR;
        xpc <= dpc;
        xpc <= dpc;
        xpcv <= dpcv;
        xpcv <= dpcv;
        xbranch_taken <= dbranch_taken;
        xbranch_taken <= dbranch_taken;
        dbranch_taken <= 1'b0;
        dbranch_taken <= 1'b0;
        dextype <= `EX_NON;
        dextype <= `EX_NON;
        if (dOpcode[6:4]!=`IMM) // IMM is "sticky"
        if (dOpcode[6:4]!=`IMM && dOpcode!=`LM && dOpcode!=`SM) // IMM is "sticky"
                dIR <= `NOP_INSN;
                dIR <= `NOP_INSN;
        dRa <= 9'd0;
        dRa <= 9'd0;
        dRb <= 9'd0;
        dRb <= 9'd0;
 
 
        // Result forward muxes
        // Result forward muxes
Line 2472... Line 2589...
        if (dOpcode==`SHFTI)
        if (dOpcode==`SHFTI)
                case(dFunc)
                case(dFunc)
                `RORI:          b <= {58'd0,~dIR[24:19]+6'd1};
                `RORI:          b <= {58'd0,~dIR[24:19]+6'd1};
                default:        b <= {58'd0,dIR[24:19]};
                default:        b <= {58'd0,dIR[24:19]};
                endcase
                endcase
        casex(dRc)
        c <= nxt_c;
        9'bxxxx00000:   c <= 64'd0;
 
        xRt:    c <= xData;
 
        m1Rt:   c <= m1Data;
 
        m2Rt:   c <= m2Data;
 
        wRt:    c <= wData;
 
        tRt:    c <= tData;
 
        default:        c <= rfoc;
 
        endcase
 
 
 
        // Set the target register
        // Set the target register
        casex(dOpcode)
        casex(dOpcode)
 
        `R:
 
                case(dFunc)
 
                `MYST:          xRt <= {dAXC,dIR[19:15]};
 
                default:        xRt <= {dAXC,dIR[29:25]};
 
                endcase
        `SETLO:         xRt <= {dAXC,dIR[36:32]};
        `SETLO:         xRt <= {dAXC,dIR[36:32]};
        `SETHI:         xRt <= {dAXC,dIR[36:32]};
        `SETHI:         xRt <= {dAXC,dIR[36:32]};
        `RR:            xRt <= {dAXC,dIR[24:20]};
        `RR:            xRt <= {dAXC,dIR[24:20]};
        `BTRI:          xRt <= 9'd0;
        `BTRI:          xRt <= 9'd0;
        `BTRR:          xRt <= 9'd0;
        `BTRR:
 
                case(dIR[4:0])
 
                `LOOP:  xRt <= {AXC,dIR[29:25]};
 
                default: xRt <= 9'd0;
 
                endcase
        `TRAPcc:        xRt <= 9'd0;
        `TRAPcc:        xRt <= 9'd0;
        `TRAPcci:       xRt <= 9'd0;
        `TRAPcci:       xRt <= 9'd0;
        `JMP:           xRt <= 9'd00;
        `JMP:           xRt <= 9'd00;
        `CALL:          xRt <= {dAXC,5'd31};
        `CALL:          xRt <= {dAXC,5'd31};
        `RET:           xRt <= {dAXC,dIR[24:20]};
        `RET:           xRt <= {dAXC,dIR[24:20]};
        `MEMNDX:
        `MEMNDX:
                case(dFunc)
                case(dFunc)
                `SW,`SH,`SC,`SB,`OUTW,`OUTH,`OUTC,`OUTB:
                `SW,`SH,`SC,`SB,`SF,`SFD,
 
                `OUTW,`OUTH,`OUTC,`OUTB:
                                xRt <= 9'd0;
                                xRt <= 9'd0;
                default:        xRt <= {dAXC,dIR[24:20]};
                default:        xRt <= {dAXC,dIR[24:20]};
                endcase
                endcase
        `SW,`SH,`SC,`SB,`OUTW,`OUTH,`OUTC,`OUTB:
        `SW,`SH,`SC,`SB,`SF,`SFD,       // but not SWC!
 
        `OUTW,`OUTH,`OUTC,`OUTB:
                                xRt <= 9'd0;
                                xRt <= 9'd0;
        `NOPI:          xRt <= 9'd0;
        `NOPI:          xRt <= 9'd0;
        `BEQI,`BNEI,`BLTI,`BLEI,`BGTI,`BGEI,`BLTUI,`BLEUI,`BGTUI,`BGEUI:
        `BEQI,`BNEI,`BLTI,`BLEI,`BGTI,`BGEI,`BLTUI,`BLEUI,`BGTUI,`BGEUI:
                                xRt <= 9'd0;
                                xRt <= 9'd0;
 
        `SM:            xRt <= 9'd0;
 
        `LM:
 
                casex(dIR[30:0])
 
                31'bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1:    xRt <= {AXC,5'd1};
 
                31'bxxxxxxxxxxxxxxxxxxxxxxxxxxxxx10:    xRt <= {AXC,5'd2};
 
                31'bxxxxxxxxxxxxxxxxxxxxxxxxxxxx100:    xRt <= {AXC,5'd3};
 
                31'bxxxxxxxxxxxxxxxxxxxxxxxxxxx1000:    xRt <= {AXC,5'd4};
 
                31'bxxxxxxxxxxxxxxxxxxxxxxxxxx10000:    xRt <= {AXC,5'd5};
 
                31'bxxxxxxxxxxxxxxxxxxxxxxxxx100000:    xRt <= {AXC,5'd6};
 
                31'bxxxxxxxxxxxxxxxxxxxxxxxx1000000:    xRt <= {AXC,5'd7};
 
                31'bxxxxxxxxxxxxxxxxxxxxxxx10000000:    xRt <= {AXC,5'd8};
 
                31'bxxxxxxxxxxxxxxxxxxxxxx100000000:    xRt <= {AXC,5'd9};
 
                31'bxxxxxxxxxxxxxxxxxxxxx1000000000:    xRt <= {AXC,5'd10};
 
                31'bxxxxxxxxxxxxxxxxxxxx10000000000:    xRt <= {AXC,5'd11};
 
                31'bxxxxxxxxxxxxxxxxxxx100000000000:    xRt <= {AXC,5'd12};
 
                31'bxxxxxxxxxxxxxxxxxx1000000000000:    xRt <= {AXC,5'd13};
 
                31'bxxxxxxxxxxxxxxxxx10000000000000:    xRt <= {AXC,5'd14};
 
                31'bxxxxxxxxxxxxxxxx100000000000000:    xRt <= {AXC,5'd15};
 
                31'bxxxxxxxxxxxxxxx1000000000000000:    xRt <= {AXC,5'd16};
 
                31'bxxxxxxxxxxxxxx10000000000000000:    xRt <= {AXC,5'd17};
 
                31'bxxxxxxxxxxxxx100000000000000000:    xRt <= {AXC,5'd18};
 
                31'bxxxxxxxxxxxx1000000000000000000:    xRt <= {AXC,5'd19};
 
                31'bxxxxxxxxxxx10000000000000000000:    xRt <= {AXC,5'd20};
 
                31'bxxxxxxxxxx100000000000000000000:    xRt <= {AXC,5'd21};
 
                31'bxxxxxxxxx1000000000000000000000:    xRt <= {AXC,5'd22};
 
                31'bxxxxxxxx10000000000000000000000:    xRt <= {AXC,5'd23};
 
                31'bxxxxxxx100000000000000000000000:    xRt <= {AXC,5'd24};
 
                31'bxxxxxx1000000000000000000000000:    xRt <= {AXC,5'd25};
 
                31'bxxxxx10000000000000000000000000:    xRt <= {AXC,5'd26};
 
                31'bxxxx100000000000000000000000000:    xRt <= {AXC,5'd27};
 
                31'bxxx1000000000000000000000000000:    xRt <= {AXC,5'd28};
 
                31'bxx10000000000000000000000000000:    xRt <= {AXC,5'd29};
 
                31'bx100000000000000000000000000000:    xRt <= {AXC,5'd30};
 
                31'b1000000000000000000000000000000:    xRt <= {AXC,5'd31};
 
                default:        xRt <= 9'h000;
 
                endcase
 
 
        default:        xRt <= {dAXC,dIR[29:25]};
        default:        xRt <= {dAXC,dIR[29:25]};
        endcase
        endcase
        if (dOpcode[6:4]==`IMM)
        if (dOpcode[6:4]==`IMM)
                xRt <= 9'd0;
                xRt <= 9'd0;
 
 
Line 2522... Line 2679...
                `BEQI,`BNEI,`BLTI,`BLEI,`BGTI,`BGEI,`BLTUI,`BLEUI,`BGTUI,`BGEUI:
                `BEQI,`BNEI,`BLTI,`BLEI,`BGTI,`BGEI,`BLTUI,`BLEUI,`BGTUI,`BGEUI:
                        imm <= {{46{dIR[17]}},dIR[17:0]};
                        imm <= {{46{dIR[17]}},dIR[17:0]};
                `ANDI:  imm <= {39'h7FFFFFFFFF,dIR[24:0]};
                `ANDI:  imm <= {39'h7FFFFFFFFF,dIR[24:0]};
                `ORI:   imm <= {39'h0000000000,dIR[24:0]};
                `ORI:   imm <= {39'h0000000000,dIR[24:0]};
                `XORI:  imm <= {39'h0000000000,dIR[24:0]};
                `XORI:  imm <= {39'h0000000000,dIR[24:0]};
                `RET:   imm <= {44'h00000000000,dIR[19:0]};
                `RET:   imm <= {41'h00000000,dIR[19:0],3'b000};
                `MEMNDX:        imm <= {{51{dIR[19]}},dIR[19:7]};
                `MEMNDX:        imm <= {{51{dIR[19]}},dIR[19:7]};
                default:        imm <= {{39{dIR[24]}},dIR[24:0]};
                default:        imm <= {{39{dIR[24]}},dIR[24:0]};
                endcase
                endcase
        case(dOpcode)
        case(dOpcode)
 
 
Line 2535... Line 2692...
                `SEI:   im <= 1'b1;
                `SEI:   im <= 1'b1;
                `CLI:   im <= 1'b0;
                `CLI:   im <= 1'b0;
                endcase
                endcase
        endcase
        endcase
 
 
 
        if ((dOpcode==`SM || dOpcode==`LM) && dIR[31:0]!=32'd0)
 
                dIR <= ndIR;
end
end
 
 
//---------------------------------------------------------
//---------------------------------------------------------
// IFETCH:
// IFETCH:
// - check for external hardware interrupt
// - check for external hardware interrupt
Line 2547... Line 2706...
// - set special register defaults for some instructions
// - set special register defaults for some instructions
//---------------------------------------------------------
//---------------------------------------------------------
if (advanceI) begin
if (advanceI) begin
        dAXC <= AXC;
        dAXC <= AXC;
        dextype <= `EX_NON;
        dextype <= `EX_NON;
        if (nmi_edge & !StatusHWI) begin
        if (nmi_edge & !StatusHWI & !im1) begin
                $display("*****************");
                $display("*****************");
                $display("NMI edge detected");
                $display("NMI edge detected");
                $display("*****************");
                $display("*****************");
                StatusHWI <= 1'b1;
                StatusHWI <= 1'b1;
                nmi_edge <= 1'b0;
                nmi_edge <= 1'b0;
                dhwxtype <= 2'b01;
                dhwxtype <= 2'b01;
                dIR <= `NOP_INSN;
                dIR <= `NOP_INSN;
                dextype <= `EX_NMI;
                dextype <= `EX_NMI;
        end
        end
        else if (irq_i & !im & !StatusHWI) begin
        else if (irq_i & !im & !StatusHWI & !im1) begin
                im <= 1'b1;
                im <= 1'b1;
                StatusHWI <= 1'b1;
                StatusHWI <= 1'b1;
                dhwxtype <= 2'b10;
                dhwxtype <= 2'b10;
                dIR <= `NOP_INSN;
                dIR <= `NOP_INSN;
                dextype <= `EX_IRQ;
                dextype <= `EX_IRQ;
Line 2574... Line 2733...
`ifdef TLB
`ifdef TLB
        else if (ITLBMiss)
        else if (ITLBMiss)
                dIR <= `NOP_INSN;
                dIR <= `NOP_INSN;
`endif
`endif
        else begin
        else begin
 
                if ((iOpcode==`SM || iOpcode==`LM) && insn[31:0]!=32'd0)
 
                        im1 <= 1'b1;
 
                else
 
                        im1 <= 1'b0;
 
                if ((iOpcode==`SM || iOpcode==`LM) && insn[31:0]==32'd0) begin
 
                        dIR <= `NOP_INSN;
 
                        pc <= fnIncPC(pc);
 
                end
 
                else
                dIR <= insn;
                dIR <= insn;
`include "insn_dumpsc.v"
`include "insn_dumpsc.v"
        end
        end
        nopI <= 1'b0;
        nopI <= 1'b0;
        if (dOpcode[6:4]!=`IMM) begin
        if (dOpcode[6:4]!=`IMM) begin
                dpc <= pc;
                dpc <= pc;
                dpcv <= 1'b1;
                dpcv <= 1'b1;
        end
        end
 
        dRb <= {AXC,insn[29:25]};
 
        dRc <= {AXC,insn[24:20]};
        casex(iOpcode)
        casex(iOpcode)
        `SETLO:         dRa <= {AXC,insn[36:32]};
        `SETLO:         dRa <= {AXC,insn[36:32]};
        `SETHI:         dRa <= {AXC,insn[36:32]};
        `SETHI:         dRa <= {AXC,insn[36:32]};
 
        `SM,`LM:
 
                begin
 
                dRa <= {AXC,1'b1,insn[34:31]};
 
                casex(insn[30:0])
 
                31'bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1:    dRb <= {AXC,5'd1};
 
                31'bxxxxxxxxxxxxxxxxxxxxxxxxxxxxx10:    dRb <= {AXC,5'd2};
 
                31'bxxxxxxxxxxxxxxxxxxxxxxxxxxxx100:    dRb <= {AXC,5'd3};
 
                31'bxxxxxxxxxxxxxxxxxxxxxxxxxxx1000:    dRb <= {AXC,5'd4};
 
                31'bxxxxxxxxxxxxxxxxxxxxxxxxxx10000:    dRb <= {AXC,5'd5};
 
                31'bxxxxxxxxxxxxxxxxxxxxxxxxx100000:    dRb <= {AXC,5'd6};
 
                31'bxxxxxxxxxxxxxxxxxxxxxxxx1000000:    dRb <= {AXC,5'd7};
 
                31'bxxxxxxxxxxxxxxxxxxxxxxx10000000:    dRb <= {AXC,5'd8};
 
                31'bxxxxxxxxxxxxxxxxxxxxxx100000000:    dRb <= {AXC,5'd9};
 
                31'bxxxxxxxxxxxxxxxxxxxxx1000000000:    dRb <= {AXC,5'd10};
 
                31'bxxxxxxxxxxxxxxxxxxxx10000000000:    dRb <= {AXC,5'd11};
 
                31'bxxxxxxxxxxxxxxxxxxx100000000000:    dRb <= {AXC,5'd12};
 
                31'bxxxxxxxxxxxxxxxxxx1000000000000:    dRb <= {AXC,5'd13};
 
                31'bxxxxxxxxxxxxxxxxx10000000000000:    dRb <= {AXC,5'd14};
 
                31'bxxxxxxxxxxxxxxxx100000000000000:    dRb <= {AXC,5'd15};
 
                31'bxxxxxxxxxxxxxxx1000000000000000:    dRb <= {AXC,5'd16};
 
                31'bxxxxxxxxxxxxxx10000000000000000:    dRb <= {AXC,5'd17};
 
                31'bxxxxxxxxxxxxx100000000000000000:    dRb <= {AXC,5'd18};
 
                31'bxxxxxxxxxxxx1000000000000000000:    dRb <= {AXC,5'd19};
 
                31'bxxxxxxxxxxx10000000000000000000:    dRb <= {AXC,5'd20};
 
                31'bxxxxxxxxxx100000000000000000000:    dRb <= {AXC,5'd21};
 
                31'bxxxxxxxxx1000000000000000000000:    dRb <= {AXC,5'd22};
 
                31'bxxxxxxxx10000000000000000000000:    dRb <= {AXC,5'd23};
 
                31'bxxxxxxx100000000000000000000000:    dRb <= {AXC,5'd24};
 
                31'bxxxxxx1000000000000000000000000:    dRb <= {AXC,5'd25};
 
                31'bxxxxx10000000000000000000000000:    dRb <= {AXC,5'd26};
 
                31'bxxxx100000000000000000000000000:    dRb <= {AXC,5'd27};
 
                31'bxxx1000000000000000000000000000:    dRb <= {AXC,5'd28};
 
                31'bxx10000000000000000000000000000:    dRb <= {AXC,5'd29};
 
                31'bx100000000000000000000000000000:    dRb <= {AXC,5'd30};
 
                31'b1000000000000000000000000000000:    dRb <= {AXC,5'd31};
 
                default:        dRb <= {AXC,5'd0};
 
                endcase
 
                end
        default:        dRa <= {AXC,insn[34:30]};
        default:        dRa <= {AXC,insn[34:30]};
        endcase
        endcase
        dRb <= {AXC,insn[29:25]};
 
        dRc <= {AXC,insn[24:20]};
 
`ifdef TLB
`ifdef TLB
        if (ITLBMiss) begin
        if (ITLBMiss) begin
                $display("TLB miss on instruction fetch.");
                $display("TLB miss on instruction fetch.");
                CauseCode <= `EX_TLBI;
                CauseCode <= `EX_TLBI;
                StatusEXL <= 1'b1;
                StatusEXL <= 1'b1;
Line 2602... Line 2808...
        end
        end
        else
        else
`endif
`endif
        begin
        begin
                dbranch_taken <= 1'b0;
                dbranch_taken <= 1'b0;
 
                if ((iOpcode==`LM || iOpcode==`SM) && insn[31:0]!=32'd0)
 
                        ;
 
                else begin
                pc <= fnIncPC(pc);
                pc <= fnIncPC(pc);
 
                end
                case(iOpcode)
                case(iOpcode)
                `MISC:
                `MISC:
                        case(iFunc)
                        case(iFunc)
                        `FIP:   dFip <= 1'b1;
                        `FIP:   dFip <= 1'b1;
                        default:        ;
                        default:        ;
Line 2637... Line 2847...
                                dbranch_taken <= 1'b1;
                                dbranch_taken <= 1'b1;
                                pc <= jmp_tgt;
                                pc <= jmp_tgt;
                        end
                        end
                `BTRR:
                `BTRR:
                        case(insn[4:0])
                        case(insn[4:0])
                        `BEQ,`BNE,`BLT,`BLE,`BGT,`BGE,`BLTU,`BLEU,`BGTU,`BGEU,`BAND,`BOR,`BNR:
                        `BEQ,`BNE,`BLT,`BLE,`BGT,`BGE,`BLTU,`BLEU,`BGTU,`BGEU,`BAND,`BOR,`BRA,`BNR,`BRN,`LOOP:
                                if (predict_taken) begin
                                if (predict_taken) begin
//                                      $display("Taking predicted branch: %h",{pc[63:4] + {{42{insn[24]}},insn[24:7]},insn[6:5],2'b00});
//                                      $display("Taking predicted branch: %h",{pc[63:4] + {{42{insn[24]}},insn[24:7]},insn[6:5],2'b00});
                                        dbranch_taken <= 1'b1;
                                        dbranch_taken <= 1'b1;
                                        pc <= {pc[63:4] + {{42{insn[24]}},insn[24:7]},insn[6:5],2'b00};
                                        pc <= {pc[63:4] + {{42{insn[24]}},insn[24:7]},insn[6:5],2'b00};
                                end
                                end
Line 2706... Line 2916...
        `R:
        `R:
                case(xFunc)
                case(xFunc)
                `EXEC:
                `EXEC:
                        begin
                        begin
                                pc <= fnIncPC(xpc);
                                pc <= fnIncPC(xpc);
 
                                dRa <= b[34:30];
 
                                dRb <= b[29:25];
 
                                dRc <= b[24:20];
                                dIR <= b;
                                dIR <= b;
                                xIR <= `NOP_INSN;
                                xIR <= `NOP_INSN;
                                xRt <= 9'd0;
                                xRt <= 9'd0;
                                xpcv <= 1'b0;
                                xpcv <= 1'b0;
                                dpcv <= 1'b0;
                                dpcv <= 1'b0;
Line 2717... Line 2930...
                default:        ;
                default:        ;
                endcase
                endcase
        `BTRR:
        `BTRR:
                case(xIR[4:0])
                case(xIR[4:0])
        // BEQ r1,r2,label
        // BEQ r1,r2,label
                `BEQ,`BNE,`BLT,`BLE,`BGT,`BGE,`BLTU,`BLEU,`BGTU,`BGEU,`BAND,`BOR,`BNR:
                `BEQ,`BNE,`BLT,`BLE,`BGT,`BGE,`BLTU,`BLEU,`BGTU,`BGEU,`BAND,`BOR,`BNR,`LOOP,`BRA,`BRN:
                        if (!takb & xbranch_taken) begin
                        if (!takb & xbranch_taken) begin
                                $display("Taking mispredicted branch %h",fnIncPC(xpc));
                                $display("Taking mispredicted branch %h",fnIncPC(xpc));
                                pc <= fnIncPC(xpc);
                                pc <= fnIncPC(xpc);
                                dIR <= `NOP_INSN;
                                dIR <= `NOP_INSN;
                                xIR <= `NOP_INSN;
                                xIR <= `NOP_INSN;
Line 3070... Line 3283...
                if (adr_o[3]==1'b0) begin
                if (adr_o[3]==1'b0) begin
                        cti_o <= 3'b111;        // Last cycle ahead
                        cti_o <= 3'b111;        // Last cycle ahead
                        tmpbuf <= dat_i;
                        tmpbuf <= dat_i;
                end
                end
                else begin
                else begin
                        insnbuf <= {dat_i,tmpbuf};
                        if (tick[0]) begin
 
                                insnbuf0 <= {dat_i,tmpbuf};
 
                                ibuftag0 <= adr_o[63:4];
 
                        end
 
                        else begin
 
                                insnbuf1 <= {dat_i,tmpbuf};
 
                                ibuftag1 <= adr_o[63:4];
 
                        end
                        cti_o <= 3'b000;        // back to non-burst mode
                        cti_o <= 3'b000;        // back to non-burst mode
                        cyc_o <= 1'b0;
                        cyc_o <= 1'b0;
                        stb_o <= 1'b0;
                        stb_o <= 1'b0;
                        icaccess <= 1'b0;
                        icaccess <= 1'b0;
                        ibuftag <= adr_o[63:4];
 
                        cstate <= IDLE;
                        cstate <= IDLE;
                end
                end
        end
        end
 
 
DCACT:
DCACT:

powered by: WebSVN 2.1.0

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