channelParamGen is a function which determines the channel parameters for each directed channel in the network. For every edge dictated by the PhysicalTopology, this function is called to determine the channel parameters for that edge.

This function can return a different set of parameters for each edge.

case class UserChannelParams(
  virtualChannelParams: Seq[UserVirtualChannelParams] =
  channelGen: Parameters => ChannelOutwardNode => ChannelOutwardNode =
    p => u => u,
  crossingType: ClockCrossingType = NoCrossing,
  useOutputQueues: Boolean = true,
  srcSpeedup: Int = 1,
  destSpeedup: Int = 1
) {
  val nVirtualChannels = virtualChannelParams.size

case class UserVirtualChannelParams(
  bufferSize: Int = 1

Virtual Channels

The virtualChannelParams field contains a list of UserVirtualChannelParams objects, where the each element represents one virtual channel, and the UserVirtualChannelParams object holds the number of buffer entries for that virtual channel.

Channel Generation

Currently, the channelGen field is only used to specify adding additional pipeline buffers in a channel.

For example, the following segment sets a two-deep buffer on the channel.

channelGen = (u) => {
  implicit val p: Parameters = u
  ChannelBuffer(2) := _


In the future more functionality can be added through this interface.


srcSpeedup indicates the number of flits that may enter a channel in a cycle. For srcSpeedup > 1, the generator will effectively increase the input bandwidth of the channel.

destSpeedup indicates the number of flits that may exit a channel in a cycle. Increasing this pressures the routing resources and switch of the destination router.


Setting srcSpeedup > destSpeedup is an unusual design point.

Clock Crossings

Currently unsupported. One day this will allow auto insertion of clock crossings between routers of the network on different clock domains.