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

Subversion Repositories thor

[/] [thor/] [trunk/] [FT64v7/] [rtl/] [twoway/] [FT64_fetchbuf_x1.v] - Diff between revs 60 and 61

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

Rev 60 Rev 61
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;

powered by: WebSVN 2.1.0

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