-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCache.v
More file actions
executable file
·85 lines (77 loc) · 2.48 KB
/
Cache.v
File metadata and controls
executable file
·85 lines (77 loc) · 2.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
`timescale 1ns/1ns
module Cache (
input clk,
input rst,
input Cache_WE,
input Cache_RE,
input checkInvalidation,
input [16:0] CacheAddress,
input [63:0] CacheWriteData,
output hit,
output [31:0] readData
);
wire [5:0] index;
wire [9:0] tag;
wire offset;
wire set1_hit;
wire set2_hit;
reg [31:0] set1_data [0:63][0:1];
reg [31:0] set2_data [0:63][0:1];
reg [9:0] set1_tag [0:63];
reg [9:0] set2_tag [0:63];
reg set1_valid [0:63];
reg set2_valid [0:63];
reg cache_lru [0:63];
assign index = CacheAddress[6:1];
assign tag = CacheAddress[16:7];
assign offset = CacheAddress[0];
assign set1_hit = (tag == set1_tag[index]) && set1_valid[index];
assign set2_hit = (tag == set2_tag[index]) && set2_valid[index];
assign hit = set1_hit || set2_hit;
assign readData = set1_hit ? set1_data[index][offset] : (
set2_hit ? set2_data[index][offset] : 32'b0);
integer i;
always @(posedge clk, posedge rst) begin
if (rst) begin
for (i = 0; i < 64; i = i + 1) begin
set1_data [i][0] <= 32'b0;
set1_data [i][1] <= 32'b0;
set2_data [i][0] <= 32'b0;
set2_data [i][1] <= 32'b0;
set1_tag [i] <= 10'b0;
set2_tag [i] <= 10'b0;
set1_valid [i] <= 1'b0;
set2_valid [i] <= 1'b0;
cache_lru [i] <= 1'b0;
end
end
else if(Cache_RE) begin
if(set1_hit) cache_lru[index] = 1'b0;
else if(set2_hit) cache_lru[index] = 1'b1;
end
else if (Cache_WE) begin
if(cache_lru[index]) begin
set1_data[index][0] <= CacheWriteData[31:0];
set1_data[index][1] <= CacheWriteData[63:32];
set1_tag[index] <= tag;
set1_valid[index] <= 1'b1;
end
else begin
set2_data[index][0] <= CacheWriteData[31:0];
set2_data[index][1] <= CacheWriteData[63:32];
set2_tag[index] <= tag;
set2_valid[index] <= 1'b1;
end
end
if(checkInvalidation) begin
if(set1_hit) begin
set1_valid[index] = 1'b0;
cache_lru[index] = 1'b1;
end
else if(set2_hit) begin
set2_valid[index] = 1'b0;
cache_lru[index] = 1'b0;
end
end
end
endmodule