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

Subversion Repositories thor

[/] [thor/] [trunk/] [FT64v7/] [rtl/] [common/] [FT64_dcache.v] - Blame information for rev 66

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 60 robfinch
// ============================================================================
2
//        __
3 66 robfinch
//   \\__/ o\    (C) 2018-2019  Robert Finch, Waterloo
4 60 robfinch
//    \  __ /    All rights reserved.
5
//     \/_//     robfinch<remove>@finitron.ca
6
//       ||
7
//
8
//      FT64_dcache.v
9
//      - a simple direct mapped cache
10
//      - three cycle latency
11
//              
12
//
13
// This source file is free software: you can redistribute it and/or modify 
14
// it under the terms of the GNU Lesser General Public License as published 
15
// by the Free Software Foundation, either version 3 of the License, or     
16
// (at your option) any later version.                                      
17
//                                                                          
18
// This source file is distributed in the hope that it will be useful,      
19
// but WITHOUT ANY WARRANTY; without even the implied warranty of           
20
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            
21
// GNU General Public License for more details.                             
22
//                                                                          
23
// You should have received a copy of the GNU General Public License        
24
// along with this program.  If not, see <http://www.gnu.org/licenses/>.    
25
//                                                                          
26
//
27
// ============================================================================
28
//
29
module FT64_dcache(rst, dce, wclk, wr, sel, wadr, whit, i, li, rclk, rdsize, radr, o, lo, rhit);
30
input rst;
31
input dce;                                      // data cache enable
32
input wclk;
33
input wr;
34 66 robfinch
input [31:0] sel;
35 60 robfinch
input [37:0] wadr;
36
output whit;
37 66 robfinch
input [255:0] i;
38 60 robfinch
input [255:0] li;                // line input
39
input rclk;
40
input [2:0] rdsize;
41
input [37:0] radr;
42
output reg [63:0] o;
43
output reg [255:0] lo;   // line out
44
output reg rhit;
45
parameter byt = 3'd0;
46
parameter wyde = 3'd1;
47
parameter tetra = 3'd2;
48
parameter octa = 3'd3;
49
 
50
wire [255:0] dc;
51
wire [31:0] v;
52
wire rhita;
53
 
54
dcache_mem u1 (
55
  .rst(rst),
56
  .clka(wclk),
57
  .ena(dce & wr),
58
  .wea(sel),
59
  .addra(wadr[13:0]),
60
  .dina(i),
61
  .clkb(rclk),
62
  .enb(dce),
63
  .addrb(radr[13:0]),
64
  .doutb(dc),
65
  .ov(v)
66
);
67
 
68
FT64_dcache_tag u3
69
(
70
  .wclk(wclk),
71
  .dce(dce),
72 66 robfinch
  .wr(wr),
73 60 robfinch
  .wadr(wadr),
74
  .rclk(rclk),
75
  .radr(radr),
76
  .whit(whit),
77
  .rhit(rhita)
78
);
79
 
80
wire [7:0] va = v >> radr[4:0];
81
always @(posedge rclk)
82
begin
83
case(rdsize)
84
byt:    rhit <= rhita &  va[  0];
85
wyde:   rhit <= rhita & &va[1:0];
86
tetra:  rhit <= rhita & &va[3:0];
87
default:rhit <= rhita & &va[7:0];
88
endcase
89
end
90
 
91
// hit is also delayed by a clock already
92
always @(posedge rclk)
93
        lo <= dc;
94
always @(posedge rclk)
95
  o <= dc >> {radr[4:3],6'b0};
96
 
97
endmodule
98
 
99
// -----------------------------------------------------------------------------
100
// -----------------------------------------------------------------------------
101
 
102
module dcache_mem(rst, clka, ena, wea, addra, dina, clkb, enb, addrb, doutb, ov);
103
input rst;
104
input clka;
105
input ena;
106 66 robfinch
input [31:0] wea;
107 60 robfinch
input [13:0] addra;
108 66 robfinch
input [255:0] dina;
109 60 robfinch
input clkb;
110
input enb;
111
input [13:0] addrb;
112
output reg [255:0] doutb;
113
output reg [31:0] ov;
114
 
115
reg [255:0] mem [0:511];
116
reg [31:0] valid [0:511];
117
reg [255:0] doutb1;
118
reg [31:0] ov1;
119
 
120
integer n;
121
 
122
initial begin
123
  for (n = 0; n < 512; n = n + 1)
124
    valid[n] = 32'h00;
125
end
126
 
127
genvar g;
128
generate begin
129 66 robfinch
for (g = 0; g < 32; g = g + 1)
130 60 robfinch
always @(posedge clka)
131
begin
132 66 robfinch
  if (ena & wea[g])  mem[addra[13:5]][g*8+7:g*8] <= dina[g*8+7:g*8];
133
  if (ena & wea[g])  valid[addra[13:5]][g] <= 1'b1;
134 60 robfinch
end
135
end
136
endgenerate
137
always @(posedge clkb)
138
        if (enb)
139
                doutb1 <= mem[addrb[13:5]];
140
always @(posedge clkb)
141
        if (enb)
142
                doutb <= doutb1;
143
always @(posedge clkb)
144
        if (enb)
145
                ov1 <= valid[addrb[13:5]];
146
always @(posedge clkb)
147
        if (enb)
148
                ov <= ov1;
149
endmodule
150
 
151
// -----------------------------------------------------------------------------
152
// -----------------------------------------------------------------------------
153
 
154
module FT64_dcache_tag(wclk, dce, wr, wadr, rclk, radr, whit, rhit);
155
input wclk;
156
input dce;                                              // data cache enable
157
input wr;
158
input [37:0] wadr;
159
input rclk;
160
input [37:0] radr;
161
output reg whit;                        // write hit
162
output reg rhit;                        // read hit
163
 
164
wire [31:0] rtago;
165
wire [31:0] wtago;
166
 
167
FT64_dcache_tag2 u1 (
168
  .clka(wclk),
169
  .ena(dce),
170
  .wea(wr),
171
  .addra(wadr[13:5]),
172
  .dina(wadr[37:14]),
173
  .douta(wtago),
174
  .clkb(rclk),
175
  .web(1'b0),
176
  .dinb(32'd0),
177
  .enb(dce),
178
  .addrb(radr[13:5]),
179
  .doutb(rtago)
180
);
181
 
182
always @(posedge rclk)
183
        rhit <= rtago[23:0]==radr[37:14];
184
always @(posedge wclk)
185
        whit <= wtago[23:0]==wadr[37:14];
186
 
187
endmodule
188
 

powered by: WebSVN 2.1.0

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