@@ -545,8 +545,10 @@ module cachepool_tile
545545
546546 // Used to determine the mapping policy between different cache banks.
547547 // Set through CSR
548- logic [$clog2 (TCDMAddrWidth)- 1 : 0 ] dynamic_offset;
549- assign dynamic_offset = dynamic_offset_i;
548+ logic [$clog2 (TCDMAddrWidth)- 1 : 0 ] dynamic_offset_d, dynamic_offset_q;
549+ `FF (dynamic_offset_q, dynamic_offset_d, '0 )
550+ assign dynamic_offset_d = dynamic_offset_i;
551+
550552 // One entry per flat remote port: flat index = j + r*NrTCDMPortsPerCore
551553 // where j is the xbar index and r is the remote slot within that xbar.
552554 logic [NumRemotePortTile- 1 : 0 ] remote_out_pready, remote_in_pready;
@@ -626,19 +628,19 @@ module cachepool_tile
626628 .tcdm_req_chan_t (tcdm_req_chan_t ),
627629 .tcdm_rsp_chan_t (tcdm_rsp_chan_t )
628630 ) i_cache_xbar (
629- .clk_i ( clk_i ),
630- .rst_ni ( rst_ni ),
631- .tile_id_i ( tile_id_i ),
632- .dynamic_offset_i ( dynamic_offset ),
633- .private_start_addr_i ( private_start_addr_i ),
634- .num_private_cache_i ( num_private_cache ),
635- .core_req_i ({ xbar_remote_req_gated, cache_req [j]} ),
636- .core_rsp_ready_i ({ xbar_remote_in_pready, cache_pready [j]} ),
637- .core_rsp_o ({ xbar_remote_rsp_xbar, cache_rsp [j]} ),
638- .tile_sel_o ( xbar_remote_req_dst ),
639- .mem_req_o ({ xbar_remote_req_o, cache_xbar_req [j]} ),
640- .mem_rsp_ready_o ({ xbar_remote_out_pready, cache_xbar_pready[j]} ),
641- .mem_rsp_i ({ xbar_remote_rsp_i, cache_xbar_rsp [j]} )
631+ .clk_i ( clk_i ),
632+ .rst_ni ( rst_ni ),
633+ .tile_id_i ( tile_id_i ),
634+ .dynamic_offset_i ( dynamic_offset_q ),
635+ .private_start_addr_i ( private_start_addr_i ),
636+ .num_private_cache_i ( num_private_cache ),
637+ .core_req_i ({ xbar_remote_req_gated, cache_req [j]} ),
638+ .core_rsp_ready_i ({ xbar_remote_in_pready, cache_pready [j]} ),
639+ .core_rsp_o ({ xbar_remote_rsp_xbar, cache_rsp [j]} ),
640+ .tile_sel_o ( xbar_remote_req_dst ),
641+ .mem_req_o ({ xbar_remote_req_o, cache_xbar_req [j]} ),
642+ .mem_rsp_ready_o ({ xbar_remote_out_pready, cache_xbar_pready[j]} ),
643+ .mem_rsp_i ({ xbar_remote_rsp_i, cache_xbar_rsp [j]} )
642644 );
643645 end
644646
@@ -713,21 +715,56 @@ module cachepool_tile
713715 assign cache_rsp_reg.p.write = cache_rsp_write[cb][j];
714716
715717 end else begin : gen_no_amo
716- // Bypass AMO and registers
717- assign cache_req_valid[cb][j] = cache_xbar_req [j][cb].q_valid;
718- assign cache_rsp_ready[cb][j] = cache_xbar_pready[j][cb];
719- assign cache_req_addr [cb][j] = cache_xbar_req [j][cb].q.addr;
720- assign cache_req_meta [cb][j] = cache_xbar_req [j][cb].q.user;
721- assign cache_req_write[cb][j] = cache_xbar_req [j][cb].q.write;
722- assign cache_req_data [cb][j] = cache_xbar_req [j][cb].q.data;
723- assign cache_req_strb [cb][j] = cache_xbar_req [j][cb].q.strb;
724-
725- assign cache_xbar_rsp[j][cb].p_valid = cache_rsp_valid[cb][j];
726- assign cache_xbar_rsp[j][cb].q_ready = cache_req_ready[cb][j];
727- assign cache_xbar_rsp[j][cb].p.data = cache_rsp_data [cb][j];
728- assign cache_xbar_rsp[j][cb].p.user = cache_rsp_meta [cb][j];
729-
730- assign cache_xbar_rsp[j][cb].p.write = cache_rsp_write[cb][j];
718+ // Spill register decoupling between xbar side and cache side.
719+ tcdm_req_t cache_req_reg;
720+ tcdm_rsp_t cache_rsp_reg;
721+
722+ // Extra wire for half-handshake: q_ready feedback from the response-side
723+ // spill register's downstream consumer back to the request-side spill
724+ // register's ready_i input.
725+ logic cache_req_ready_w;
726+
727+ spill_register # (
728+ .T ( tcdm_req_chan_t ),
729+ .Bypass ( 1'b0 )
730+ ) i_spill_reg_cache_req (
731+ .clk_i ( clk_i ),
732+ .rst_ni ( rst_ni ),
733+ .valid_i ( cache_xbar_req [j][cb].q_valid ),
734+ .ready_o ( cache_xbar_rsp [j][cb].q_ready ),
735+ .data_i ( cache_xbar_req [j][cb].q ),
736+ .valid_o ( cache_req_reg.q_valid ),
737+ .ready_i ( cache_req_ready_w ),
738+ .data_o ( cache_req_reg.q )
739+ );
740+
741+ spill_register # (
742+ .T ( tcdm_rsp_chan_t ),
743+ .Bypass ( 1'b1 )
744+ ) i_spill_reg_cache_rsp (
745+ .clk_i ( clk_i ),
746+ .rst_ni ( rst_ni ),
747+ .valid_i ( cache_rsp_reg.p_valid ),
748+ .ready_o ( cache_rsp_ready [cb][j] ),
749+ .data_i ( cache_rsp_reg.p ),
750+ .valid_o ( cache_xbar_rsp [j][cb].p_valid ),
751+ .ready_i ( cache_xbar_pready[j][cb] ),
752+ .data_o ( cache_xbar_rsp [j][cb].p )
753+ );
754+
755+ assign cache_req_ready_w = cache_req_ready[cb][j];
756+
757+ assign cache_req_valid[cb][j] = cache_req_reg.q_valid;
758+ assign cache_req_addr [cb][j] = cache_req_reg.q.addr;
759+ assign cache_req_meta [cb][j] = cache_req_reg.q.user;
760+ assign cache_req_write[cb][j] = cache_req_reg.q.write;
761+ assign cache_req_data [cb][j] = cache_req_reg.q.data;
762+ assign cache_req_strb [cb][j] = cache_req_reg.q.strb;
763+
764+ assign cache_rsp_reg.p_valid = cache_rsp_valid[cb][j];
765+ assign cache_rsp_reg.p.data = cache_rsp_data [cb][j];
766+ assign cache_rsp_reg.p.user = cache_rsp_meta [cb][j];
767+ assign cache_rsp_reg.p.write = cache_rsp_write[cb][j];
731768
732769 end
733770 end
@@ -757,12 +794,12 @@ module cachepool_tile
757794 $display (" NumDataBankPerCtrl: %0d " , NumDataBankPerCtrl);
758795 $display (" CoalFactor : %0d " , L1CoalFactor);
759796 $display (" RefillDataWidth: %0d " , RefillDataWidth);
760- $display (" DynamicOffset : %0d " , dynamic_offset );
797+ $display (" DynamicOffset : %0d " , dynamic_offset_q );
761798 end
762799
763- // CL-offset mask: bits below dynamic_offset , verbatim in both directions.
800+ // CL-offset mask: bits below dynamic_offset_q , verbatim in both directions.
764801 logic [SpatzAxiAddrWidth- 1 : 0 ] bitmask_lo;
765- assign bitmask_lo = (SpatzAxiAddrWidth ' (1 ) << dynamic_offset ) - 1 ;
802+ assign bitmask_lo = (SpatzAxiAddrWidth ' (1 ) << dynamic_offset_q ) - 1 ;
766803
767804 cache_refill_req_chan_t [NumL1CtrlTile- 1 : 0 ] cache_refill_req;
768805 burst_req_t [NumL1CtrlTile- 1 : 0 ] cache_refill_burst;
@@ -1031,14 +1068,14 @@ module cachepool_tile
10311068
10321069 rot_field = addr_rot >> (SpatzAxiAddrWidth - refill_bits_to_rotate);
10331070
1034- upper = (addr_rot >> dynamic_offset )
1071+ upper = (addr_rot >> dynamic_offset_q )
10351072 & ((SpatzAxiAddrWidth ' (1 ) << (SpatzAxiAddrWidth
1036- - dynamic_offset
1073+ - dynamic_offset_q
10371074 - refill_bits_to_rotate)) - 1 );
10381075
10391076 cache_refill_req_o[cb].q.addr = lower
1040- | (rot_field << dynamic_offset )
1041- | (upper << (dynamic_offset
1077+ | (rot_field << dynamic_offset_q )
1078+ | (upper << (dynamic_offset_q
10421079 + refill_bits_to_rotate));
10431080 end
10441081 end
0 commit comments