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

Subversion Repositories thor

[/] [thor/] [trunk/] [FT64v5/] [rtl/] [common/] [FT64_cache.v] - Diff between revs 57 and 58

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

Rev 57 Rev 58
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),

powered by: WebSVN 2.1.0

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