@@ -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,8 @@ 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+ userCfg.coherenceEn = CVA6Cfg.DcacheCoherent;
234259 return userCfg;
235260 endfunction
236261
@@ -255,27 +280,44 @@ module cva6_hpdcache_subsystem
255280 `HPDCACHE_TYPEDEF_RSP_T (hpdcache_rsp_t, hpdcache_req_data_t, hpdcache_req_sid_t,
256281 hpdcache_req_tid_t);
257282
283+ localparam type hpdcache_nline_t = logic [HPDcacheCfg.nlineWidth- 1 : 0 ];
284+
285+ `HPDCACHE_TYPEDEF_SNOOP_REQ_T (hpdcache_snoop_req_t, hpdcache_nline_t);
286+ `HPDCACHE_TYPEDEF_SNOOP_RESP_DATA_T (hpdcache_snoop_resp_data_t, hpdcache_mem_data_t);
287+
258288 typedef logic [HPDcacheCfg.u.wbufTimecntWidth- 1 : 0 ] hpdcache_wbuf_timecnt_t ;
259289
260- logic dcache_read_ready;
261- logic dcache_read_valid;
262- hpdcache_mem_req_t dcache_read;
290+ logic dcache_read_ready;
291+ logic dcache_read_valid;
292+ hpdcache_mem_req_t dcache_read;
293+
294+ logic dcache_read_resp_ready;
295+ logic dcache_read_resp_valid;
296+ hpdcache_mem_resp_r_t dcache_read_resp;
297+
298+ logic dcache_write_ready;
299+ logic dcache_write_valid;
300+ hpdcache_mem_req_t dcache_write;
263301
264- logic dcache_read_resp_ready ;
265- logic dcache_read_resp_valid ;
266- hpdcache_mem_resp_r_t dcache_read_resp ;
302+ logic dcache_write_data_ready ;
303+ logic dcache_write_data_valid ;
304+ hpdcache_mem_req_w_t dcache_write_data ;
267305
268- logic dcache_write_ready ;
269- logic dcache_write_valid ;
270- hpdcache_mem_req_t dcache_write ;
306+ logic dcache_write_resp_ready ;
307+ logic dcache_write_resp_valid ;
308+ hpdcache_mem_resp_w_t dcache_write_resp ;
271309
272- logic dcache_write_data_ready ;
273- logic dcache_write_data_valid ;
274- hpdcache_mem_req_w_t dcache_write_data ;
310+ logic dcache_snoop_ready ;
311+ logic dcache_snoop_valid ;
312+ hpdcache_snoop_req_t dcache_snoop ;
275313
276- logic dcache_write_resp_ready;
277- logic dcache_write_resp_valid;
278- hpdcache_mem_resp_w_t dcache_write_resp;
314+ logic dcache_snoop_resp_meta_ready;
315+ logic dcache_snoop_resp_meta_valid;
316+ hpdcache_pkg :: hpdcache_snoop_meta_t dcache_snoop_resp_meta;
317+
318+ logic dcache_snoop_resp_data_ready;
319+ logic dcache_snoop_resp_data_valid;
320+ hpdcache_snoop_resp_data_t dcache_snoop_resp_data;
279321
280322 cva6_hpdcache_wrapper # (
281323 .CVA6Cfg (CVA6Cfg),
@@ -304,7 +346,9 @@ module cva6_hpdcache_subsystem
304346 .hpdcache_req_t (hpdcache_req_t),
305347 .hpdcache_rsp_t (hpdcache_rsp_t),
306348 .hpdcache_wbuf_timecnt_t (hpdcache_wbuf_timecnt_t),
307- .hpdcache_data_be_t (hpdcache_data_be_t)
349+ .hpdcache_data_be_t (hpdcache_data_be_t),
350+ .hpdcache_snoop_req_t (hpdcache_snoop_req_t),
351+ .hpdcache_snoop_resp_data_t (hpdcache_snoop_resp_data_t)
308352 ) i_dcache (
309353 .clk_i (clk_i),
310354 .rst_ni (rst_ni),
@@ -331,6 +375,18 @@ module cva6_hpdcache_subsystem
331375 .hwpf_throttle_o (hwpf_throttle_o),
332376 .hwpf_status_o (hwpf_status_o),
333377
378+ .dcache_snoop_req_valid_i (dcache_snoop_valid),
379+ .dcache_snoop_req_ready_o (dcache_snoop_ready),
380+ .dcache_snoop_req_i (dcache_snoop),
381+
382+ .dcache_snoop_resp_meta_valid_o (dcache_snoop_resp_meta_valid),
383+ .dcache_snoop_resp_meta_ready_i (dcache_snoop_resp_meta_ready),
384+ .dcache_snoop_resp_meta_o (dcache_snoop_resp_meta),
385+
386+ .dcache_snoop_resp_data_ready_i (dcache_snoop_resp_data_ready),
387+ .dcache_snoop_resp_data_valid_o (dcache_snoop_resp_data_valid),
388+ .dcache_snoop_resp_data_o (dcache_snoop_resp_data),
389+
334390 .dcache_mem_req_read_ready_i (dcache_read_ready),
335391 .dcache_mem_req_read_valid_o (dcache_read_valid),
336392 .dcache_mem_req_read_o (dcache_read),
@@ -408,10 +464,52 @@ module cva6_hpdcache_subsystem
408464 .dcache_write_resp_o (dcache_write_resp),
409465
410466 .axi_req_o (noc_req_o),
411- .axi_resp_i (noc_resp_i)
467+ .axi_resp_i (noc_resp_i),
468+ .ace_rack_o (noc_rack_o),
469+ .ace_wack_o (noc_wack_o)
412470 );
413471 // }}}
414472
473+ // Snoop port adapter
474+ // {{{
475+
476+ if (HPDcacheCfg.u.coherenceEn) begin : gen_snoop_adapter
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)
503+ );
504+ end else begin : gen_no_snoop_adapter
505+ assign dcache_snoop_valid = 1'b0 ;
506+ assign dcache_snoop = '0 ;
507+ assign dcache_snoop_resp_meta_ready = 1'b0 ;
508+ assign dcache_snoop_resp_data_ready = 1'b0 ;
509+ assign snoop_resp_o = '0 ;
510+ end
511+ // }}}
512+
415513 // Assertions
416514 // {{{
417515 // pragma translate_off
0 commit comments