Skip to content

Commit 36be210

Browse files
committed
merge wzy
1 parent 9ae2df8 commit 36be210

File tree

6 files changed

+429
-35
lines changed

6 files changed

+429
-35
lines changed

4mem/d_cache_daxi.sv

Lines changed: 40 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
2+
13
`timescale 1ns / 1ps
24
//////////////////////////////////////////////////////////////////////////////////
35
// Company:
@@ -22,7 +24,9 @@
2224
module d_cache_daxi (
2325
input wire clk, rst,
2426
//tlb
25-
input wire no_cache,
27+
input wire data_en_E,
28+
// input wire no_cache,
29+
input wire cfg_writting,
2630
//datapath
2731
input wire data_en,
2832
input wire [31:0] data_addr,
@@ -142,21 +146,29 @@ module d_cache_daxi (
142146
wire write_finish; //写事务完毕
143147
//FSM
144148
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;
146151

147152
always @(posedge clk) begin
148153
if(rst) begin
149154
state <= IDLE;
150155
end
151156
else begin
152157
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 :
156160
mem_read_enE | mem_write_enE ? HitJudge :
161+
cfg_writting & miss? WaitCfg :
157162
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;
160172
endcase
161173
end
162174
end
@@ -172,19 +184,17 @@ module d_cache_daxi (
172184
collisionM <= rst ? 0 : collisionE;
173185
end
174186

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]:
177189
collisionM ? data_wdata_r: saved_rdata;
178190
//AXI
179191
always @(posedge clk) begin
180192
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 :
183194
read_finish ? 1'b0 : read_req;
184195

185196
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 :
188198
write_finish ? 1'b0 : write_req;
189199
end
190200
always @(posedge clk) begin
@@ -201,29 +211,29 @@ module d_cache_daxi (
201211
//读事务burst传输,计数当前传递的bank的编�?
202212
reg [OFFSET_WIDTH-3:0] cnt;
203213
always @(posedge clk) begin
204-
cnt <= rst | no_cache | read_finish ? 0 :
214+
cnt <= rst | read_finish ? 0 :
205215
data_back ? cnt + 1 : cnt;
206216
end
207217
//写事务burst传输,计数当前传递的bank的编�?
208218
reg [OFFSET_WIDTH-3:0] wcnt;
209219
always @(posedge clk) begin
210-
wcnt <= rst | no_cache | write_finish ? 0 :
220+
wcnt <= rst | write_finish ? 0 :
211221
data_go ? wcnt + 1 : wcnt;
212222
end
213223

214224
always @(posedge clk) begin
215225
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;
217227
end
218228
assign data_back = raddr_rcv & (rvalid & rready);
219229
assign data_go = waddr_rcv & (wvalid & wready);
220230
assign read_finish = raddr_rcv & (rvalid & rready & rlast);
221231
assign write_finish = waddr_rcv & wdata_rcv & (bvalid & bready);
222232
//AXI signal
223233
//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 ;
227237
assign arvalid = read_req & ~raddr_rcv;
228238
assign rready = raddr_rcv;
229239
//write
@@ -233,20 +243,18 @@ module d_cache_daxi (
233243
{TAG_WIDTH{evict_mask[0]}} & tag_way[0][TAG_WIDTH : 1]|
234244
{TAG_WIDTH{evict_mask[1]}} & tag_way[1][TAG_WIDTH : 1]
235245
), 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 ;
241249
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;
244252
assign wlast = {5'd0,wcnt}==awlen;
245253
assign wvalid = waddr_rcv & ~wdata_rcv;
246254
assign bready = waddr_rcv;
247255
//LRU
248256
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;
250258
always @(posedge clk) begin
251259
if(rst) begin
252260
LRU_bit <= '{default:'0};
@@ -263,10 +271,9 @@ module d_cache_daxi (
263271
wire write_dirty_bit_en;
264272
wire write_way_sel;
265273
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+
270277
assign write_way_sel = write & hit ? sel : evict_way;
271278
assign write_dirty_bit = read ? 1'b0 : 1'b1;
272279
always @(posedge clk) begin
@@ -306,7 +313,7 @@ module d_cache_daxi (
306313
for(i = 0; i < WAY_NUM; i=i+1) begin: way
307314
d_tag_ram tag_ram (
308315
.clka(clk),
309-
.ena(~no_cache),
316+
.ena(1'b1),
310317
.wea(wena_tag_ram_way[i]),
311318
.addra(addra),
312319
.dina(tag_ram_dina),
@@ -319,7 +326,7 @@ module d_cache_daxi (
319326
for(j = 0; j < BLOCK_NUM; j=j+1) begin: bank
320327
d_data_bank data_bank (
321328
.clka(clk),
322-
.ena(~no_cache),
329+
.ena(1'b1),
323330
.wea(wena_data_bank_way[i][j]),
324331
.addra(addra),
325332
.dina(data_bank_dina),

4mem/mem_access.sv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ module mem_access (
2222
logic ades, adel;
2323
assign M_master_except = {M_master_except_a[7:2],adel,ades};
2424

25-
assign data_sram_en = mem_en && ~(|M_master_except);
25+
assign data_sram_en = mem_en && ~(|M_master_except); //&& mem_addr != 32'hbfaffff0;
2626
assign data_sram_addr = mem_addr;
2727
// assign data_sram_addr = (mem_addr[31:28] == 4'hB) ? {4'h1, mem_addr[27:0]} :
2828
// (mem_addr[31:28] == 4'h8) ? {4'h0, mem_addr[27:0]} :

4mem/mmu.v

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ module mmu (
1010
output wire [31:0] inst_paddr2,
1111

1212
output wire no_cache_d,
13+
output wire no_cache_dE,
1314
output wire no_cache_i
1415
);
1516

@@ -31,6 +32,8 @@ module mmu (
3132

3233
assign no_cache_d = (data_vaddr[31:29] == 3'b101) //kseg1
3334
? 1'b1 : 1'b0;
35+
assign no_cache_dE = (data_vaddr2[31:29] == 3'b101) //kseg1
36+
? 1'b1 : 1'b0;
3437

3538
assign no_cache_i = 1'b0;
3639

mycpu_top.v

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ module mycpu_top (
5757

5858
//d_tlb - d_cache
5959
wire no_cache_d ; //数据
60+
wire no_cache_dE ;
6061
wire no_cache_i ; //指令
6162

6263
//datapath - cache
@@ -173,6 +174,7 @@ module mycpu_top (
173174
.data_paddr(data_addr),
174175
.data_paddr2(mem_addrE),
175176
.no_cache_d(no_cache_d),
177+
.no_cache_dE(no_cache_dE),
176178
.no_cache_i(no_cache_i)
177179
);
178180

@@ -206,10 +208,11 @@ module mycpu_top (
206208
.rready (i_rready)
207209
);
208210

209-
d_cache_daxi u_d_cache_daxi(
211+
d_arbitrater u_d_arbitrater(
210212
.clk(clk), .rst(rst),
211213

212214
//TLB
215+
.no_cache_E(no_cache_dE),
213216
.no_cache(no_cache_d),
214217

215218
//datapath

0 commit comments

Comments
 (0)