Skip to content

Commit 09f677c

Browse files
committed
feat: add ACE coherence support in HPDCache subsystem
1 parent 64c17cc commit 09f677c

22 files changed

Lines changed: 261 additions & 52 deletions

Bender.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package:
88
# WT_DCACHE
99
dependencies:
1010
axi: { git: "https://github.com/pulp-platform/axi.git", version: 0.31.0 }
11+
ace: { git: "https://github.com/pulp-platform/ace.git", rev: 219c0a1 } # branch: multicore/devel
1112
common_cells:
1213
{ git: "https://github.com/pulp-platform/common_cells", version: 1.23.0 }
1314
fpnew: { git: "https://github.com/openhwgroup/cvfpu.git", rev: a74d99a32b } # branch: develop
@@ -173,6 +174,7 @@ sources:
173174
- core/cache_subsystem/hpdcache/rtl/src/utils/hpdcache_mem_resp_demux.sv
174175
- core/cache_subsystem/hpdcache/rtl/src/utils/hpdcache_mem_to_axi_read.sv
175176
- core/cache_subsystem/hpdcache/rtl/src/utils/hpdcache_mem_to_axi_write.sv
177+
- core/cache_subsystem/hpdcache/rtl/src/utils/hpdcache_snoop_to_ace_snoop.sv
176178
- core/cache_subsystem/hpdcache/rtl/src/utils/hpdcache_mem_req_read_arbiter.sv
177179
- core/cache_subsystem/hpdcache/rtl/src/utils/hpdcache_mem_req_write_arbiter.sv
178180
- core/cache_subsystem/hpdcache/rtl/src/common/hpdcache_demux.sv
@@ -186,6 +188,7 @@ sources:
186188
- core/cache_subsystem/hpdcache/rtl/src/common/hpdcache_decoder.sv
187189
- core/cache_subsystem/hpdcache/rtl/src/common/hpdcache_1hot_to_binary.sv
188190
- core/cache_subsystem/hpdcache/rtl/src/common/hpdcache_prio_1hot_encoder.sv
191+
- core/cache_subsystem/hpdcache/rtl/src/common/hpdcache_prio_bin_encoder.sv
189192
- core/cache_subsystem/hpdcache/rtl/src/common/hpdcache_sram.sv
190193
- core/cache_subsystem/hpdcache/rtl/src/common/hpdcache_sram_wbyteenable.sv
191194
- core/cache_subsystem/hpdcache/rtl/src/common/hpdcache_sram_wmask.sv
@@ -214,6 +217,8 @@ sources:
214217
- core/cache_subsystem/hpdcache/rtl/src/hpdcache_victim_sel.sv
215218
- core/cache_subsystem/hpdcache/rtl/src/hpdcache_wbuf.sv
216219
- core/cache_subsystem/hpdcache/rtl/src/hpdcache_flush.sv
220+
- core/cache_subsystem/hpdcache/rtl/src/hpdcache_cbuf.sv
221+
- core/cache_subsystem/hpdcache/rtl/src/hpdcache_snoop.sv
217222
# HPDCache integration
218223
- core/cache_subsystem/cva6_hpdcache_if_adapter.sv
219224
- core/cache_subsystem/cva6_hpdcache_subsystem_axi_arbiter.sv

core/cache_subsystem/cva6_hpdcache_subsystem.sv

Lines changed: 108 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ module cva6_hpdcache_subsystem
3333
parameter type axi_w_chan_t = logic,
3434
parameter type axi_b_chan_t = logic,
3535
parameter type axi_r_chan_t = logic,
36+
parameter type snoop_ac_chan_t = logic,
37+
parameter type snoop_cr_chan_t = logic,
38+
parameter type snoop_cd_chan_t = logic,
39+
parameter type snoop_req_t = logic,
40+
parameter type snoop_resp_t = logic,
3641
parameter type noc_req_t = logic,
3742
parameter type noc_resp_t = logic,
3843
parameter type cmo_req_t = logic,
@@ -57,6 +62,20 @@ module cva6_hpdcache_subsystem
5762
input noc_resp_t noc_resp_i,
5863
// }}}
5964

65+
// ACE specific read and write acknowledgments
66+
// {{{
67+
output logic noc_rack_o,
68+
output logic noc_wack_o,
69+
// }}}
70+
71+
// ACE snoop port from coherent interconnect
72+
// {{{
73+
// snoop request (ACE)
74+
input snoop_req_t snoop_req_i,
75+
// snoop response (ACE)
76+
output snoop_resp_t snoop_resp_o,
77+
// }}}
78+
6079
// I$
6180
// {{{
6281
// Instruction cache enable - CSR_REGFILE
@@ -211,6 +230,10 @@ module cva6_hpdcache_subsystem
211230
userCfg.mshrSetsPerRam = CVA6Cfg.NrLoadBufEntries < 16 ? 1 : CVA6Cfg.NrLoadBufEntries / 2;
212231
userCfg.mshrRamByteEnable = 1'b1;
213232
userCfg.mshrUseRegbank = (CVA6Cfg.NrLoadBufEntries < 16);
233+
/*FIXME we should add additional CVA6 config parameters (cbufEntries)*/
234+
userCfg.cbufEntries = 4;
235+
/*FIXME we should add additional CVA6 config parameters (snoopFifoDepth)*/
236+
userCfg.snoopFifoDepth = CVA6Cfg.WtDcacheWbufDepth;
214237
userCfg.refillCoreRspFeedthrough = 1'b1;
215238
userCfg.refillFifoDepth = 2 * (CVA6Cfg.DCACHE_LINE_WIDTH / CVA6Cfg.AxiDataWidth);
216239
userCfg.wbufDirEntries = CVA6Cfg.WtDcacheWbufDepth;
@@ -231,6 +254,9 @@ module cva6_hpdcache_subsystem
231254
userCfg.wbEn =
232255
(CVA6Cfg.DCacheType == config_pkg::HPDCACHE_WB) ||
233256
(CVA6Cfg.DCacheType == config_pkg::HPDCACHE_WT_WB);
257+
userCfg.lowLatency = 1'b1;
258+
/*FIXME we should add additional CVA6 config parameters (coherenceEn)*/
259+
userCfg.coherenceEn = 1'b1;
234260
return userCfg;
235261
endfunction
236262

@@ -255,27 +281,44 @@ module cva6_hpdcache_subsystem
255281
`HPDCACHE_TYPEDEF_RSP_T(hpdcache_rsp_t, hpdcache_req_data_t, hpdcache_req_sid_t,
256282
hpdcache_req_tid_t);
257283

284+
localparam type hpdcache_nline_t = logic [HPDcacheCfg.nlineWidth-1:0];
285+
286+
`HPDCACHE_TYPEDEF_SNOOP_REQ_T(hpdcache_snoop_req_t, hpdcache_nline_t);
287+
`HPDCACHE_TYPEDEF_SNOOP_RESP_DATA_T(hpdcache_snoop_resp_data_t, hpdcache_mem_data_t);
288+
258289
typedef logic [HPDcacheCfg.u.wbufTimecntWidth-1:0] hpdcache_wbuf_timecnt_t;
259290

260-
logic dcache_read_ready;
261-
logic dcache_read_valid;
262-
hpdcache_mem_req_t dcache_read;
291+
logic dcache_read_ready;
292+
logic dcache_read_valid;
293+
hpdcache_mem_req_t dcache_read;
294+
295+
logic dcache_read_resp_ready;
296+
logic dcache_read_resp_valid;
297+
hpdcache_mem_resp_r_t dcache_read_resp;
298+
299+
logic dcache_write_ready;
300+
logic dcache_write_valid;
301+
hpdcache_mem_req_t dcache_write;
263302

264-
logic dcache_read_resp_ready;
265-
logic dcache_read_resp_valid;
266-
hpdcache_mem_resp_r_t dcache_read_resp;
303+
logic dcache_write_data_ready;
304+
logic dcache_write_data_valid;
305+
hpdcache_mem_req_w_t dcache_write_data;
267306

268-
logic dcache_write_ready;
269-
logic dcache_write_valid;
270-
hpdcache_mem_req_t dcache_write;
307+
logic dcache_write_resp_ready;
308+
logic dcache_write_resp_valid;
309+
hpdcache_mem_resp_w_t dcache_write_resp;
271310

272-
logic dcache_write_data_ready;
273-
logic dcache_write_data_valid;
274-
hpdcache_mem_req_w_t dcache_write_data;
311+
logic dcache_snoop_ready;
312+
logic dcache_snoop_valid;
313+
hpdcache_snoop_req_t dcache_snoop;
275314

276-
logic dcache_write_resp_ready;
277-
logic dcache_write_resp_valid;
278-
hpdcache_mem_resp_w_t dcache_write_resp;
315+
logic dcache_snoop_resp_meta_ready;
316+
logic dcache_snoop_resp_meta_valid;
317+
hpdcache_pkg::hpdcache_snoop_meta_t dcache_snoop_resp_meta;
318+
319+
logic dcache_snoop_resp_data_ready;
320+
logic dcache_snoop_resp_data_valid;
321+
hpdcache_snoop_resp_data_t dcache_snoop_resp_data;
279322

280323
cva6_hpdcache_wrapper #(
281324
.CVA6Cfg(CVA6Cfg),
@@ -304,7 +347,9 @@ module cva6_hpdcache_subsystem
304347
.hpdcache_req_t(hpdcache_req_t),
305348
.hpdcache_rsp_t(hpdcache_rsp_t),
306349
.hpdcache_wbuf_timecnt_t(hpdcache_wbuf_timecnt_t),
307-
.hpdcache_data_be_t(hpdcache_data_be_t)
350+
.hpdcache_data_be_t(hpdcache_data_be_t),
351+
.hpdcache_snoop_req_t(hpdcache_snoop_req_t),
352+
.hpdcache_snoop_resp_data_t(hpdcache_snoop_resp_data_t)
308353
) i_dcache (
309354
.clk_i(clk_i),
310355
.rst_ni(rst_ni),
@@ -331,6 +376,18 @@ module cva6_hpdcache_subsystem
331376
.hwpf_throttle_o(hwpf_throttle_o),
332377
.hwpf_status_o(hwpf_status_o),
333378

379+
.dcache_snoop_req_valid_i(dcache_snoop_valid),
380+
.dcache_snoop_req_ready_o(dcache_snoop_ready),
381+
.dcache_snoop_req_i(dcache_snoop),
382+
383+
.dcache_snoop_resp_meta_valid_o(dcache_snoop_resp_meta_valid),
384+
.dcache_snoop_resp_meta_ready_i(dcache_snoop_resp_meta_ready),
385+
.dcache_snoop_resp_meta_o(dcache_snoop_resp_meta),
386+
387+
.dcache_snoop_resp_data_ready_i(dcache_snoop_resp_data_ready),
388+
.dcache_snoop_resp_data_valid_o(dcache_snoop_resp_data_valid),
389+
.dcache_snoop_resp_data_o(dcache_snoop_resp_data),
390+
334391
.dcache_mem_req_read_ready_i(dcache_read_ready),
335392
.dcache_mem_req_read_valid_o(dcache_read_valid),
336393
.dcache_mem_req_read_o(dcache_read),
@@ -408,7 +465,41 @@ module cva6_hpdcache_subsystem
408465
.dcache_write_resp_o (dcache_write_resp),
409466

410467
.axi_req_o (noc_req_o),
411-
.axi_resp_i(noc_resp_i)
468+
.axi_resp_i(noc_resp_i),
469+
.ace_rack_o(noc_rack_o),
470+
.ace_wack_o(noc_wack_o)
471+
);
472+
// }}}
473+
474+
// Snoop port adapter
475+
// {{{
476+
477+
hpdcache_snoop_to_ace_snoop #(
478+
.HPDcacheCfg(HPDcacheCfg),
479+
.hpdcache_snoop_req_t(hpdcache_snoop_req_t),
480+
.hpdcache_snoop_resp_data_t(hpdcache_snoop_resp_data_t),
481+
.ac_chan_t(snoop_ac_chan_t),
482+
.cr_chan_t(snoop_cr_chan_t),
483+
.cd_chan_t(snoop_cd_chan_t)
484+
) i_snoop_adapter (
485+
.snoop_req_valid_o(dcache_snoop_valid),
486+
.snoop_req_ready_i(dcache_snoop_ready),
487+
.snoop_req_o(dcache_snoop),
488+
.snoop_rsp_meta_valid_i(dcache_snoop_resp_meta_valid),
489+
.snoop_rsp_meta_ready_o(dcache_snoop_resp_meta_ready),
490+
.snoop_rsp_meta_i(dcache_snoop_resp_meta),
491+
.snoop_rsp_data_valid_i(dcache_snoop_resp_data_valid),
492+
.snoop_rsp_data_ready_o(dcache_snoop_resp_data_ready),
493+
.snoop_rsp_data_i(dcache_snoop_resp_data),
494+
.ace_ac_valid_i(snoop_req_i.ac_valid),
495+
.ace_ac_ready_o(snoop_resp_o.ac_ready),
496+
.ace_ac_i(snoop_req_i.ac),
497+
.ace_cr_valid_o(snoop_resp_o.cr_valid),
498+
.ace_cr_ready_i(snoop_req_i.cr_ready),
499+
.ace_cr_o(snoop_resp_o.cr),
500+
.ace_cd_valid_o(snoop_resp_o.cd_valid),
501+
.ace_cd_ready_i(snoop_req_i.cd_ready),
502+
.ace_cd_o(snoop_resp_o.cd)
412503
);
413504
// }}}
414505

core/cache_subsystem/cva6_hpdcache_subsystem_axi_arbiter.sv

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,13 @@ module cva6_hpdcache_subsystem_axi_arbiter
8484
// AXI port to upstream memory/peripherals
8585
// {{{
8686
output axi_req_t axi_req_o,
87-
input axi_rsp_t axi_resp_i
87+
input axi_rsp_t axi_resp_i,
88+
// }}}
89+
90+
// ACE specific read and write acknowledgments
91+
// {{{
92+
output logic ace_rack_o,
93+
output logic ace_wack_o
8894
// }}}
8995
);
9096
// }}}
@@ -151,6 +157,7 @@ module cva6_hpdcache_subsystem_axi_arbiter
151157
assign icache_miss_req_wdata.mem_req_command = hpdcache_pkg::HPDCACHE_MEM_READ;
152158
assign icache_miss_req_wdata.mem_req_atomic = hpdcache_pkg::hpdcache_mem_atomic_e'(0);
153159
assign icache_miss_req_wdata.mem_req_cacheable = ~icache_miss_i.nc;
160+
assign icache_miss_req_wdata.mem_req_coherence = icache_miss_i.nc ? hpdcache_pkg::HPDCACHE_MEM_COHERENCE_READ_NO_SNOOP : hpdcache_pkg::HPDCACHE_MEM_COHERENCE_READ_CLEAN;
154161

155162

156163
// I$ response
@@ -287,15 +294,15 @@ module cva6_hpdcache_subsystem_axi_arbiter
287294

288295
// Read response demultiplexor
289296
// {{{
290-
logic mem_resp_read_ready;
291-
logic mem_resp_read_valid;
292-
hpdcache_mem_resp_r_t mem_resp_read;
297+
logic mem_resp_read_ready;
298+
logic mem_resp_read_valid;
299+
hpdcache_mem_resp_r_t mem_resp_read;
293300

294-
logic mem_resp_read_ready_arb[1:0];
295-
logic mem_resp_read_valid_arb[1:0];
296-
hpdcache_mem_resp_r_t mem_resp_read_arb [1:0];
301+
logic mem_resp_read_ready_arb [1:0];
302+
logic mem_resp_read_valid_arb [1:0];
303+
hpdcache_mem_resp_r_t mem_resp_read_arb [1:0];
297304

298-
mem_resp_rt_t mem_resp_read_rt;
305+
mem_resp_rt_t mem_resp_read_rt;
299306

300307
always_comb begin
301308
for (int i = 0; i < MEM_RESP_RT_DEPTH; i++) begin
@@ -330,6 +337,16 @@ module cva6_hpdcache_subsystem_axi_arbiter
330337
assign dcache_read_resp_valid_o = mem_resp_read_valid_arb[1];
331338
assign dcache_read_resp_o = mem_resp_read_arb[1];
332339
assign mem_resp_read_ready_arb[1] = dcache_read_resp_ready_i;
340+
341+
always_ff @(posedge clk_i or negedge rst_ni) begin
342+
if (!rst_ni) ace_rack_o <= 1'b0;
343+
else ace_rack_o <= (mem_resp_read_valid && mem_resp_read_ready && mem_resp_read.mem_resp_r_last);
344+
end
345+
346+
always_ff @(posedge clk_i or negedge rst_ni) begin
347+
if (!rst_ni) ace_wack_o <= 1'b0;
348+
else ace_wack_o <= (dcache_write_resp_valid_o && dcache_write_resp_ready_i);
349+
end
333350
// }}}
334351

335352
// I$ miss pending

core/cache_subsystem/cva6_hpdcache_wrapper.sv

Lines changed: 52 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ module cva6_hpdcache_wrapper
4343
parameter type hpdcache_req_t = logic,
4444
parameter type hpdcache_rsp_t = logic,
4545
parameter type hpdcache_wbuf_timecnt_t = logic,
46-
parameter type hpdcache_data_be_t = logic
46+
parameter type hpdcache_data_be_t = logic,
47+
parameter type hpdcache_snoop_req_t = logic,
48+
parameter type hpdcache_snoop_resp_data_t = logic
4749
)
4850
// }}}
4951

@@ -93,6 +95,18 @@ module cva6_hpdcache_wrapper
9395
output logic [NrHwPrefetchers-1:0][63:0] hwpf_throttle_o,
9496
output logic [ 63:0] hwpf_status_o,
9597

98+
input logic dcache_snoop_req_valid_i,
99+
output logic dcache_snoop_req_ready_o,
100+
input hpdcache_snoop_req_t dcache_snoop_req_i,
101+
102+
output logic dcache_snoop_resp_meta_valid_o,
103+
input logic dcache_snoop_resp_meta_ready_i,
104+
output hpdcache_pkg::hpdcache_snoop_meta_t dcache_snoop_resp_meta_o,
105+
106+
input logic dcache_snoop_resp_data_ready_i,
107+
output logic dcache_snoop_resp_data_valid_o,
108+
output hpdcache_snoop_resp_data_t dcache_snoop_resp_data_o,
109+
96110
input logic dcache_mem_req_read_ready_i,
97111
output logic dcache_mem_req_read_valid_o,
98112
output hpdcache_mem_req_t dcache_mem_req_read_o,
@@ -339,26 +353,28 @@ module cva6_hpdcache_wrapper
339353
);
340354

341355
hpdcache #(
342-
.HPDcacheCfg (HPDcacheCfg),
343-
.wbuf_timecnt_t (hpdcache_wbuf_timecnt_t),
344-
.hpdcache_tag_t (hpdcache_tag_t),
345-
.hpdcache_data_word_t (hpdcache_data_word_t),
346-
.hpdcache_data_be_t (hpdcache_data_be_t),
347-
.hpdcache_req_offset_t(hpdcache_req_offset_t),
348-
.hpdcache_req_data_t (hpdcache_req_data_t),
349-
.hpdcache_req_be_t (hpdcache_req_be_t),
350-
.hpdcache_req_sid_t (hpdcache_req_sid_t),
351-
.hpdcache_req_tid_t (hpdcache_req_tid_t),
352-
.hpdcache_req_t (hpdcache_req_t),
353-
.hpdcache_rsp_t (hpdcache_rsp_t),
354-
.hpdcache_mem_addr_t (hpdcache_mem_addr_t),
355-
.hpdcache_mem_id_t (hpdcache_mem_id_t),
356-
.hpdcache_mem_data_t (hpdcache_mem_data_t),
357-
.hpdcache_mem_be_t (hpdcache_mem_be_t),
358-
.hpdcache_mem_req_t (hpdcache_mem_req_t),
359-
.hpdcache_mem_req_w_t (hpdcache_mem_req_w_t),
360-
.hpdcache_mem_resp_r_t(hpdcache_mem_resp_r_t),
361-
.hpdcache_mem_resp_w_t(hpdcache_mem_resp_w_t)
356+
.HPDcacheCfg (HPDcacheCfg),
357+
.wbuf_timecnt_t (hpdcache_wbuf_timecnt_t),
358+
.hpdcache_tag_t (hpdcache_tag_t),
359+
.hpdcache_data_word_t (hpdcache_data_word_t),
360+
.hpdcache_data_be_t (hpdcache_data_be_t),
361+
.hpdcache_req_offset_t (hpdcache_req_offset_t),
362+
.hpdcache_req_data_t (hpdcache_req_data_t),
363+
.hpdcache_req_be_t (hpdcache_req_be_t),
364+
.hpdcache_req_sid_t (hpdcache_req_sid_t),
365+
.hpdcache_req_tid_t (hpdcache_req_tid_t),
366+
.hpdcache_req_t (hpdcache_req_t),
367+
.hpdcache_rsp_t (hpdcache_rsp_t),
368+
.hpdcache_snoop_req_t (hpdcache_snoop_req_t),
369+
.hpdcache_snoop_resp_data_t(hpdcache_snoop_resp_data_t),
370+
.hpdcache_mem_addr_t (hpdcache_mem_addr_t),
371+
.hpdcache_mem_id_t (hpdcache_mem_id_t),
372+
.hpdcache_mem_data_t (hpdcache_mem_data_t),
373+
.hpdcache_mem_be_t (hpdcache_mem_be_t),
374+
.hpdcache_mem_req_t (hpdcache_mem_req_t),
375+
.hpdcache_mem_req_w_t (hpdcache_mem_req_w_t),
376+
.hpdcache_mem_resp_r_t (hpdcache_mem_resp_r_t),
377+
.hpdcache_mem_resp_w_t (hpdcache_mem_resp_w_t)
362378
) i_hpdcache (
363379
.clk_i,
364380
.rst_ni,
@@ -375,6 +391,18 @@ module cva6_hpdcache_wrapper
375391
.core_rsp_valid_o(dcache_rsp_valid),
376392
.core_rsp_o (dcache_rsp),
377393

394+
.snoop_req_valid_i(dcache_snoop_req_valid_i),
395+
.snoop_req_ready_o(dcache_snoop_req_ready_o),
396+
.snoop_req_i (dcache_snoop_req_i),
397+
398+
.snoop_rsp_meta_valid_o(dcache_snoop_resp_meta_valid_o),
399+
.snoop_rsp_meta_ready_i(dcache_snoop_resp_meta_ready_i),
400+
.snoop_rsp_meta_o (dcache_snoop_resp_meta_o),
401+
402+
.snoop_rsp_data_ready_i(dcache_snoop_resp_data_ready_i),
403+
.snoop_rsp_data_valid_o(dcache_snoop_resp_data_valid_o),
404+
.snoop_rsp_data_o (dcache_snoop_resp_data_o),
405+
378406
.mem_req_read_ready_i(dcache_mem_req_read_ready_i),
379407
.mem_req_read_valid_o(dcache_mem_req_read_valid_o),
380408
.mem_req_read_o (dcache_mem_req_read_o),
@@ -383,6 +411,9 @@ module cva6_hpdcache_wrapper
383411
.mem_resp_read_valid_i(dcache_mem_resp_read_valid_i),
384412
.mem_resp_read_i (dcache_mem_resp_read_i),
385413

414+
.mem_resp_read_inval_i (1'b0),
415+
.mem_resp_read_inval_nline_i('0),
416+
386417
.mem_req_write_ready_i(dcache_mem_req_write_ready_i),
387418
.mem_req_write_valid_o(dcache_mem_req_write_valid_o),
388419
.mem_req_write_o (dcache_mem_req_write_o),

core/cache_subsystem/hpdcache

Submodule hpdcache updated 139 files

0 commit comments

Comments
 (0)