Line 1... |
Line 1... |
// ============================================================================
|
// ============================================================================
|
// __
|
// __
|
// \\__/ o\ (C) 2018 Robert Finch, Waterloo
|
// \\__/ o\ (C) 2018-2019 Robert Finch, Waterloo
|
// \ __ / All rights reserved.
|
// \ __ / All rights reserved.
|
// \/_// robfinch<remove>@finitron.ca
|
// \/_// robfinch<remove>@finitron.ca
|
// ||
|
// ||
|
//
|
//
|
// FT64_fetchbuf_x1.v
|
// FT64_fetchbuf_x1.v
|
Line 118... |
Line 118... |
|
|
function IsBranch;
|
function IsBranch;
|
input [47:0] isn;
|
input [47:0] isn;
|
casex(isn[`INSTRUCTION_OP])
|
casex(isn[`INSTRUCTION_OP])
|
`Bcc: IsBranch = TRUE;
|
`Bcc: IsBranch = TRUE;
|
|
`BLcc: IsBranch = TRUE;
|
`BBc: IsBranch = TRUE;
|
`BBc: IsBranch = TRUE;
|
`BEQI: IsBranch = TRUE;
|
`BEQI: IsBranch = TRUE;
|
|
`BNEI: IsBranch = TRUE;
|
`BCHK: IsBranch = TRUE;
|
`BCHK: IsBranch = TRUE;
|
default: IsBranch = FALSE;
|
default: IsBranch = FALSE;
|
endcase
|
endcase
|
endfunction
|
endfunction
|
|
|
Line 132... |
Line 134... |
IsJAL = isn[`INSTRUCTION_OP]==`JAL;
|
IsJAL = isn[`INSTRUCTION_OP]==`JAL;
|
endfunction
|
endfunction
|
|
|
function IsJmp;
|
function IsJmp;
|
input [47:0] isn;
|
input [47:0] isn;
|
IsJmp = isn[`INSTRUCTION_OP]==`JMP;
|
IsJmp = isn[`INSTRUCTION_OP]==`JMP && isn[7]==1'b0;
|
endfunction
|
endfunction
|
|
|
function IsCall;
|
function IsCall;
|
input [47:0] isn;
|
input [47:0] isn;
|
IsCall = isn[`INSTRUCTION_OP]==`CALL;
|
IsCall = isn[`INSTRUCTION_OP]==`CALL && isn[7]==1'b0;
|
endfunction
|
endfunction
|
|
|
function IsRet;
|
function IsRet;
|
input [47:0] isn;
|
input [47:0] isn;
|
IsRet = isn[`INSTRUCTION_OP]==`RET;
|
IsRet = isn[`INSTRUCTION_OP]==`RET;
|
Line 155... |
Line 157... |
function IsRTI;
|
function IsRTI;
|
input [47:0] isn;
|
input [47:0] isn;
|
IsRTI = isn[`INSTRUCTION_OP]==`R2 && isn[`INSTRUCTION_S2]==`RTI;
|
IsRTI = isn[`INSTRUCTION_OP]==`R2 && isn[`INSTRUCTION_S2]==`RTI;
|
endfunction
|
endfunction
|
|
|
|
function IsExec;
|
|
input [47:0] isn;
|
|
if (isn[7:6]==2'b00)
|
|
case(isn[`INSTRUCTION_OP])
|
|
`R2:
|
|
case(isn[`INSTRUCTION_S2])
|
|
`R1:
|
|
case(isn[22:18])
|
|
`EXEC: IsExec = TRUE;
|
|
default: IsExec = FALSE;
|
|
endcase
|
|
default: IsExec = FALSE;
|
|
endcase
|
|
default: IsExec = FALSE;
|
|
endcase
|
|
else
|
|
IsExec = FALSE;
|
|
endfunction
|
|
|
function [2:0] fnInsLength;
|
function [2:0] fnInsLength;
|
input [47:0] ins;
|
input [47:0] ins;
|
`ifdef SUPPORT_DCI
|
`ifdef SUPPORT_DCI
|
if (ins[`INSTRUCTION_OP]==`CMPRSSD)
|
if (ins[`INSTRUCTION_OP]==`CMPRSSD)
|
fnInsLength = 3'd2 | pred_on;
|
fnInsLength = 3'd2 | pred_on;
|
Line 215... |
Line 236... |
begin
|
begin
|
case(fetchbufA_instr[`INSTRUCTION_OP])
|
case(fetchbufA_instr[`INSTRUCTION_OP])
|
`RET: branch_pcA = retpc0;
|
`RET: branch_pcA = retpc0;
|
`JMP,`CALL:
|
`JMP,`CALL:
|
begin
|
begin
|
|
`ifdef JMP40
|
branch_pcA[39:0] = fetchbufA_instr[6] ? {fetchbufA_instr[47:8]} : {fetchbufA_pc[39:24],fetchbufA_instr[31:8]};
|
branch_pcA[39:0] = fetchbufA_instr[6] ? {fetchbufA_instr[47:8]} : {fetchbufA_pc[39:24],fetchbufA_instr[31:8]};
|
|
`else
|
|
branch_pcA[39:0] = {fetchbufA_pc[39:24],fetchbufA_instr[31:8]};
|
|
`endif
|
branch_pcA[63:40] = fetchbufA_pc[63:40];
|
branch_pcA[63:40] = fetchbufA_pc[63:40];
|
end
|
end
|
`R2: branch_pcA = btgtA; // RTI
|
`R2: branch_pcA = btgtA; // RTI
|
`BRK,`JAL: branch_pcA = btgtA;
|
`BRK,`JAL: branch_pcA = btgtA;
|
default:
|
default:
|
begin
|
begin
|
branch_pcA[31:8] = fetchbufA_pc[31:8] +
|
branch_pcA[31:0] = fetchbufA_pc[31:0] +
|
((fetchbufA_instr[7:6]==2'b01) ? {{5{fetchbufA_instr[47]}},fetchbufA_instr[47:29]} : {{21{fetchbufA_instr[31]}},fetchbufA_instr[31:29]});
|
((fetchbufA_instr[7:6]==2'b01) ? {{4{fetchbufA_instr[47]}},fetchbufA_instr[47:23],fetchbufA_instr[17:16],1'b0} : {{20{fetchbufA_instr[31]}},fetchbufA_instr[31:23],fetchbufA_instr[17:16],1'b0});
|
branch_pcA[7:0] = {fetchbufA_instr[28:23],fetchbufA_instr[17:16]};
|
|
branch_pcA[63:32] = fetchbufA_pc[63:32];
|
branch_pcA[63:32] = fetchbufA_pc[63:32];
|
end
|
end
|
endcase
|
endcase
|
end
|
end
|
|
|
Line 236... |
Line 260... |
begin
|
begin
|
case(fetchbufB_instr[`INSTRUCTION_OP])
|
case(fetchbufB_instr[`INSTRUCTION_OP])
|
`RET: branch_pcB = retpc0;
|
`RET: branch_pcB = retpc0;
|
`JMP,`CALL:
|
`JMP,`CALL:
|
begin
|
begin
|
|
`ifdef JMP40
|
branch_pcB[39:0] = fetchbufB_instr[6] ? {fetchbufB_instr[47:8]} : {fetchbufB_pc[39:24],fetchbufB_instr[31:8]};
|
branch_pcB[39:0] = fetchbufB_instr[6] ? {fetchbufB_instr[47:8]} : {fetchbufB_pc[39:24],fetchbufB_instr[31:8]};
|
|
`else
|
|
branch_pcB[39:0] = {fetchbufB_pc[39:24],fetchbufB_instr[31:8]};
|
|
`endif
|
branch_pcB[63:40] = fetchbufB_pc[63:40];
|
branch_pcB[63:40] = fetchbufB_pc[63:40];
|
end
|
end
|
`R2: branch_pcB = btgtB; // RTI
|
`R2: branch_pcB = btgtB; // RTI
|
`BRK,`JAL: branch_pcB = btgtB;
|
`BRK,`JAL: branch_pcB = btgtB;
|
default:
|
default:
|
begin
|
begin
|
branch_pcB[31:8] = fetchbufB_pc[31:8] +
|
branch_pcB[31:0] = fetchbufB_pc[31:0] +
|
((fetchbufB_instr[7:6]==2'b01) ? {{5{fetchbufB_instr[47]}},fetchbufB_instr[47:29]} : {{21{fetchbufB_instr[31]}},fetchbufB_instr[31:29]});
|
((fetchbufB_instr[7:6]==2'b01) ? {{4{fetchbufB_instr[47]}},fetchbufB_instr[47:23],fetchbufB_instr[17:16],1'b0} : {{20{fetchbufB_instr[31]}},fetchbufB_instr[31:23],fetchbufB_instr[17:16],1'b0});
|
branch_pcB[7:0] = {fetchbufB_instr[28:23],fetchbufB_instr[17:16]};
|
|
branch_pcB[63:32] = fetchbufB_pc[63:32];
|
branch_pcB[63:32] = fetchbufB_pc[63:32];
|
end
|
end
|
endcase
|
endcase
|
end
|
end
|
|
|
Line 468... |
Line 495... |
`ifdef SUPPORT_DCI
|
`ifdef SUPPORT_DCI
|
if (insn0[5:0]==`CMPRSSD)
|
if (insn0[5:0]==`CMPRSSD)
|
insln0 <= 3'd2 | pred_on;
|
insln0 <= 3'd2 | pred_on;
|
else
|
else
|
`endif
|
`endif
|
if (insn0[7:6]==2'b00 && insn0[`INSTRUCTION_OP]==`EXEC)
|
if (IsExec(insn0))
|
insln0 <= fnInsLength(codebuf0);
|
insln0 <= fnInsLength(codebuf0); //???? should be 4?
|
else
|
else
|
insln0 <= fnInsLength(insn0);
|
insln0 <= fnInsLength(insn0);
|
end
|
end
|
|
|
|
|
Line 484... |
Line 511... |
cinsn0 <= expand0;
|
cinsn0 <= expand0;
|
else if (insn0[5:0]==`CMPRSSD && !pred_on)
|
else if (insn0[5:0]==`CMPRSSD && !pred_on)
|
cinsn0 <= expand0;
|
cinsn0 <= expand0;
|
else
|
else
|
`endif
|
`endif
|
if (insn0[7:6]==2'b00 && insn0[`INSTRUCTION_OP]==`EXEC && !pred_on)
|
if (IsExec(insn0) && !pred_on)
|
cinsn0 <= codebuf0;
|
cinsn0 <= codebuf0;
|
else if (insn0[15:14]==2'b00 && insn0[`INSTRUCTION_OP]==`EXEC && pred_on)
|
else if (IsExec(insn0[55:8]) && pred_on)
|
cinsn0 <= codebuf0;
|
cinsn0 <= codebuf0;
|
else if (insn0[15] & pred_on)
|
else if (insn0[15] & pred_on)
|
cinsn0 <= {xinsn0,insn0[7:0]};
|
cinsn0 <= {xinsn0,insn0[7:0]};
|
else if (insn0[7] & ~pred_on)
|
else if (insn0[7] & ~pred_on)
|
cinsn0 <= xinsn0;
|
cinsn0 <= xinsn0;
|