Skip to content

Conversation

@mbertuletti
Copy link

This PR adds burst support to the variable latency interconnect.

In systems where multiple interconnects are instantiated hierarchically, the arbitration across multiple initiators at the boundary between hierarchies causes a bottleneck in the request-per-cycle injected into the interconnect. The burst functionality solves the problem. We provide:

  • A burst_req_grouper module, that groups a parallel valid request in a burst request,
  • A burst_cutter module, that issues two bursts when the parallel request crosses the boundary between hierarchies and targets different arbitrators,
  • A burst_manager module, that receives a burst request and translates it into a parallel request,
  • A burst_rsp_grouper module, that increases the bandwidth of the response channel to send multiple words from a parallel response with the same resp_valid, thus reducing congestion to the arbiters also on the response path.

More details on the burst protocol applied to a system with hierarchical crossbars and wide memory requests initiators are in the following publication:

TCDM Burst Access: Breaking the Bandwidth Barrier in Shared-L1 RVV Clusters Beyond 1000 FPUs

@misc{shen2025tcdmburstaccessbreaking,
      title={TCDM Burst Access: Breaking the Bandwidth Barrier in Shared-L1 RVV Clusters Beyond 1000 FPUs}, 
      author={Diyou Shen and Yichao Zhang and Marco Bertuletti and Luca Benini},
      year={2025},
      eprint={2501.14370},
      archivePrefix={arXiv},
      primaryClass={cs.AR},
      url={https://arxiv.org/abs/2501.14370}, 
}

This paper is available on arXiv:2501.14370 [cs.AR].

localparam int unsigned NumOutLog2 = $clog2(NumOut);
localparam int unsigned IniAggDataWidth = 1 + BeWidth + AddrMemWidth + DataWidth;
localparam int unsigned ReqAggDataWidth = 1 + BeWidth + AddrMemWidth + DataWidth + BurstWidth;
localparam int unsigned RespAggDataWidth = DataWidth + 32;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should define the width based on RspGF from the burst package. Also, the default width should be DataWidth if burst is not used

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, we added a wrapper to ensure modular instantiation of the burst function. This should be handled there.

`else
assign req_agg_in[j] = {req_wen_i[j], req_be_i[j], req_tgt_addr_i[j][ByteOffWidth + NumOutLog2 +: AddrMemWidth], req_wdata_i[j]};
`endif
assign {resp_rdata_o[j], resp_burst_o[j]} = resp_agg_out[j];
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do not include resp_burst_o when Burst is not used => signal not found issue

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, we added a wrapper to ensure modular instantiation of the burst function.

parameter int unsigned NumInLog2 = (NumIn == 1) ? 1 : $clog2(NumIn),
// Burst response type can be overwritten for DataWidth > 32b
// This can happen when the DataWidth includes transaction metadata
parameter type burst_resp_t = tcdm_burst_pkg::burst_gresp_t
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use the package definition from the burst_pkg.sv

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, done.

parameter int unsigned NumInLog2 = (NumIn == 1) ? 1 : $clog2(NumIn),
// Burst response type can be overwritten for DataWidth > 32b
// This can happen when the DataWidth includes transaction metadata
parameter type burst_resp_t = tcdm_burst_pkg::burst_gresp_t
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use the package definition from the burst_pkg.sv

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, done.

// Note that only the full crossbar allows NumIn/NumOut configurations that are not
// aligned to a power of 2.

`ifdef USE_BURST
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm a bit concerned about the use of a define here. If using the define, it prevents SoCs from using both the bursty and the non-bursty implementations of this interconnect block (e.g., when integrated into different subsystems). My suggestion would be to convert this to a parameter or to create two different modules, each implementing different functions (one could also call the other, tying off some inputs).

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you, I added a wrapper.

@mbertuletti mbertuletti requested a review from DiyouS June 5, 2025 06:25
parameter int unsigned AddrWidth = 32, // Address Width on the Initiator Side
parameter int unsigned DataWidth = 32, // Data Word Width
parameter int unsigned BeWidth = DataWidth/8, // Byte Strobe Width
parameter int unsigned ReqDataWidth = 32, // Data Word Width on the Request path
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here the original DataWidth is replaced by ReqDataWidth and RespDataWidth, which will require all repo using this module to adapt the connection. I am not sure if it is a good idea. Maybe we can keep the parameter int unsigned DataWidth = 32 and let the default values of ReqDataWidth and RespDataWidth equals to the DataWidth. Then the burst version can still overwrite these two values without needs of modification

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Absolutely, good point.

@mbertuletti mbertuletti force-pushed the burst_support branch 2 times, most recently from a76e1a7 to 486a10b Compare September 10, 2025 14:11
@mbertuletti mbertuletti force-pushed the burst_support branch 2 times, most recently from 1837b50 to 1598ff7 Compare September 24, 2025 14:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants