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

Subversion Repositories thor

[/] [thor/] [trunk/] [FT64v5/] [rtl/] [twoway/] [FT64_fetchbuf.v] - Diff between revs 52 and 55

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

Rev 52 Rev 55
Line 32... Line 32...
// do nothing (kinda like alpha approach)
// do nothing (kinda like alpha approach)
// Like to turn this into an independent module at some point.
// Like to turn this into an independent module at some point.
//
//
module FT64_fetchbuf(rst, clk4x, clk, fcu_clk,
module FT64_fetchbuf(rst, clk4x, clk, fcu_clk,
        cs_i, cyc_i, stb_i, ack_o, we_i, adr_i, dat_i,
        cs_i, cyc_i, stb_i, ack_o, we_i, adr_i, dat_i,
 
        cmpgrp,
        freezePC, thread_en,
        freezePC, thread_en,
        regLR,
        regLR,
    insn0, insn1, phit,
    insn0, insn1, phit,
    threadx,
    threadx,
    branchmiss, misspc, branchmiss_thrd, predict_taken0, predict_taken1,
    branchmiss, misspc, branchmiss_thrd, predict_taken0, predict_taken1,
Line 70... Line 71...
input stb_i;
input stb_i;
output ack_o;
output ack_o;
input we_i;
input we_i;
input [15:0] adr_i;
input [15:0] adr_i;
input [31:0] dat_i;
input [31:0] dat_i;
 
input [2:0] cmpgrp;
input freezePC;
input freezePC;
input thread_en;
input thread_en;
input [4:0] regLR;
input [4:0] regLR;
input [47:0] insn0;
input [47:0] insn0;
input [47:0] insn1;
input [47:0] insn1;
Line 162... Line 164...
IsRTI = isn[`INSTRUCTION_OP]==`R2 && isn[`INSTRUCTION_S2]==`RTI;
IsRTI = isn[`INSTRUCTION_OP]==`R2 && isn[`INSTRUCTION_S2]==`RTI;
endfunction
endfunction
 
 
function [3:0] fnInsLength;
function [3:0] fnInsLength;
input [47:0] ins;
input [47:0] ins;
 
if (ins[`INSTRUCTION_OP]==`CMPRSSD)
 
        fnInsLength = 4'd2;
 
else
case(ins[7:6])
case(ins[7:6])
2'd0:   fnInsLength = 4'd4;
2'd0:   fnInsLength = 4'd4;
2'd1:   fnInsLength = 4'd6;
2'd1:   fnInsLength = 4'd6;
default:        fnInsLength = 4'd2;
default:        fnInsLength = 4'd2;
endcase
endcase
Line 189... Line 194...
 
 
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
// Table of decompressed instructions.
// Table of decompressed instructions.
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
assign ack_o = cs_i & cyc_i & stb_i;
assign ack_o = cs_i & cyc_i & stb_i;
reg [47:0] DecompressTable [0:1023];
reg [47:0] DecompressTable [0:2047];
always @(posedge clk)
always @(posedge clk)
        if (cs_i & cyc_i & stb_i & we_i)
        if (cs_i & cyc_i & stb_i & we_i)
                DecompressTable[adr_i[11:2]] <= dat_i;
                DecompressTable[adr_i[12:3]] <= dat_i;
wire [47:0] expand0 = DecompressTable[insn0[15:6]];
wire [47:0] expand0 = DecompressTable[{cmpgrp,insn0[15:8]}];
wire [47:0] expand1 = DecompressTable[insn1[15:6]];
wire [47:0] expand1 = DecompressTable[{cmpgrp,insn1[15:8]}];
 
 
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
 
 
reg thread;
reg thread;
Line 796... Line 801...
assign fetchbuf0_thrd  = 1'b0;
assign fetchbuf0_thrd  = 1'b0;
assign fetchbuf1_thrd  = thread_en;
assign fetchbuf1_thrd  = thread_en;
 
 
always @*
always @*
begin
begin
        if (insn0[7:6]==2'b00 && insn0[`INSTRUCTION_OP]==`EXEC)
        if (insn0[5:0]==`CMPRSSD)
 
                fetchbuf0_insln <= 4'd2;
 
        else if (insn0[7:6]==2'b00 && insn0[`INSTRUCTION_OP]==`EXEC)
                fetchbuf0_insln <= fnInsLength(codebuf0);
                fetchbuf0_insln <= fnInsLength(codebuf0);
        else
        else
                fetchbuf0_insln <= fnInsLength(insn0);
                fetchbuf0_insln <= fnInsLength(insn0);
end
end
 
 
always @*
always @*
begin
begin
        if (insn1[7:6]==2'b00 && insn1[`INSTRUCTION_OP]==`EXEC)
        if (insn1[5:0]==`CMPRSSD)
 
                fetchbuf1_insln <= 4'd2;
 
        else if (insn1[7:6]==2'b00 && insn1[`INSTRUCTION_OP]==`EXEC)
                fetchbuf1_insln <= fnInsLength(codebuf1);
                fetchbuf1_insln <= fnInsLength(codebuf1);
        else
        else
                fetchbuf1_insln <= fnInsLength(insn1);
                fetchbuf1_insln <= fnInsLength(insn1);
end
end
 
 
reg [47:0] cinsn0, cinsn1;
reg [47:0] cinsn0, cinsn1;
 
 
always @*
always @*
begin
begin
        if (insn0[7:6]==2'b00 && insn0[`INSTRUCTION_OP]==`EXEC)
        if (insn0[5:0]==`CMPRSSD)
 
                cinsn0 <= expand0;
 
        else if (insn0[7:6]==2'b00 && insn0[`INSTRUCTION_OP]==`EXEC)
                cinsn0 <= codebuf0;
                cinsn0 <= codebuf0;
        else if (insn0[7])
        else if (insn0[7])
                cinsn0 <= xinsn0;
                cinsn0 <= xinsn0;
        else
        else
                cinsn0 <= insn0;
                cinsn0 <= insn0;
end
end
 
 
always @*
always @*
begin
begin
        if (insn1[7:6]==2'b00 && insn1[`INSTRUCTION_OP]==`EXEC)
        if (insn1[5:0]==`CMPRSSD)
 
                cinsn1 <= expand1;
 
        else if (insn1[7:6]==2'b00 && insn1[`INSTRUCTION_OP]==`EXEC)
                cinsn1 <= codebuf1;
                cinsn1 <= codebuf1;
        else if (insn1[7])
        else if (insn1[7])
                cinsn1 <= xinsn1;
                cinsn1 <= xinsn1;
        else
        else
                cinsn1 <= insn1;
                cinsn1 <= insn1;

powered by: WebSVN 2.1.0

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