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

Subversion Repositories thor

[/] [thor/] [trunk/] [FT64v7/] [rtl/] [common/] [FT64_dcache.v] - Diff between revs 60 and 66

Only display areas with differences | Details | Blame | View Log

Rev 60 Rev 66
// ============================================================================
// ============================================================================
//        __
//        __
//   \\__/ o\    (C) 2018  Robert Finch, Waterloo
//   \\__/ o\    (C) 2018-2019  Robert Finch, Waterloo
//    \  __ /    All rights reserved.
//    \  __ /    All rights reserved.
//     \/_//     robfinch<remove>@finitron.ca
//     \/_//     robfinch<remove>@finitron.ca
//       ||
//       ||
//
//
//      FT64_dcache.v
//      FT64_dcache.v
//      - a simple direct mapped cache
//      - a simple direct mapped cache
//      - three cycle latency
//      - three cycle latency
//              
//              
//
//
// This source file is free software: you can redistribute it and/or modify 
// This source file is free software: you can redistribute it and/or modify 
// it under the terms of the GNU Lesser General Public License as published 
// it under the terms of the GNU Lesser General Public License as published 
// by the Free Software Foundation, either version 3 of the License, or     
// by the Free Software Foundation, either version 3 of the License, or     
// (at your option) any later version.                                      
// (at your option) any later version.                                      
//                                                                          
//                                                                          
// This source file is distributed in the hope that it will be useful,      
// This source file is distributed in the hope that it will be useful,      
// but WITHOUT ANY WARRANTY; without even the implied warranty of           
// but WITHOUT ANY WARRANTY; without even the implied warranty of           
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            
// GNU General Public License for more details.                             
// GNU General Public License for more details.                             
//                                                                          
//                                                                          
// You should have received a copy of the GNU General Public License        
// You should have received a copy of the GNU General Public License        
// along with this program.  If not, see <http://www.gnu.org/licenses/>.    
// along with this program.  If not, see <http://www.gnu.org/licenses/>.    
//                                                                          
//                                                                          
//
//
// ============================================================================
// ============================================================================
//
//
module FT64_dcache(rst, dce, wclk, wr, sel, wadr, whit, i, li, rclk, rdsize, radr, o, lo, rhit);
module FT64_dcache(rst, dce, wclk, wr, sel, wadr, whit, i, li, rclk, rdsize, radr, o, lo, rhit);
input rst;
input rst;
input dce;                                      // data cache enable
input dce;                                      // data cache enable
input wclk;
input wclk;
input wr;
input wr;
input [7:0] sel;
input [31:0] sel;
input [37:0] wadr;
input [37:0] wadr;
output whit;
output whit;
input [63:0] i;
input [255:0] i;
input [255:0] li;                // line input
input [255:0] li;                // line input
input rclk;
input rclk;
input [2:0] rdsize;
input [2:0] rdsize;
input [37:0] radr;
input [37:0] radr;
output reg [63:0] o;
output reg [63:0] o;
output reg [255:0] lo;   // line out
output reg [255:0] lo;   // line out
output reg rhit;
output reg rhit;
parameter byt = 3'd0;
parameter byt = 3'd0;
parameter wyde = 3'd1;
parameter wyde = 3'd1;
parameter tetra = 3'd2;
parameter tetra = 3'd2;
parameter octa = 3'd3;
parameter octa = 3'd3;
 
 
wire [255:0] dc;
wire [255:0] dc;
wire [31:0] v;
wire [31:0] v;
wire rhita;
wire rhita;
 
 
dcache_mem u1 (
dcache_mem u1 (
  .rst(rst),
  .rst(rst),
  .clka(wclk),
  .clka(wclk),
  .ena(dce & wr),
  .ena(dce & wr),
  .wea(sel),
  .wea(sel),
  .addra(wadr[13:0]),
  .addra(wadr[13:0]),
  .dina(i),
  .dina(i),
  .clkb(rclk),
  .clkb(rclk),
  .enb(dce),
  .enb(dce),
  .addrb(radr[13:0]),
  .addrb(radr[13:0]),
  .doutb(dc),
  .doutb(dc),
  .ov(v)
  .ov(v)
);
);
 
 
FT64_dcache_tag u3
FT64_dcache_tag u3
(
(
  .wclk(wclk),
  .wclk(wclk),
  .dce(dce),
  .dce(dce),
  .wr(wr && wadr[4:3]==2'b11),
  .wr(wr),
  .wadr(wadr),
  .wadr(wadr),
  .rclk(rclk),
  .rclk(rclk),
  .radr(radr),
  .radr(radr),
  .whit(whit),
  .whit(whit),
  .rhit(rhita)
  .rhit(rhita)
);
);
 
 
wire [7:0] va = v >> radr[4:0];
wire [7:0] va = v >> radr[4:0];
always @(posedge rclk)
always @(posedge rclk)
begin
begin
case(rdsize)
case(rdsize)
byt:    rhit <= rhita &  va[  0];
byt:    rhit <= rhita &  va[  0];
wyde:   rhit <= rhita & &va[1:0];
wyde:   rhit <= rhita & &va[1:0];
tetra:  rhit <= rhita & &va[3:0];
tetra:  rhit <= rhita & &va[3:0];
default:rhit <= rhita & &va[7:0];
default:rhit <= rhita & &va[7:0];
endcase
endcase
end
end
 
 
// hit is also delayed by a clock already
// hit is also delayed by a clock already
always @(posedge rclk)
always @(posedge rclk)
        lo <= dc;
        lo <= dc;
always @(posedge rclk)
always @(posedge rclk)
  o <= dc >> {radr[4:3],6'b0};
  o <= dc >> {radr[4:3],6'b0};
 
 
endmodule
endmodule
 
 
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
 
 
module dcache_mem(rst, clka, ena, wea, addra, dina, clkb, enb, addrb, doutb, ov);
module dcache_mem(rst, clka, ena, wea, addra, dina, clkb, enb, addrb, doutb, ov);
input rst;
input rst;
input clka;
input clka;
input ena;
input ena;
input [7:0] wea;
input [31:0] wea;
input [13:0] addra;
input [13:0] addra;
input [63:0] dina;
input [255:0] dina;
input clkb;
input clkb;
input enb;
input enb;
input [13:0] addrb;
input [13:0] addrb;
output reg [255:0] doutb;
output reg [255:0] doutb;
output reg [31:0] ov;
output reg [31:0] ov;
 
 
reg [255:0] mem [0:511];
reg [255:0] mem [0:511];
reg [31:0] valid [0:511];
reg [31:0] valid [0:511];
reg [255:0] doutb1;
reg [255:0] doutb1;
reg [31:0] ov1;
reg [31:0] ov1;
 
 
integer n;
integer n;
 
 
initial begin
initial begin
  for (n = 0; n < 512; n = n + 1)
  for (n = 0; n < 512; n = n + 1)
    valid[n] = 32'h00;
    valid[n] = 32'h00;
end
end
 
 
genvar g;
genvar g;
generate begin
generate begin
for (g = 0; g < 4; g = g + 1)
for (g = 0; g < 32; g = g + 1)
always @(posedge clka)
always @(posedge clka)
begin
begin
  if (ena & wea[0] & addra[4:3]==g)  mem[addra[13:5]][g*64+7:g*64] <= dina[7:0];
  if (ena & wea[g])  mem[addra[13:5]][g*8+7:g*8] <= dina[g*8+7:g*8];
  if (ena & wea[1] & addra[4:3]==g)  mem[addra[13:5]][g*64+15:g*64+8] <= dina[15:8];
  if (ena & wea[g])  valid[addra[13:5]][g] <= 1'b1;
  if (ena & wea[2] & addra[4:3]==g)  mem[addra[13:5]][g*64+23:g*64+16] <= dina[23:16];
 
  if (ena & wea[3] & addra[4:3]==g)  mem[addra[13:5]][g*64+31:g*64+24] <= dina[31:24];
 
  if (ena & wea[4] & addra[4:3]==g)  mem[addra[13:5]][g*64+39:g*64+32] <= dina[39:32];
 
  if (ena & wea[5] & addra[4:3]==g)  mem[addra[13:5]][g*64+47:g*64+40] <= dina[47:40];
 
  if (ena & wea[6] & addra[4:3]==g)  mem[addra[13:5]][g*64+55:g*64+48] <= dina[55:48];
 
  if (ena & wea[7] & addra[4:3]==g)  mem[addra[13:5]][g*64+63:g*64+56] <= dina[63:56];
 
  if (ena & wea[0] & addra[4:3]==g)  valid[addra[13:5]][g*8] <= 1'b1;
 
  if (ena & wea[1] & addra[4:3]==g)  valid[addra[13:5]][g*8+1] <= 1'b1;
 
  if (ena & wea[2] & addra[4:3]==g)  valid[addra[13:5]][g*8+2] <= 1'b1;
 
  if (ena & wea[3] & addra[4:3]==g)  valid[addra[13:5]][g*8+3] <= 1'b1;
 
  if (ena & wea[4] & addra[4:3]==g)  valid[addra[13:5]][g*8+4] <= 1'b1;
 
  if (ena & wea[5] & addra[4:3]==g)  valid[addra[13:5]][g*8+5] <= 1'b1;
 
  if (ena & wea[6] & addra[4:3]==g)  valid[addra[13:5]][g*8+6] <= 1'b1;
 
  if (ena & wea[7] & addra[4:3]==g)  valid[addra[13:5]][g*8+7] <= 1'b1;
 
end
end
end
end
endgenerate
endgenerate
always @(posedge clkb)
always @(posedge clkb)
        if (enb)
        if (enb)
                doutb1 <= mem[addrb[13:5]];
                doutb1 <= mem[addrb[13:5]];
always @(posedge clkb)
always @(posedge clkb)
        if (enb)
        if (enb)
                doutb <= doutb1;
                doutb <= doutb1;
always @(posedge clkb)
always @(posedge clkb)
        if (enb)
        if (enb)
                ov1 <= valid[addrb[13:5]];
                ov1 <= valid[addrb[13:5]];
always @(posedge clkb)
always @(posedge clkb)
        if (enb)
        if (enb)
                ov <= ov1;
                ov <= ov1;
endmodule
endmodule
 
 
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
 
 
module FT64_dcache_tag(wclk, dce, wr, wadr, rclk, radr, whit, rhit);
module FT64_dcache_tag(wclk, dce, wr, wadr, rclk, radr, whit, rhit);
input wclk;
input wclk;
input dce;                                              // data cache enable
input dce;                                              // data cache enable
input wr;
input wr;
input [37:0] wadr;
input [37:0] wadr;
input rclk;
input rclk;
input [37:0] radr;
input [37:0] radr;
output reg whit;                        // write hit
output reg whit;                        // write hit
output reg rhit;                        // read hit
output reg rhit;                        // read hit
 
 
wire [31:0] rtago;
wire [31:0] rtago;
wire [31:0] wtago;
wire [31:0] wtago;
 
 
FT64_dcache_tag2 u1 (
FT64_dcache_tag2 u1 (
  .clka(wclk),
  .clka(wclk),
  .ena(dce),
  .ena(dce),
  .wea(wr),
  .wea(wr),
  .addra(wadr[13:5]),
  .addra(wadr[13:5]),
  .dina(wadr[37:14]),
  .dina(wadr[37:14]),
  .douta(wtago),
  .douta(wtago),
  .clkb(rclk),
  .clkb(rclk),
  .web(1'b0),
  .web(1'b0),
  .dinb(32'd0),
  .dinb(32'd0),
  .enb(dce),
  .enb(dce),
  .addrb(radr[13:5]),
  .addrb(radr[13:5]),
  .doutb(rtago)
  .doutb(rtago)
);
);
 
 
always @(posedge rclk)
always @(posedge rclk)
        rhit <= rtago[23:0]==radr[37:14];
        rhit <= rtago[23:0]==radr[37:14];
always @(posedge wclk)
always @(posedge wclk)
        whit <= wtago[23:0]==wadr[37:14];
        whit <= wtago[23:0]==wadr[37:14];
 
 
endmodule
endmodule
 
 
 
 

powered by: WebSVN 2.1.0

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