How to connect a RoCC Accelerator Module to the System Bus without talking to the Cache

32 views
Skip to first unread message

Johnson Umeike

unread,
Jul 3, 2024, 4:15:58 PMJul 3
to Chipyard
Hi, I am quite new to Chipyard. I have a hardware message queue module implemented as a tightly-coupled RoCC accelerator (i.e. extends LazyRocc and LazyRoccModule class). This module receives instruction from the rocket core and performs some operations. My base design has 4 of such modules, which I want to exchange data with each other over the system bus. What is the best way to achieve a direct connection from each module to the system bus and have all four modules talk to each other? I added a client and manager tilelink interface to each module. What should I consider in establishing this connection if using this interface? I specified my connection like this in my src file.

// This trait connects the rocc modules to the system bus
trait CanHaveROCCMODULEBlocks { this: BaseSubsystem =>
  private val systemBus = locateTLBusWrapper(SBUS)
  private val roccModules = p(BuildRoCC).collect { case s: ROCCMODULE => s }
 
  roccModules.zipWithIndex.foreach { case (roccmodule, index) =>
    val baseAddress = 0x20000000L + index * 0x1000L  // Unique base address
    roccmodule.setBaseAddress(baseAddress)  // Set the base address
   
    systemBus.coupleTo(s"roccmodule_manager_${index}") { bus =>
      roccmodule.tlManagerNode := TLBuffer() := bus
    }
   
    systemBus.coupleFrom(s"roccmodule_client_${index}") { bus =>
      bus := TLBuffer() := roccmodule.tlClientNode
    }
  }
}

Should I use something else? Any example implementation or resource you can point me to will be greatly appreciated.

Best Regards,
Johnson
Reply all
Reply to author
Forward
0 new messages