@@ -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
0 commit comments