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;
|