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

Subversion Repositories thor

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

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

Rev 48 Rev 49
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;

powered by: WebSVN 2.1.0

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