Line 36... |
Line 36... |
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
|
|
module FT64_L1_icache_mem(rst, clk, wr, en, lineno, i, o, ov, invall, invline);
|
module FT64_L1_icache_mem(rst, clk, wr, en, lineno, i, o, ov, invall, invline);
|
parameter pLines = 64;
|
parameter pLines = 64;
|
parameter pLineWidth = 288;
|
parameter pLineWidth = 288;
|
|
localparam pLNMSB = pLines==128 ? 6 : 5;
|
input rst;
|
input rst;
|
input clk;
|
input clk;
|
input wr;
|
input wr;
|
input [8:0] en;
|
input [8:0] en;
|
input [5:0] lineno;
|
input [pLNMSB:0] lineno;
|
input [pLineWidth-1:0] i;
|
input [pLineWidth-1:0] i;
|
output [pLineWidth-1:0] o;
|
output [pLineWidth-1:0] o;
|
output [8:0] ov;
|
output [8:0] ov;
|
input invall;
|
input invall;
|
input invline;
|
input invline;
|
Line 189... |
Line 190... |
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
// Four way set associative tag memory for L1 cache.
|
// Four way set associative tag memory for L1 cache.
|
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
|
|
module FT64_L1_icache_cmptag4way(rst, clk, nxt, wr, adr, lineno, hit);
|
module FT64_L1_icache_cmptag4way(rst, clk, nxt, wr, adr, lineno, hit);
|
|
parameter pLines = 64;
|
|
localparam pLNMSB = pLines==128 ? 6 : 5;
|
|
localparam pMSB = pLines==128 ? 9 : 8;
|
input rst;
|
input rst;
|
input clk;
|
input clk;
|
input nxt;
|
input nxt;
|
input wr;
|
input wr;
|
input [37:0] adr;
|
input [37:0] adr;
|
output reg [5:0] lineno;
|
output reg [pLNMSB:0] lineno;
|
output hit;
|
output hit;
|
|
|
(* ram_style="distributed" *)
|
(* ram_style="distributed" *)
|
reg [32:0] mem0 [0:15];
|
reg [32:0] mem0 [0:pLines/4-1];
|
reg [32:0] mem1 [0:15];
|
reg [32:0] mem1 [0:pLines/4-1];
|
reg [32:0] mem2 [0:15];
|
reg [32:0] mem2 [0:pLines/4-1];
|
reg [32:0] mem3 [0:15];
|
reg [32:0] mem3 [0:pLines/4-1];
|
reg [37:0] rradr;
|
reg [37:0] rradr;
|
integer n;
|
integer n;
|
initial begin
|
initial begin
|
for (n = 0; n < 16; n = n + 1)
|
for (n = 0; n < pLines/4; n = n + 1)
|
begin
|
begin
|
mem0[n] = 0;
|
mem0[n] = 0;
|
mem1[n] = 0;
|
mem1[n] = 0;
|
mem2[n] = 0;
|
mem2[n] = 0;
|
mem3[n] = 0;
|
mem3[n] = 0;
|
Line 223... |
Line 227... |
if (rst)
|
if (rst)
|
wlineno <= 6'h00;
|
wlineno <= 6'h00;
|
else begin
|
else begin
|
if (wr) begin
|
if (wr) begin
|
case(lfsro[1:0])
|
case(lfsro[1:0])
|
2'b00: begin mem0[adr[8:5]] <= adr[37:5]; wlineno <= {2'b00,adr[8:5]}; end
|
2'b00: begin mem0[adr[pMSB:5]] <= adr[37:5]; wlineno <= {2'b00,adr[pMSB:5]}; end
|
2'b01: begin mem1[adr[8:5]] <= adr[37:5]; wlineno <= {2'b01,adr[8:5]}; end
|
2'b01: begin mem1[adr[pMSB:5]] <= adr[37:5]; wlineno <= {2'b01,adr[pMSB:5]}; end
|
2'b10: begin mem2[adr[8:5]] <= adr[37:5]; wlineno <= {2'b10,adr[8:5]}; end
|
2'b10: begin mem2[adr[pMSB:5]] <= adr[37:5]; wlineno <= {2'b10,adr[pMSB:5]}; end
|
2'b11: begin mem3[adr[8:5]] <= adr[37:5]; wlineno <= {2'b11,adr[8:5]}; end
|
2'b11: begin mem3[adr[pMSB:5]] <= adr[37:5]; wlineno <= {2'b11,adr[pMSB:5]}; end
|
endcase
|
endcase
|
end
|
end
|
end
|
end
|
|
|
wire hit0 = mem0[adr[8:5]]==adr[37:5];
|
wire hit0 = mem0[adr[pMSB:5]]==adr[37:5];
|
wire hit1 = mem1[adr[8:5]]==adr[37:5];
|
wire hit1 = mem1[adr[pMSB:5]]==adr[37:5];
|
wire hit2 = mem2[adr[8:5]]==adr[37:5];
|
wire hit2 = mem2[adr[pMSB:5]]==adr[37:5];
|
wire hit3 = mem3[adr[8:5]]==adr[37:5];
|
wire hit3 = mem3[adr[pMSB:5]]==adr[37:5];
|
always @*
|
always @*
|
//if (wr2) lineno = wlineno;
|
//if (wr2) lineno = wlineno;
|
if (hit0) lineno = {2'b00,adr[8:5]};
|
if (hit0) lineno = {2'b00,adr[pMSB:5]};
|
else if (hit1) lineno = {2'b01,adr[8:5]};
|
else if (hit1) lineno = {2'b01,adr[pMSB:5]};
|
else if (hit2) lineno = {2'b10,adr[8:5]};
|
else if (hit2) lineno = {2'b10,adr[pMSB:5]};
|
else lineno = {2'b11,adr[8:5]};
|
else lineno = {2'b11,adr[pMSB:5]};
|
assign hit = hit0|hit1|hit2|hit3;
|
assign hit = hit0|hit1|hit2|hit3;
|
endmodule
|
endmodule
|
|
|
|
|
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
Line 301... |
Line 305... |
|
|
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
|
|
module FT64_L1_icache(rst, clk, nxt, wr, wr_ack, en, wadr, adr, i, o, hit, invall, invline);
|
module FT64_L1_icache(rst, clk, nxt, wr, wr_ack, en, wadr, adr, i, o, hit, invall, invline);
|
|
parameter pSize = 2;
|
parameter CAMTAGS = 1'b0; // 32 way
|
parameter CAMTAGS = 1'b0; // 32 way
|
parameter FOURWAY = 1'b1;
|
parameter FOURWAY = 1'b1;
|
|
localparam pLines = pSize==4 ? 128 : 64;
|
|
localparam pLNMSB = pSize==4 ? 6 : 5;
|
input rst;
|
input rst;
|
input clk;
|
input clk;
|
input nxt;
|
input nxt;
|
input wr;
|
input wr;
|
output wr_ack;
|
output wr_ack;
|
Line 320... |
Line 327... |
input invline;
|
input invline;
|
|
|
wire [287:0] ic;
|
wire [287:0] ic;
|
reg [287:0] i1, i2;
|
reg [287:0] i1, i2;
|
wire [8:0] lv; // line valid
|
wire [8:0] lv; // line valid
|
wire [5:0] lineno;
|
wire [pLNMSB:0] lineno;
|
wire [5:0] wlineno;
|
wire [pLNMSB:0] wlineno;
|
wire taghit;
|
wire taghit;
|
reg wr1,wr2;
|
reg wr1,wr2;
|
reg [8:0] en1, en2;
|
reg [8:0] en1, en2;
|
reg invline1, invline2;
|
reg invline1, invline2;
|
|
|
Line 349... |
Line 356... |
invline2 <= invline1;
|
invline2 <= invline1;
|
|
|
generate begin : tags
|
generate begin : tags
|
if (FOURWAY) begin
|
if (FOURWAY) begin
|
|
|
FT64_L1_icache_mem u1
|
FT64_L1_icache_mem #(.pLines(pLines)) u1
|
(
|
(
|
.rst(rst),
|
.rst(rst),
|
.clk(clk),
|
.clk(clk),
|
.wr(wr1),
|
.wr(wr1),
|
.en(en1),
|
.en(en1),
|
Line 363... |
Line 370... |
.ov(lv),
|
.ov(lv),
|
.invall(invall),
|
.invall(invall),
|
.invline(invline1)
|
.invline(invline1)
|
);
|
);
|
|
|
FT64_L1_icache_cmptag4way u3
|
FT64_L1_icache_cmptag4way #(.pLines(pLines)) u3
|
(
|
(
|
.rst(rst),
|
.rst(rst),
|
.clk(clk),
|
.clk(clk),
|
.nxt(nxt),
|
.nxt(nxt),
|
.wr(wr),
|
.wr(wr),
|