Line 35... |
Line 35... |
// within a single clock cycle.
|
// within a single clock cycle.
|
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
|
|
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 = 320;
|
parameter pLineWidth = 288;
|
input rst;
|
input rst;
|
input clk;
|
input clk;
|
input wr;
|
input wr;
|
input [9:0] en;
|
input [8:0] en;
|
input [5:0] lineno;
|
input [5:0] lineno;
|
input [pLineWidth-1:0] i;
|
input [pLineWidth-1:0] i;
|
output [pLineWidth-1:0] o;
|
output [pLineWidth-1:0] o;
|
output [9:0] ov;
|
output [8:0] ov;
|
input invall;
|
input invall;
|
input invline;
|
input invline;
|
|
|
|
(* ram_style="distributed" *)
|
reg [pLineWidth-1:0] mem [0:pLines-1];
|
reg [pLineWidth-1:0] mem [0:pLines-1];
|
reg [pLines-1:0] valid0;
|
reg [pLines-1:0] valid0;
|
reg [pLines-1:0] valid1;
|
reg [pLines-1:0] valid1;
|
reg [pLines-1:0] valid2;
|
reg [pLines-1:0] valid2;
|
reg [pLines-1:0] valid3;
|
reg [pLines-1:0] valid3;
|
reg [pLines-1:0] valid4;
|
reg [pLines-1:0] valid4;
|
reg [pLines-1:0] valid5;
|
reg [pLines-1:0] valid5;
|
reg [pLines-1:0] valid6;
|
reg [pLines-1:0] valid6;
|
reg [pLines-1:0] valid7;
|
reg [pLines-1:0] valid7;
|
reg [pLines-1:0] valid8;
|
reg [pLines-1:0] valid8;
|
reg [pLines-1:0] valid9;
|
|
|
|
always @(posedge clk)
|
always @(posedge clk)
|
if (wr & en[0]) mem[lineno][31:0] <= i[31:0];
|
if (wr & en[0]) mem[lineno][31:0] <= i[31:0];
|
always @(posedge clk)
|
always @(posedge clk)
|
if (wr & en[1]) mem[lineno][63:32] <= i[63:32];
|
if (wr & en[1]) mem[lineno][63:32] <= i[63:32];
|
Line 78... |
Line 78... |
always @(posedge clk)
|
always @(posedge clk)
|
if (wr & en[7]) mem[lineno][255:224] <= i[255:224];
|
if (wr & en[7]) mem[lineno][255:224] <= i[255:224];
|
always @(posedge clk)
|
always @(posedge clk)
|
if (wr & en[8]) mem[lineno][287:256] <= i[287:256];
|
if (wr & en[8]) mem[lineno][287:256] <= i[287:256];
|
always @(posedge clk)
|
always @(posedge clk)
|
if (wr & en[9]) mem[lineno][319:288] <= i[319:288];
|
|
always @(posedge clk)
|
|
if (rst) begin
|
if (rst) begin
|
valid0 <= 64'd0;
|
valid0 <= 64'd0;
|
valid1 <= 64'd0;
|
valid1 <= 64'd0;
|
valid2 <= 64'd0;
|
valid2 <= 64'd0;
|
valid3 <= 64'd0;
|
valid3 <= 64'd0;
|
valid4 <= 64'd0;
|
valid4 <= 64'd0;
|
valid5 <= 64'd0;
|
valid5 <= 64'd0;
|
valid6 <= 64'd0;
|
valid6 <= 64'd0;
|
valid7 <= 64'd0;
|
valid7 <= 64'd0;
|
valid8 <= 64'd0;
|
valid8 <= 64'd0;
|
valid9 <= 64'd0;
|
|
end
|
end
|
else begin
|
else begin
|
if (invall) begin
|
if (invall) begin
|
valid0 <= 64'd0;
|
valid0 <= 64'd0;
|
valid1 <= 64'd0;
|
valid1 <= 64'd0;
|
Line 103... |
Line 100... |
valid4 <= 64'd0;
|
valid4 <= 64'd0;
|
valid5 <= 64'd0;
|
valid5 <= 64'd0;
|
valid6 <= 64'd0;
|
valid6 <= 64'd0;
|
valid7 <= 64'd0;
|
valid7 <= 64'd0;
|
valid8 <= 64'd0;
|
valid8 <= 64'd0;
|
valid9 <= 64'd0;
|
|
end
|
end
|
else if (invline) begin
|
else if (invline) begin
|
valid0[lineno] <= 1'b0;
|
valid0[lineno] <= 1'b0;
|
valid1[lineno] <= 1'b0;
|
valid1[lineno] <= 1'b0;
|
valid2[lineno] <= 1'b0;
|
valid2[lineno] <= 1'b0;
|
Line 115... |
Line 111... |
valid4[lineno] <= 1'b0;
|
valid4[lineno] <= 1'b0;
|
valid5[lineno] <= 1'b0;
|
valid5[lineno] <= 1'b0;
|
valid6[lineno] <= 1'b0;
|
valid6[lineno] <= 1'b0;
|
valid7[lineno] <= 1'b0;
|
valid7[lineno] <= 1'b0;
|
valid8[lineno] <= 1'b0;
|
valid8[lineno] <= 1'b0;
|
valid9[lineno] <= 1'b0;
|
|
end
|
end
|
else if (wr) begin
|
else if (wr) begin
|
if (en[0]) valid0[lineno] <= 1'b1;
|
if (en[0]) valid0[lineno] <= 1'b1;
|
if (en[1]) valid1[lineno] <= 1'b1;
|
if (en[1]) valid1[lineno] <= 1'b1;
|
if (en[2]) valid2[lineno] <= 1'b1;
|
if (en[2]) valid2[lineno] <= 1'b1;
|
Line 127... |
Line 122... |
if (en[4]) valid4[lineno] <= 1'b1;
|
if (en[4]) valid4[lineno] <= 1'b1;
|
if (en[5]) valid5[lineno] <= 1'b1;
|
if (en[5]) valid5[lineno] <= 1'b1;
|
if (en[6]) valid6[lineno] <= 1'b1;
|
if (en[6]) valid6[lineno] <= 1'b1;
|
if (en[7]) valid7[lineno] <= 1'b1;
|
if (en[7]) valid7[lineno] <= 1'b1;
|
if (en[8]) valid8[lineno] <= 1'b1;
|
if (en[8]) valid8[lineno] <= 1'b1;
|
if (en[9]) valid9[lineno] <= 1'b1;
|
|
end
|
end
|
end
|
end
|
|
|
assign o = mem[lineno];
|
assign o = mem[lineno];
|
assign ov[0] = valid0[lineno];
|
assign ov[0] = valid0[lineno];
|
Line 141... |
Line 135... |
assign ov[4] = valid4[lineno];
|
assign ov[4] = valid4[lineno];
|
assign ov[5] = valid5[lineno];
|
assign ov[5] = valid5[lineno];
|
assign ov[6] = valid6[lineno];
|
assign ov[6] = valid6[lineno];
|
assign ov[7] = valid7[lineno];
|
assign ov[7] = valid7[lineno];
|
assign ov[8] = valid8[lineno];
|
assign ov[8] = valid8[lineno];
|
assign ov[9] = valid9[lineno];
|
|
|
|
endmodule
|
endmodule
|
|
|
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
// Fully associative (64 way) tag memory for L1 icache.
|
// Fully associative (64 way) tag memory for L1 icache.
|
Line 204... |
Line 197... |
input wr;
|
input wr;
|
input [37:0] adr;
|
input [37:0] adr;
|
output reg [5:0] lineno;
|
output reg [5:0] lineno;
|
output hit;
|
output hit;
|
|
|
|
(* ram_style="distributed" *)
|
reg [32:0] mem0 [0:15];
|
reg [32:0] mem0 [0:15];
|
reg [32:0] mem1 [0:15];
|
reg [32:0] mem1 [0:15];
|
reg [32:0] mem2 [0:15];
|
reg [32:0] mem2 [0:15];
|
reg [32:0] mem3 [0:15];
|
reg [32:0] mem3 [0:15];
|
reg [37:0] rradr;
|
reg [37:0] rradr;
|
Line 313... |
Line 307... |
parameter FOURWAY = 1'b1;
|
parameter FOURWAY = 1'b1;
|
input rst;
|
input rst;
|
input clk;
|
input clk;
|
input nxt;
|
input nxt;
|
input wr;
|
input wr;
|
input [9:0] en;
|
input [8:0] en;
|
input [37:0] adr;
|
input [37:0] adr;
|
input [37:0] wadr;
|
input [37:0] wadr;
|
input [319:0] i;
|
input [287:0] i;
|
output reg [47:0] o;
|
output reg [47:0] o;
|
output hit;
|
output hit;
|
input invall;
|
input invall;
|
input invline;
|
input invline;
|
|
|
wire [319:0] ic;
|
wire [287:0] ic;
|
reg [319:0] i1, i2;
|
reg [287:0] i1, i2;
|
wire [9:0] lv; // line valid
|
wire [8:0] lv; // line valid
|
wire [5:0] lineno;
|
wire [5:0] lineno;
|
wire [5:0] wlineno;
|
wire [5:0] wlineno;
|
wire taghit;
|
wire taghit;
|
reg wr1,wr2;
|
reg wr1,wr2;
|
reg [9:0] en1, en2;
|
reg [8:0] en1, en2;
|
reg invline1, invline2;
|
reg invline1, invline2;
|
|
|
// Must update the cache memory on the cycle after a write to the tag memmory.
|
// Must update the cache memory on the cycle after a write to the tag memmory.
|
// Otherwise lineno won't be valid. Tag memory takes two clock cycles to update.
|
// Otherwise lineno won't be valid. Tag memory takes two clock cycles to update.
|
always @(posedge clk)
|
always @(posedge clk)
|
wr1 <= wr;
|
wr1 <= wr;
|
always @(posedge clk)
|
always @(posedge clk)
|
wr2 <= wr1;
|
wr2 <= wr1;
|
always @(posedge clk)
|
always @(posedge clk)
|
i1 <= i;
|
i1 <= i[287:0];
|
always @(posedge clk)
|
always @(posedge clk)
|
i2 <= i1;
|
i2 <= i1;
|
always @(posedge clk)
|
always @(posedge clk)
|
en1 <= en;
|
en1 <= en;
|
always @(posedge clk)
|
always @(posedge clk)
|
Line 439... |
Line 433... |
input clk;
|
input clk;
|
input wr;
|
input wr;
|
input [8:0] lineno;
|
input [8:0] lineno;
|
input [2:0] sel;
|
input [2:0] sel;
|
input [63:0] i;
|
input [63:0] i;
|
output [319:0] o;
|
output [287:0] o;
|
output reg ov;
|
output reg ov;
|
input invall;
|
input invall;
|
input invline;
|
input invline;
|
|
|
|
(* ram_style="block" *)
|
reg [63:0] mem0 [0:511];
|
reg [63:0] mem0 [0:511];
|
reg [63:0] mem1 [0:511];
|
reg [63:0] mem1 [0:511];
|
reg [63:0] mem2 [0:511];
|
reg [63:0] mem2 [0:511];
|
reg [63:0] mem3 [0:511];
|
reg [63:0] mem3 [0:511];
|
reg [63:0] mem4 [0:511];
|
reg [31:0] mem4 [0:511];
|
reg [511:0] valid;
|
reg [511:0] valid;
|
reg [8:0] rrcl;
|
reg [8:0] rrcl;
|
|
|
// instruction parcels per cache line
|
// instruction parcels per cache line
|
wire [8:0] cache_line;
|
wire [8:0] cache_line;
|
Line 473... |
Line 468... |
case(sel[2:0])
|
case(sel[2:0])
|
3'd0: mem0[lineno] <= i;
|
3'd0: mem0[lineno] <= i;
|
3'd1: mem1[lineno] <= i;
|
3'd1: mem1[lineno] <= i;
|
3'd2: mem2[lineno] <= i;
|
3'd2: mem2[lineno] <= i;
|
3'd3: mem3[lineno] <= i;
|
3'd3: mem3[lineno] <= i;
|
3'd4: mem4[lineno] <= i;
|
3'd4: mem4[lineno] <= i[31:0];
|
endcase
|
endcase
|
end
|
end
|
end
|
end
|
|
|
always @(posedge clk)
|
always @(posedge clk)
|
Line 509... |
Line 504... |
input [37:0] adr;
|
input [37:0] adr;
|
input [2:0] cnt;
|
input [2:0] cnt;
|
input exv_i;
|
input exv_i;
|
input [63:0] i;
|
input [63:0] i;
|
input err_i;
|
input err_i;
|
output [319:0] o;
|
output [287:0] o;
|
output hit;
|
output hit;
|
input invall;
|
input invall;
|
input invline;
|
input invline;
|
|
|
wire lv; // line valid
|
wire lv; // line valid
|
Line 534... |
Line 529... |
always @(posedge clk)
|
always @(posedge clk)
|
sel2 <= sel1;
|
sel2 <= sel1;
|
// An exception is forced to be stored in the event of an error loading the
|
// An exception is forced to be stored in the event of an error loading the
|
// the instruction line.
|
// the instruction line.
|
always @(posedge clk)
|
always @(posedge clk)
|
i1 <= err_i ? {2{16'd0,1'b0,`FLT_IBE,`BRK}} : exv_i ? {2{16'd0,1'b0,`FLT_EXF,`BRK}} : i;
|
i1 <= err_i ? {2{15'd0,1'b0,`FLT_IBE,2'b00,`BRK}} : exv_i ? {2{15'd0,1'b0,`FLT_EXF,2'b00,`BRK}} : i;
|
always @(posedge clk)
|
always @(posedge clk)
|
i2 <= i1;
|
i2 <= i1;
|
|
|
wire pe_wr;
|
wire pe_wr;
|
edge_det u3 (.rst(rst), .clk(clk), .ce(1'b1), .i(wr && cnt==3'd0), .pe(pe_wr), .ne(), .ee() );
|
edge_det u3 (.rst(rst), .clk(clk), .ce(1'b1), .i(wr && cnt==3'd0), .pe(pe_wr), .ne(), .ee() );
|
Line 604... |
Line 599... |
input wr;
|
input wr;
|
input [37:0] adr;
|
input [37:0] adr;
|
output reg [8:0] lineno;
|
output reg [8:0] lineno;
|
output hit;
|
output hit;
|
|
|
|
(* ram_style="block" *)
|
reg [32:0] mem0 [0:127];
|
reg [32:0] mem0 [0:127];
|
reg [32:0] mem1 [0:127];
|
reg [32:0] mem1 [0:127];
|
reg [32:0] mem2 [0:127];
|
reg [32:0] mem2 [0:127];
|
reg [32:0] mem3 [0:127];
|
reg [32:0] mem3 [0:127];
|
reg [37:0] rradr;
|
reg [37:0] rradr;
|