1
+
2
+
1
3
`timescale 1ns / 1ps
2
4
// ////////////////////////////////////////////////////////////////////////////////
3
5
// Company:
22
24
module d_cache_daxi (
23
25
input wire clk, rst,
24
26
// tlb
25
- input wire no_cache,
27
+ input wire data_en_E,
28
+ // input wire no_cache,
29
+ input wire cfg_writting,
26
30
// datapath
27
31
input wire data_en,
28
32
input wire [31 : 0 ] data_addr,
@@ -142,21 +146,29 @@ module d_cache_daxi (
142
146
wire write_finish; // 写事务完毕
143
147
// FSM
144
148
reg [1 : 0 ] state;
145
- parameter IDLE = 2'b00 , HitJudge = 2'b01 , MissHandle= 2'b11 , NoCache= 2'b10 ;
149
+ parameter IDLE = 2'b00 , HitJudge = 2'b01 , MissHandle= 2'b11 ;
150
+ parameter WaitCfg = 2'b10 ;
146
151
147
152
always @ (posedge clk) begin
148
153
if (rst) begin
149
154
state <= IDLE ;
150
155
end
151
156
else begin
152
157
case (state)
153
- IDLE : state <= (mem_read_enE | mem_write_enE) & ~ stallM ? HitJudge : IDLE ;
154
- HitJudge : state <= data_en & no_cache ? NoCache :
155
- data_en & miss ? MissHandle :
158
+ IDLE : state <= (mem_read_enE | mem_write_enE) & ~ stallM & data_en_E ? HitJudge : IDLE ;
159
+ HitJudge : state <= data_en & miss &~ cfg_writting ? MissHandle :
156
160
mem_read_enE | mem_write_enE ? HitJudge :
161
+ cfg_writting & miss? WaitCfg :
157
162
IDLE ;
158
- MissHandle : state <= ~ read_req & ~ write_req ? IDLE : state;
159
- NoCache : state <= read & read_finish | write & write_finish ? IDLE : NoCache;
163
+ MissHandle : state <= ~ read_req & ~ write_req & ~ cfg_writting ? IDLE : state;
164
+ WaitCfg : state <= cfg_writting ? WaitCfg : MissHandle;
165
+ // IDLE : state <= (mem_read_enE | mem_write_enE) & ~stallM & data_en_E ? HitJudge : IDLE;
166
+ // HitJudge : state <= data_en & miss ? MissHandle :
167
+ // mem_read_enE | mem_write_enE ? HitJudge :
168
+ // IDLE;
169
+ // MissHandle : state <= ~read_req & ~write_req & ~cfg_writting ? IDLE : state;
170
+ // MissHandle : state <= read_finish | write_finish ? IDLE : state;
171
+ // NoCache : state <= read & read_finish | write & write_finish ? IDLE : NoCache;
160
172
endcase
161
173
end
162
174
end
@@ -172,19 +184,17 @@ module d_cache_daxi (
172
184
collisionM <= rst ? 0 : collisionE;
173
185
end
174
186
175
- assign stall = ~ (state== IDLE || state== HitJudge && hit && ~ no_cache );
176
- assign data_rdata = hit & ~ no_cache & ~ collisionM ? block_sel_way[sel]:
187
+ assign stall = ~ (state== IDLE || state== HitJudge && hit);
188
+ assign data_rdata = hit & ~ collisionM ? block_sel_way[sel]:
177
189
collisionM ? data_wdata_r: saved_rdata;
178
190
// AXI
179
191
always @ (posedge clk) begin
180
192
read_req <= (rst) ? 1'b0 :
181
- ~ no_cache && data_en && (state == HitJudge) && miss && ~ read_req ? 1'b1 :
182
- read & no_cache & (state == HitJudge) & ~ read_req ? 1'b1 :
193
+ data_en && (state == HitJudge || state== WaitCfg) && miss && ~ read_req && ~ cfg_writting ? 1'b1 :
183
194
read_finish ? 1'b0 : read_req;
184
195
185
196
write_req <= (rst) ? 1'b0 :
186
- ~ no_cache & data_en && (state == HitJudge) && miss && dirty && ~ write_req ? 1'b1 :
187
- write & no_cache & (state == HitJudge) & ~ read_req ? 1'b1 :
197
+ data_en && (state == HitJudge || state== WaitCfg) && miss && dirty && ~ write_req && ~ cfg_writting ? 1'b1 :
188
198
write_finish ? 1'b0 : write_req;
189
199
end
190
200
always @ (posedge clk) begin
@@ -201,29 +211,29 @@ module d_cache_daxi (
201
211
// 读事务burst传输,计数当前传递的bank的编�?
202
212
reg [OFFSET_WIDTH - 3 : 0 ] cnt;
203
213
always @ (posedge clk) begin
204
- cnt <= rst | no_cache | read_finish ? 0 :
214
+ cnt <= rst | read_finish ? 0 :
205
215
data_back ? cnt + 1 : cnt;
206
216
end
207
217
// 写事务burst传输,计数当前传递的bank的编�?
208
218
reg [OFFSET_WIDTH - 3 : 0 ] wcnt;
209
219
always @ (posedge clk) begin
210
- wcnt <= rst | no_cache | write_finish ? 0 :
220
+ wcnt <= rst | write_finish ? 0 :
211
221
data_go ? wcnt + 1 : wcnt;
212
222
end
213
223
214
224
always @ (posedge clk) begin
215
225
saved_rdata <= rst ? 32'b0 :
216
- ( data_back & (cnt== offset) & ~ no_cache) | (no_cache & read_finish ) ? rdata : saved_rdata;
226
+ data_back & (cnt== offset) ? rdata : saved_rdata;
217
227
end
218
228
assign data_back = raddr_rcv & (rvalid & rready);
219
229
assign data_go = waddr_rcv & (wvalid & wready);
220
230
assign read_finish = raddr_rcv & (rvalid & rready & rlast);
221
231
assign write_finish = waddr_rcv & wdata_rcv & (bvalid & bready);
222
232
// AXI signal
223
233
// read
224
- assign araddr = ~ no_cache ? { tag,index,5'b0 }: data_addr ; // 如果是可以cache的数据,就把8个字的起始地址传过去,否则只传一个字的地址
225
- assign arlen = ~ no_cache ? BLOCK_NUM - 1 : 8'd0 ;
226
- assign arsize = ~ no_cache ? 3'd2 : { 1'b0 ,data_rlen } ;
234
+ assign araddr = { tag,index,5'b0 } ; // 如果是可以cache的数据,就把8个字的起始地址传过去,否则只传一个字的地址
235
+ assign arlen = BLOCK_NUM - 1 ;
236
+ assign arsize = 3'd2 ;
227
237
assign arvalid = read_req & ~ raddr_rcv;
228
238
assign rready = raddr_rcv;
229
239
// write
@@ -233,20 +243,18 @@ module d_cache_daxi (
233
243
{ TAG_WIDTH { evict_mask[0 ]}} & tag_way[0 ][TAG_WIDTH : 1 ]|
234
244
{ TAG_WIDTH { evict_mask[1 ]}} & tag_way[1 ][TAG_WIDTH : 1 ]
235
245
), index, { OFFSET_WIDTH { 1'b0 }}} ;
236
- assign awaddr = ~ no_cache ? dirty_write_addr : data_addr;
237
- assign awlen = ~ no_cache ? BLOCK_NUM - 1 : 8'd0 ;
238
- assign awsize = ~ no_cache ? 3'b10 :
239
- data_wen== 4'b1111 ? 3'b10 :
240
- data_wen== 4'b1100 || data_wen== 4'b0011 ? 3'b01 : 3'b00 ;
246
+ assign awaddr = dirty_write_addr;
247
+ assign awlen = BLOCK_NUM - 1 ;
248
+ assign awsize = 3'b10 ;
241
249
assign awvalid = write_req & ~ waddr_rcv;
242
- assign wdata = ~ no_cache ? block_way[evict_way][wcnt] : data_wdata ;
243
- assign wstrb = ~ no_cache ? 4'b1111 : data_wen ;
250
+ assign wdata = block_way[evict_way][wcnt];
251
+ assign wstrb = 4'b1111 ;
244
252
assign wlast = { 5'd0 ,wcnt} == awlen;
245
253
assign wvalid = waddr_rcv & ~ wdata_rcv;
246
254
assign bready = waddr_rcv;
247
255
// LRU
248
256
wire write_LRU_en;
249
- assign write_LRU_en = ~ no_cache & hit & ~ stallM | ~ no_cache & read_finish;
257
+ assign write_LRU_en = hit & ~ stallM | read_finish;
250
258
always @ (posedge clk) begin
251
259
if (rst) begin
252
260
LRU_bit <= '{ default : '0 } ;
@@ -263,10 +271,9 @@ module d_cache_daxi (
263
271
wire write_dirty_bit_en;
264
272
wire write_way_sel;
265
273
wire write_dirty_bit; // dirty被修改成�?�?
266
- assign write_dirty_bit_en = ~ no_cache & (
267
- read & read_finish | write & hit & ~ stallM |
268
- (state== MissHandle) & read_finish
269
- );
274
+ assign write_dirty_bit_en = read & read_finish | write & hit & ~ stallM |
275
+ (state== MissHandle) & read_finish;
276
+
270
277
assign write_way_sel = write & hit ? sel : evict_way;
271
278
assign write_dirty_bit = read ? 1'b0 : 1'b1 ;
272
279
always @ (posedge clk) begin
@@ -306,7 +313,7 @@ module d_cache_daxi (
306
313
for (i = 0 ; i < WAY_NUM ; i= i+ 1 ) begin : way
307
314
d_tag_ram tag_ram (
308
315
.clka (clk),
309
- .ena (~ no_cache ),
316
+ .ena (1'b1 ),
310
317
.wea (wena_tag_ram_way[i]),
311
318
.addra (addra),
312
319
.dina (tag_ram_dina),
@@ -319,7 +326,7 @@ module d_cache_daxi (
319
326
for (j = 0 ; j < BLOCK_NUM ; j= j+ 1 ) begin : bank
320
327
d_data_bank data_bank (
321
328
.clka (clk),
322
- .ena (~ no_cache ),
329
+ .ena (1'b1 ),
323
330
.wea (wena_data_bank_way[i][j]),
324
331
.addra (addra),
325
332
.dina (data_bank_dina),
0 commit comments