-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathData-Cache-Controller.v
124 lines (105 loc) · 1.71 KB
/
Data-Cache-Controller.v
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
module DataCacheController (
input clk, input rst,
input MemRead,
input MemWrite,
input [4:0] index,
input [2:0] tag,
output reg stall,
output reg fill,
output reg update,
output reg MsRead,
input MsReady
);
reg [2:0] tags [0:31];
reg valid_bits [0:31];
reg [2:0] state;
reg [2:0] next_state;
wire write_miss;
assign write_miss = ((valid_bits[index]!=1)||(tag!=tags[index]));
parameter idle = 0, read = 1, write = 2;
integer i;
always@(posedge clk, posedge rst)begin
if(rst)begin
next_state <=idle;
for(i=0; i<32; i=i+1)begin
valid_bits[i]=0;
tags[i]=3'd0;
end
end
else
state <= next_state;
end
always@(posedge clk) begin
case(state)
idle: begin
// stall=0;
if(MemRead)begin
if((write_miss))begin
stall=1;
MsRead=1;
next_state = read;
fill=0;
update=0;
end
else begin
next_state = idle;
stall=0;
update=0;
MsRead = 0;
fill=0;
end
end
else if(MemWrite)
if((write_miss==1))begin
stall=1;
next_state = write;
fill=0;
update=0;
end
else if(!write_miss)begin
update=1;
stall=1;
next_state=write;
fill=0;
end
else begin
next_state = idle;
stall=0;
update=0;
fill=0;
end
end
write: begin
if(!MsReady) begin
next_state= write;
stall=1;
fill=0;
update=0;
end
else begin
next_state= idle;
stall=0;
fill=0;
update=0;
end
end
read: begin
if(!MsReady) begin
next_state= read;
fill=0;
update=0;
stall=1;
end
else begin
fill=1;
stall=0;
valid_bits[index]=1;
tags[index]=tag;
next_state = idle;
update=0;
end
end
default: next_state = idle;
endcase
end
endmodule