Rename SerialAdapter+SimSerial to TSIToTileLink/SimTSI/TSIHarness
This commit is contained in:
@@ -47,12 +47,12 @@ Using the Tethered Serial Interface (TSI)
|
|||||||
By default, Chipyard uses the Tethered Serial Interface (TSI) to communicate with the DUT.
|
By default, Chipyard uses the Tethered Serial Interface (TSI) to communicate with the DUT.
|
||||||
TSI protocol is an implementation of HTIF that is used to send commands to the RISC-V DUT.
|
TSI protocol is an implementation of HTIF that is used to send commands to the RISC-V DUT.
|
||||||
These TSI commands are simple R/W commands that are able to access the DUT's memory space.
|
These TSI commands are simple R/W commands that are able to access the DUT's memory space.
|
||||||
During simulation, the host sends TSI commands to a simulation stub in the test harness called ``SimSerial``
|
During simulation, the host sends TSI commands to a simulation stub in the test harness called ``SimTSI``
|
||||||
(C++ class) that resides in a ``SimSerial`` Verilog module (both are located in the ``generators/testchipip``
|
(C++ class) that resides in a ``SimTSI`` Verilog module (both are located in the ``generators/testchipip``
|
||||||
project).
|
project).
|
||||||
This ``SimSerial`` Verilog module then sends the TSI command recieved by the simulation stub
|
This ``SimTSI`` Verilog module then sends the TSI command recieved by the simulation stub
|
||||||
to an adapter that converts the TSI command into a TileLink request.
|
to an adapter that converts the TSI command into a TileLink request.
|
||||||
This conversion is done by the ``SerialAdapter`` module (located in the ``generators/testchipip`` project).
|
This conversion is done by the ``TSIToTileLink`` module (located in the ``generators/testchipip`` project).
|
||||||
After the transaction is converted to TileLink, the ``TLSerdesser`` (located in ``generators/testchipip``) serializes the
|
After the transaction is converted to TileLink, the ``TLSerdesser`` (located in ``generators/testchipip``) serializes the
|
||||||
transaction and sends it to the chip (this ``TLSerdesser`` is sometimes also referred to as a digital serial-link or SerDes).
|
transaction and sends it to the chip (this ``TLSerdesser`` is sometimes also referred to as a digital serial-link or SerDes).
|
||||||
Once the serialized transaction is received on the chip, it is deserialized and masters a TileLink bus on the chip
|
Once the serialized transaction is received on the chip, it is deserialized and masters a TileLink bus on the chip
|
||||||
@@ -76,7 +76,7 @@ simulation stub called ``SimDTM`` (C++ class) that resides in a ``SimDTM`` Veril
|
|||||||
sends the DMI command recieved by the simulation stub into the DUT which then converts the DMI
|
sends the DMI command recieved by the simulation stub into the DUT which then converts the DMI
|
||||||
command into a TileLink request. This conversion is done by the DTM named ``DebugModule`` in the ``generators/rocket-chip`` project.
|
command into a TileLink request. This conversion is done by the DTM named ``DebugModule`` in the ``generators/rocket-chip`` project.
|
||||||
When the DTM receives the program to load, it starts to write the binary byte-wise into memory.
|
When the DTM receives the program to load, it starts to write the binary byte-wise into memory.
|
||||||
This is considerably slower than the TSI protocol communication pipeline (i.e. ``SimSerial``/``SerialAdapter``/TileLink)
|
This is considerably slower than the TSI protocol communication pipeline (i.e. ``SimTSI``/``TSIToTileLink``/TileLink)
|
||||||
which directly writes the program binary to memory.
|
which directly writes the program binary to memory.
|
||||||
|
|
||||||
Starting the TSI or DMI Simulation
|
Starting the TSI or DMI Simulation
|
||||||
@@ -216,7 +216,7 @@ Softcore-driven Bringup Setup of the Example Test Chip after Tapeout
|
|||||||
Assuming this example test chip is taped out and now ready to be tested, we can communicate with the chip using this serial-link.
|
Assuming this example test chip is taped out and now ready to be tested, we can communicate with the chip using this serial-link.
|
||||||
For example, a common test setup used at Berkeley to evaluate Chipyard-based test-chips includes an FPGA running a RISC-V soft-core that is able to speak to the DUT (over an FMC).
|
For example, a common test setup used at Berkeley to evaluate Chipyard-based test-chips includes an FPGA running a RISC-V soft-core that is able to speak to the DUT (over an FMC).
|
||||||
This RISC-V soft-core would serve as the host of the test that will run on the DUT.
|
This RISC-V soft-core would serve as the host of the test that will run on the DUT.
|
||||||
This is done by the RISC-V soft-core running FESVR, sending TSI commands to a ``SerialAdapter`` / ``TLSerdesser`` programmed on the FPGA.
|
This is done by the RISC-V soft-core running FESVR, sending TSI commands to a ``TSIToTileLink`` / ``TLSerdesser`` programmed on the FPGA.
|
||||||
Once the commands are converted to serialized TileLink, then they can be sent over some medium to the DUT
|
Once the commands are converted to serialized TileLink, then they can be sent over some medium to the DUT
|
||||||
(like an FMC cable or a set of wires connecting FPGA outputs to the DUT board).
|
(like an FMC cable or a set of wires connecting FPGA outputs to the DUT board).
|
||||||
Similar to simulation, if the chip requests offchip memory, it can then send the transaction back over the serial-link.
|
Similar to simulation, if the chip requests offchip memory, it can then send the transaction back over the serial-link.
|
||||||
|
|||||||
@@ -2,24 +2,24 @@ Accessing Scala Resources
|
|||||||
===============================
|
===============================
|
||||||
|
|
||||||
A simple way to copy over a source file to the build directory to be used for a simulation compile or VLSI flow is to use the ``addResource`` function given by FIRRTL.
|
A simple way to copy over a source file to the build directory to be used for a simulation compile or VLSI flow is to use the ``addResource`` function given by FIRRTL.
|
||||||
An example of its use can be seen in `generators/testchipip/src/main/scala/SerialAdapter.scala <https://github.com/ucb-bar/testchipip/blob/master/src/main/scala/SerialAdapter.scala>`_.
|
An example of its use can be seen in `generators/testchipip/src/main/scala/SimTSI.scala <https://github.com/ucb-bar/testchipip/blob/master/src/main/scala/SimTSI.scala>`_.
|
||||||
Here is the example inlined:
|
Here is the example inlined:
|
||||||
|
|
||||||
.. code-block:: scala
|
.. code-block:: scala
|
||||||
|
|
||||||
class SimSerial(w: Int) extends BlackBox with HasBlackBoxResource {
|
class SimTSI extends BlackBox with HasBlackBoxResource {
|
||||||
val io = IO(new Bundle {
|
val io = IO(new Bundle {
|
||||||
val clock = Input(Clock())
|
val clock = Input(Clock())
|
||||||
val reset = Input(Bool())
|
val reset = Input(Bool())
|
||||||
val serial = Flipped(new SerialIO(w))
|
val tsi = Flipped(new TSIIO)
|
||||||
val exit = Output(Bool())
|
val exit = Output(Bool())
|
||||||
})
|
})
|
||||||
|
|
||||||
addResource("/testchipip/vsrc/SimSerial.v")
|
addResource("/testchipip/vsrc/SimTSI.v")
|
||||||
addResource("/testchipip/csrc/SimSerial.cc")
|
addResource("/testchipip/csrc/SimTSI.cc")
|
||||||
}
|
}
|
||||||
|
|
||||||
In this example, the ``SimSerial`` files will be copied from a specific folder (in this case the ``path/to/testchipip/src/main/resources/testchipip/...``) to the build folder.
|
In this example, the ``SimTSI`` files will be copied from a specific folder (in this case the ``path/to/testchipip/src/main/resources/testchipip/...``) to the build folder.
|
||||||
The ``addResource`` path retrieves resources from the ``src/main/resources`` directory.
|
The ``addResource`` path retrieves resources from the ``src/main/resources`` directory.
|
||||||
So to get an item at ``src/main/resources/fileA.v`` you can use ``addResource("/fileA.v")``.
|
So to get an item at ``src/main/resources/fileA.v`` you can use ``addResource("/fileA.v")``.
|
||||||
However, one caveat of this approach is that to retrieve the file during the FIRRTL compile, you must have that project in the FIRRTL compiler's classpath.
|
However, one caveat of this approach is that to retrieve the file during the FIRRTL compile, you must have that project in the FIRRTL compiler's classpath.
|
||||||
|
|||||||
@@ -83,8 +83,8 @@ This example shows the Chipyard default top that composes multiple traits togeth
|
|||||||
:end-before: DOC include end: DigitalTop
|
:end-before: DOC include end: DigitalTop
|
||||||
|
|
||||||
|
|
||||||
There are two "cakes" or mixins here. One for the lazy module (ex. ``CanHavePeripherySerial``) and one for the lazy module
|
There are two "cakes" or mixins here. One for the lazy module (ex. ``CanHavePeripheryTLSerial``) and one for the lazy module
|
||||||
implementation (ex. ``CanHavePeripherySerialModuleImp`` where ``Imp`` refers to implementation). The lazy module defines
|
implementation (ex. ``CanHavePeripheryTLSerialModuleImp`` where ``Imp`` refers to implementation). The lazy module defines
|
||||||
all the logical connections between generators and exchanges configuration information among them, while the
|
all the logical connections between generators and exchanges configuration information among them, while the
|
||||||
lazy module implementation performs the actual Chisel RTL elaboration.
|
lazy module implementation performs the actual Chisel RTL elaboration.
|
||||||
|
|
||||||
@@ -93,19 +93,17 @@ In the ``DigitalTop`` example class, the "outer" ``DigitalTop`` instantiates the
|
|||||||
of the module until all logical connections are determined and all configuration information is exchanged.
|
of the module until all logical connections are determined and all configuration information is exchanged.
|
||||||
The ``System`` outer base class, as well as the
|
The ``System`` outer base class, as well as the
|
||||||
``CanHavePeriphery<X>`` outer traits contain code to perform high-level logical
|
``CanHavePeriphery<X>`` outer traits contain code to perform high-level logical
|
||||||
connections. For example, the ``CanHavePeripherySerial`` outer trait contains code
|
connections. For example, the ``CanHavePeripheryTLSerial`` outer trait contains code
|
||||||
to optionally lazily instantiate the ``SerialAdapter``, and connect the ``SerialAdapter``'s
|
to optionally lazily instantiate the ``TLSerdesser``, and connect the ``TLSerdesser`` 's
|
||||||
TileLink node to the Front bus.
|
TileLink node to the Front bus.
|
||||||
|
|
||||||
The ``ModuleImp`` classes and traits perform elaboration of real RTL.
|
The ``ModuleImp`` classes and traits perform elaboration of real RTL.
|
||||||
For example, the ``CanHavePeripherySerialModuleImp`` trait optionally physically connects
|
|
||||||
the ``SerialAdapter`` module, and instantiates queues.
|
|
||||||
|
|
||||||
In the test harness, the SoC is elaborated with
|
In the test harness, the SoC is elaborated with
|
||||||
``val dut = p(BuildTop)(p)``.
|
``val dut = p(BuildTop)(p)``.
|
||||||
|
|
||||||
After elaboration, the system submodule of ``ChipTop`` will be a ``DigitalTop`` module, which contains a
|
After elaboration, the system submodule of ``ChipTop`` will be a ``DigitalTop`` module, which contains a
|
||||||
``SerialAdapter`` module (among others), if the config specified for that block to be instantiated.
|
``TLSerdesser`` module (among others), if the config specified for that block to be instantiated.
|
||||||
|
|
||||||
From a high level, classes which extend ``LazyModule`` *must* reference
|
From a high level, classes which extend ``LazyModule`` *must* reference
|
||||||
their module implementation through ``lazy val module``, and they
|
their module implementation through ``lazy val module``, and they
|
||||||
@@ -116,7 +114,7 @@ other normal modules OR lazy modules (for nested Diplomacy
|
|||||||
graphs, for example).
|
graphs, for example).
|
||||||
|
|
||||||
The naming convention for an additive mixin or trait is ``CanHave<YourMixin>``.
|
The naming convention for an additive mixin or trait is ``CanHave<YourMixin>``.
|
||||||
This is shown in the ``Top`` class where things such as ``CanHavePeripherySerial`` connect a RTL component to a bus and expose signals to the top-level.
|
This is shown in the ``Top`` class where things such as ``CanHavePeripheryTLSerial`` connect a RTL component to a bus and expose signals to the top-level.
|
||||||
|
|
||||||
Additional References
|
Additional References
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|||||||
@@ -2,16 +2,16 @@ Test Chip IP
|
|||||||
============
|
============
|
||||||
|
|
||||||
Chipyard includes a Test Chip IP library which provides various hardware
|
Chipyard includes a Test Chip IP library which provides various hardware
|
||||||
widgets that may be useful when designing SoCs. This includes a :ref:`Generators/TestChipIP:Serial Adapter`,
|
widgets that may be useful when designing SoCs. This includes a :ref:`Generators/TestChipIP:SimTSI`,
|
||||||
:ref:`Generators/TestChipIP:Block Device Controller`, :ref:`Generators/TestChipIP:TileLink SERDES`, :ref:`Generators/TestChipIP:TileLink Switcher`,
|
:ref:`Generators/TestChipIP:Block Device Controller`, :ref:`Generators/TestChipIP:TileLink SERDES`, :ref:`Generators/TestChipIP:TileLink Switcher`,
|
||||||
:ref:`Generators/TestChipIP:TileLink Ring Network`, and :ref:`Generators/TestChipIP:UART Adapter`.
|
:ref:`Generators/TestChipIP:TileLink Ring Network`, and :ref:`Generators/TestChipIP:UART Adapter`.
|
||||||
|
|
||||||
Serial Adapter
|
SimTSI
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
The serial adapter is used by tethered test chips to communicate with the host
|
The SimTSI and TSIToTileLink are used by tethered test chips to communicate with the host
|
||||||
processor. An instance of RISC-V frontend server running on the host CPU
|
processor. An instance of RISC-V frontend server running on the host CPU
|
||||||
can send commands to the serial adapter to read and write data from the memory
|
can send commands to the TSIToTileLink to read and write data from the memory
|
||||||
system. The frontend server uses this functionality to load the test program
|
system. The frontend server uses this functionality to load the test program
|
||||||
into memory and to poll for completion of the program. More information on
|
into memory and to poll for completion of the program. More information on
|
||||||
this can be found in :ref:`Customization/Boot-Process:Chipyard Boot Process`.
|
this can be found in :ref:`Customization/Boot-Process:Chipyard Boot Process`.
|
||||||
|
|||||||
@@ -28,22 +28,22 @@ class WithArty100TUARTTSI(uartBaudRate: BigInt = 115200) extends OverrideHarness
|
|||||||
val bits = port.bits
|
val bits = port.bits
|
||||||
port.clock := th.buildtopClock
|
port.clock := th.buildtopClock
|
||||||
withClockAndReset(th.buildtopClock, th.buildtopReset) {
|
withClockAndReset(th.buildtopClock, th.buildtopReset) {
|
||||||
val ram = SerialAdapter.connectHarnessRAM(system.serdesser.get, bits, th.buildtopReset)
|
val ram = TSIHarness.connectRAM(system.serdesser.get, bits, th.buildtopReset)
|
||||||
val uart_to_serial = Module(new UARTToSerial(
|
val uart_to_serial = Module(new UARTToSerial(
|
||||||
freq, UARTParams(0, initBaudRate=uartBaudRate)))
|
freq, UARTParams(0, initBaudRate=uartBaudRate)))
|
||||||
val serial_width_adapter = Module(new SerialWidthAdapter(
|
val serial_width_adapter = Module(new SerialWidthAdapter(
|
||||||
narrowW = 8, wideW = SerialAdapter.SERIAL_TSI_WIDTH))
|
narrowW = 8, wideW = TSI.WIDTH))
|
||||||
serial_width_adapter.io.narrow.flipConnect(uart_to_serial.io.serial)
|
serial_width_adapter.io.narrow.flipConnect(uart_to_serial.io.serial)
|
||||||
|
|
||||||
ram.module.io.tsi_ser.flipConnect(serial_width_adapter.io.wide)
|
ram.module.io.tsi.flipConnect(serial_width_adapter.io.wide)
|
||||||
|
|
||||||
ath.io_uart_bb.bundle <> uart_to_serial.io.uart
|
ath.io_uart_bb.bundle <> uart_to_serial.io.uart
|
||||||
ath.other_leds(1) := uart_to_serial.io.dropped
|
ath.other_leds(1) := uart_to_serial.io.dropped
|
||||||
|
|
||||||
ath.other_leds(9) := ram.module.io.adapter_state(0)
|
ath.other_leds(9) := ram.module.io.tsi2tl_state(0)
|
||||||
ath.other_leds(10) := ram.module.io.adapter_state(1)
|
ath.other_leds(10) := ram.module.io.tsi2tl_state(1)
|
||||||
ath.other_leds(11) := ram.module.io.adapter_state(2)
|
ath.other_leds(11) := ram.module.io.tsi2tl_state(2)
|
||||||
ath.other_leds(12) := ram.module.io.adapter_state(3)
|
ath.other_leds(12) := ram.module.io.tsi2tl_state(3)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class AbstractConfig extends Config(
|
|||||||
// The HarnessBinders control generation of hardware in the TestHarness
|
// The HarnessBinders control generation of hardware in the TestHarness
|
||||||
new chipyard.harness.WithUARTAdapter ++ // add UART adapter to display UART on stdout, if uart is present
|
new chipyard.harness.WithUARTAdapter ++ // add UART adapter to display UART on stdout, if uart is present
|
||||||
new chipyard.harness.WithBlackBoxSimMem ++ // add SimDRAM DRAM model for axi4 backing memory, if axi4 mem is enabled
|
new chipyard.harness.WithBlackBoxSimMem ++ // add SimDRAM DRAM model for axi4 backing memory, if axi4 mem is enabled
|
||||||
new chipyard.harness.WithSimSerial ++ // add external serial-adapter and RAM
|
new chipyard.harness.WithSimTSIOverSerialTL ++ // add external serial-adapter and RAM
|
||||||
new chipyard.harness.WithSimDebug ++ // add SimJTAG or SimDTM adapters if debug module is enabled
|
new chipyard.harness.WithSimDebug ++ // add SimJTAG or SimDTM adapters if debug module is enabled
|
||||||
new chipyard.harness.WithGPIOTiedOff ++ // tie-off chiptop GPIOs, if GPIOs are present
|
new chipyard.harness.WithGPIOTiedOff ++ // tie-off chiptop GPIOs, if GPIOs are present
|
||||||
new chipyard.harness.WithSimSPIFlashModel ++ // add simulated SPI flash memory, if SPI is enabled
|
new chipyard.harness.WithSimSPIFlashModel ++ // add simulated SPI flash memory, if SPI is enabled
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ class MediumBoomCosimConfig extends Config(
|
|||||||
new chipyard.config.AbstractConfig)
|
new chipyard.config.AbstractConfig)
|
||||||
|
|
||||||
class dmiMediumBoomConfig extends Config(
|
class dmiMediumBoomConfig extends Config(
|
||||||
new chipyard.harness.WithSerialAdapterTiedOff ++ // don't attach an external SimSerial
|
new chipyard.harness.WithSerialTLTiedOff ++ // don't attach anything to serial-tl
|
||||||
new chipyard.config.WithDMIDTM ++ // have debug module expose a clocked DMI port
|
new chipyard.config.WithDMIDTM ++ // have debug module expose a clocked DMI port
|
||||||
new boom.common.WithNMediumBooms(1) ++
|
new boom.common.WithNMediumBooms(1) ++
|
||||||
new chipyard.config.AbstractConfig)
|
new chipyard.config.AbstractConfig)
|
||||||
@@ -63,7 +63,7 @@ class dmiMediumBoomConfig extends Config(
|
|||||||
class dmiMediumBoomCosimConfig extends Config(
|
class dmiMediumBoomCosimConfig extends Config(
|
||||||
new chipyard.harness.WithCospike ++ // attach spike-cosim
|
new chipyard.harness.WithCospike ++ // attach spike-cosim
|
||||||
new chipyard.config.WithTraceIO ++ // enable the traceio
|
new chipyard.config.WithTraceIO ++ // enable the traceio
|
||||||
new chipyard.harness.WithSerialAdapterTiedOff ++ // don't attach an external SimSerial
|
new chipyard.harness.WithSerialTLTiedOff ++ // don't attach anythint to serial-tl
|
||||||
new chipyard.config.WithDMIDTM ++ // have debug module expose a clocked DMI port
|
new chipyard.config.WithDMIDTM ++ // have debug module expose a clocked DMI port
|
||||||
new boom.common.WithNMediumBooms(1) ++
|
new boom.common.WithNMediumBooms(1) ++
|
||||||
new chipyard.config.AbstractConfig)
|
new chipyard.config.AbstractConfig)
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class CVA6Config extends Config(
|
|||||||
new chipyard.config.AbstractConfig)
|
new chipyard.config.AbstractConfig)
|
||||||
|
|
||||||
class dmiCVA6Config extends Config(
|
class dmiCVA6Config extends Config(
|
||||||
new chipyard.harness.WithSerialAdapterTiedOff ++ // Tie off the serial port, override default instantiation of SimSerial
|
new chipyard.harness.WithSerialTLTiedOff ++ // Tie off the serial-tilelink port
|
||||||
new chipyard.config.WithDMIDTM ++ // have debug module expose a clocked DMI port
|
new chipyard.config.WithDMIDTM ++ // have debug module expose a clocked DMI port
|
||||||
new cva6.WithNCVA6Cores(1) ++ // single CVA6 core
|
new cva6.WithNCVA6Cores(1) ++ // single CVA6 core
|
||||||
new chipyard.config.AbstractConfig)
|
new chipyard.config.AbstractConfig)
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ class LBWIFRocketConfig extends Config(
|
|||||||
|
|
||||||
// DOC include start: DmiRocket
|
// DOC include start: DmiRocket
|
||||||
class dmiRocketConfig extends Config(
|
class dmiRocketConfig extends Config(
|
||||||
new chipyard.harness.WithSerialAdapterTiedOff ++ // don't attach an external SimSerial
|
new chipyard.harness.WithSerialTLTiedOff ++ // don't attach anything to serial-tl
|
||||||
new chipyard.config.WithDMIDTM ++ // have debug module expose a clocked DMI port
|
new chipyard.config.WithDMIDTM ++ // have debug module expose a clocked DMI port
|
||||||
new freechips.rocketchip.subsystem.WithNBigCores(1) ++
|
new freechips.rocketchip.subsystem.WithNBigCores(1) ++
|
||||||
new chipyard.config.AbstractConfig)
|
new chipyard.config.AbstractConfig)
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ class SpikeConfig extends Config(
|
|||||||
new chipyard.config.AbstractConfig)
|
new chipyard.config.AbstractConfig)
|
||||||
|
|
||||||
class dmiSpikeConfig extends Config(
|
class dmiSpikeConfig extends Config(
|
||||||
new chipyard.harness.WithSerialAdapterTiedOff ++ // don't attach an external SimSerial
|
new chipyard.harness.WithSerialTLTiedOff ++ // don't attach anything to serial-tilelink
|
||||||
new chipyard.config.WithDMIDTM ++ // have debug module expose a clocked DMI port
|
new chipyard.config.WithDMIDTM ++ // have debug module expose a clocked DMI port
|
||||||
new SpikeConfig)
|
new SpikeConfig)
|
||||||
|
|
||||||
@@ -35,7 +35,7 @@ class SpikeUltraFastConfig extends Config(
|
|||||||
new chipyard.config.AbstractConfig)
|
new chipyard.config.AbstractConfig)
|
||||||
|
|
||||||
class dmiSpikeUltraFastConfig extends Config(
|
class dmiSpikeUltraFastConfig extends Config(
|
||||||
new chipyard.harness.WithSerialAdapterTiedOff ++ // don't attach an external SimSerial
|
new chipyard.harness.WithSerialTLTiedOff ++ // don't attach anything to serial-tilelink
|
||||||
new chipyard.config.WithDMIDTM ++ // have debug module expose a clocked DMI port
|
new chipyard.config.WithDMIDTM ++ // have debug module expose a clocked DMI port
|
||||||
new SpikeUltraFastConfig)
|
new SpikeUltraFastConfig)
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import freechips.rocketchip.util.{PlusArg}
|
|||||||
import freechips.rocketchip.subsystem.{CacheBlockBytes}
|
import freechips.rocketchip.subsystem.{CacheBlockBytes}
|
||||||
import freechips.rocketchip.devices.debug.{SimJTAG}
|
import freechips.rocketchip.devices.debug.{SimJTAG}
|
||||||
import freechips.rocketchip.jtag.{JTAGIO}
|
import freechips.rocketchip.jtag.{JTAGIO}
|
||||||
import testchipip.{SerialTLKey, SerialAdapter, UARTAdapter, SimDRAM}
|
import testchipip.{SerialTLKey, UARTAdapter, SimDRAM, TSIHarness, SimTSI}
|
||||||
import chipyard.harness.{BuildTop}
|
import chipyard.harness.{BuildTop}
|
||||||
|
|
||||||
// A "flat" TestHarness that doesn't use IOBinders
|
// A "flat" TestHarness that doesn't use IOBinders
|
||||||
@@ -51,12 +51,12 @@ class FlatTestHarness(implicit val p: Parameters) extends Module {
|
|||||||
memOverSerialTLClockBundle.reset := reset
|
memOverSerialTLClockBundle.reset := reset
|
||||||
val serial_bits = dut.serial_tl_pad.bits
|
val serial_bits = dut.serial_tl_pad.bits
|
||||||
dut.serial_tl_pad.clock := clock
|
dut.serial_tl_pad.clock := clock
|
||||||
val harnessMultiClockAXIRAM = SerialAdapter.connectHarnessMultiClockAXIRAM(
|
val harnessMultiClockAXIRAM = TSIHarness.connectMultiClockAXIRAM(
|
||||||
lazyDut.system.serdesser.get,
|
lazyDut.system.serdesser.get,
|
||||||
serial_bits,
|
serial_bits,
|
||||||
memOverSerialTLClockBundle,
|
memOverSerialTLClockBundle,
|
||||||
reset)
|
reset)
|
||||||
io.success := SerialAdapter.connectSimSerial(harnessMultiClockAXIRAM.module.io.tsi_ser, clock, reset)
|
io.success := SimTSI.connect(Some(harnessMultiClockAXIRAM.module.io.tsi), clock, reset)
|
||||||
|
|
||||||
// connect SimDRAM from the AXI port coming from the harness multi clock axi ram
|
// connect SimDRAM from the AXI port coming from the harness multi clock axi ram
|
||||||
(harnessMultiClockAXIRAM.mem_axi4 zip harnessMultiClockAXIRAM.memNode.edges.in).map { case (axi_port, edge) =>
|
(harnessMultiClockAXIRAM.mem_axi4 zip harnessMultiClockAXIRAM.memNode.edges.in).map { case (axi_port, edge) =>
|
||||||
|
|||||||
@@ -157,13 +157,13 @@ class WithSimAXIMemOverSerialTL extends OverrideHarnessBinder({
|
|||||||
val memOverSerialTLClockBundle = th.harnessClockInstantiator.requestClockBundle("mem_over_serial_tl_clock", memFreq)
|
val memOverSerialTLClockBundle = th.harnessClockInstantiator.requestClockBundle("mem_over_serial_tl_clock", memFreq)
|
||||||
val serial_bits = port.bits
|
val serial_bits = port.bits
|
||||||
port.clock := th.buildtopClock
|
port.clock := th.buildtopClock
|
||||||
val harnessMultiClockAXIRAM = SerialAdapter.connectHarnessMultiClockAXIRAM(
|
val harnessMultiClockAXIRAM = TSIHarness.connectMultiClockAXIRAM(
|
||||||
system.serdesser.get,
|
system.serdesser.get,
|
||||||
serial_bits,
|
serial_bits,
|
||||||
memOverSerialTLClockBundle,
|
memOverSerialTLClockBundle,
|
||||||
th.buildtopReset)
|
th.buildtopReset)
|
||||||
// DOC include end: HarnessClockInstantiatorEx
|
// DOC include end: HarnessClockInstantiatorEx
|
||||||
val success = SerialAdapter.connectSimSerial(harnessMultiClockAXIRAM.module.io.tsi_ser, th.buildtopClock, th.buildtopReset.asBool)
|
val success = SimTSI.connect(Some(harnessMultiClockAXIRAM.module.io.tsi), th.buildtopClock, th.buildtopReset.asBool)
|
||||||
when (success) { th.success := true.B }
|
when (success) { th.success := true.B }
|
||||||
|
|
||||||
// connect SimDRAM from the AXI port coming from the harness multi clock axi ram
|
// connect SimDRAM from the AXI port coming from the harness multi clock axi ram
|
||||||
@@ -299,7 +299,7 @@ class WithTiedOffDebug extends OverrideHarnessBinder({
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
class WithSerialAdapterTiedOff extends OverrideHarnessBinder({
|
class WithSerialTLTiedOff extends OverrideHarnessBinder({
|
||||||
(system: CanHavePeripheryTLSerial, th: HasHarnessSignalReferences, ports: Seq[ClockedIO[SerialIO]]) => {
|
(system: CanHavePeripheryTLSerial, th: HasHarnessSignalReferences, ports: Seq[ClockedIO[SerialIO]]) => {
|
||||||
implicit val p = chipyard.iobinders.GetSystemParameters(system)
|
implicit val p = chipyard.iobinders.GetSystemParameters(system)
|
||||||
ports.map({ port =>
|
ports.map({ port =>
|
||||||
@@ -312,15 +312,15 @@ class WithSerialAdapterTiedOff extends OverrideHarnessBinder({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
class WithSimSerial extends OverrideHarnessBinder({
|
class WithSimTSIOverSerialTL extends OverrideHarnessBinder({
|
||||||
(system: CanHavePeripheryTLSerial, th: HasHarnessSignalReferences, ports: Seq[ClockedIO[SerialIO]]) => {
|
(system: CanHavePeripheryTLSerial, th: HasHarnessSignalReferences, ports: Seq[ClockedIO[SerialIO]]) => {
|
||||||
implicit val p = chipyard.iobinders.GetSystemParameters(system)
|
implicit val p = chipyard.iobinders.GetSystemParameters(system)
|
||||||
ports.map({ port =>
|
ports.map({ port =>
|
||||||
val bits = port.bits
|
val bits = port.bits
|
||||||
port.clock := th.buildtopClock
|
port.clock := th.buildtopClock
|
||||||
withClockAndReset(th.buildtopClock, th.buildtopReset) {
|
withClockAndReset(th.buildtopClock, th.buildtopReset) {
|
||||||
val ram = SerialAdapter.connectHarnessRAM(system.serdesser.get, bits, th.buildtopReset)
|
val ram = TSIHarness.connectRAM(system.serdesser.get, bits, th.buildtopReset)
|
||||||
val success = SerialAdapter.connectSimSerial(ram.module.io.tsi_ser, th.buildtopClock, th.buildtopReset.asBool)
|
val success = SimTSI.connect(Some(ram.module.io.tsi), th.buildtopClock, th.buildtopReset.asBool)
|
||||||
when (success) { th.success := true.B }
|
when (success) { th.success := true.B }
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -335,11 +335,11 @@ class WithUARTSerial extends OverrideHarnessBinder({
|
|||||||
val bits = port.bits
|
val bits = port.bits
|
||||||
port.clock := th.buildtopClock
|
port.clock := th.buildtopClock
|
||||||
withClockAndReset(th.buildtopClock, th.buildtopReset) {
|
withClockAndReset(th.buildtopClock, th.buildtopReset) {
|
||||||
val ram = SerialAdapter.connectHarnessRAM(system.serdesser.get, bits, th.buildtopReset)
|
val ram = TSIHarness.connectRAM(system.serdesser.get, bits, th.buildtopReset)
|
||||||
val uart_to_serial = Module(new UARTToSerial(freq, UARTParams(0)))
|
val uart_to_serial = Module(new UARTToSerial(freq, UARTParams(0)))
|
||||||
val serial_width_adapter = Module(new SerialWidthAdapter(
|
val serial_width_adapter = Module(new SerialWidthAdapter(
|
||||||
8, SerialAdapter.SERIAL_TSI_WIDTH))
|
8, TSI.WIDTH))
|
||||||
ram.module.io.tsi_ser.flipConnect(serial_width_adapter.io.wide)
|
ram.module.io.tsi.flipConnect(serial_width_adapter.io.wide)
|
||||||
UARTAdapter.connect(Seq(uart_to_serial.io.uart), uart_to_serial.div)
|
UARTAdapter.connect(Seq(uart_to_serial.io.uart), uart_to_serial.div)
|
||||||
serial_width_adapter.io.narrow.flipConnect(uart_to_serial.io.serial)
|
serial_width_adapter.io.narrow.flipConnect(uart_to_serial.io.serial)
|
||||||
th.success := false.B
|
th.success := false.B
|
||||||
|
|||||||
@@ -67,16 +67,16 @@ class WithFireSimIOCellModels extends Config((site, here, up) => {
|
|||||||
case IOCellKey => FireSimIOCellParams()
|
case IOCellKey => FireSimIOCellParams()
|
||||||
})
|
})
|
||||||
|
|
||||||
class WithSerialBridge extends OverrideHarnessBinder({
|
class WithTSIBridgeAndHarnessRAMOverSerialTL extends OverrideHarnessBinder({
|
||||||
(system: CanHavePeripheryTLSerial, th: FireSim, ports: Seq[ClockedIO[SerialIO]]) => {
|
(system: CanHavePeripheryTLSerial, th: FireSim, ports: Seq[ClockedIO[SerialIO]]) => {
|
||||||
ports.map { port =>
|
ports.map { port =>
|
||||||
implicit val p = GetSystemParameters(system)
|
implicit val p = GetSystemParameters(system)
|
||||||
val bits = port.bits
|
val bits = port.bits
|
||||||
port.clock := th.buildtopClock
|
port.clock := th.buildtopClock
|
||||||
val ram = withClockAndReset(th.buildtopClock, th.buildtopReset) {
|
val ram = withClockAndReset(th.buildtopClock, th.buildtopReset) {
|
||||||
SerialAdapter.connectHarnessRAM(system.serdesser.get, bits, th.buildtopReset)
|
TSIHarness.connectRAM(system.serdesser.get, bits, th.buildtopReset)
|
||||||
}
|
}
|
||||||
SerialBridge(th.buildtopClock, ram.module.io.tsi_ser, p(ExtMem).map(_ => MainMemoryConsts.globalName), th.buildtopReset.asBool)
|
TSIBridge(th.buildtopClock, ram.module.io.tsi, p(ExtMem).map(_ => MainMemoryConsts.globalName), th.buildtopReset.asBool)
|
||||||
}
|
}
|
||||||
Nil
|
Nil
|
||||||
}
|
}
|
||||||
@@ -128,13 +128,13 @@ class WithAXIOverSerialTLCombinedBridges extends OverrideHarnessBinder({
|
|||||||
val serial_bits = port.bits
|
val serial_bits = port.bits
|
||||||
port.clock := th.buildtopClock
|
port.clock := th.buildtopClock
|
||||||
val harnessMultiClockAXIRAM = withClockAndReset(th.buildtopClock, th.buildtopReset) {
|
val harnessMultiClockAXIRAM = withClockAndReset(th.buildtopClock, th.buildtopReset) {
|
||||||
SerialAdapter.connectHarnessMultiClockAXIRAM(
|
TSIHarness.connectMultiClockAXIRAM(
|
||||||
system.serdesser.get,
|
system.serdesser.get,
|
||||||
serial_bits,
|
serial_bits,
|
||||||
axiClockBundle,
|
axiClockBundle,
|
||||||
th.buildtopReset)
|
th.buildtopReset)
|
||||||
}
|
}
|
||||||
SerialBridge(th.buildtopClock, harnessMultiClockAXIRAM.module.io.tsi_ser, Some(MainMemoryConsts.globalName), th.buildtopReset.asBool)
|
TSIBridge(th.buildtopClock, harnessMultiClockAXIRAM.module.io.tsi, Some(MainMemoryConsts.globalName), th.buildtopReset.asBool)
|
||||||
|
|
||||||
// connect SimAxiMem
|
// connect SimAxiMem
|
||||||
(harnessMultiClockAXIRAM.mem_axi4 zip harnessMultiClockAXIRAM.memNode.edges.in).map { case (axi4, edge) =>
|
(harnessMultiClockAXIRAM.mem_axi4 zip harnessMultiClockAXIRAM.memNode.edges.in).map { case (axi4, edge) =>
|
||||||
@@ -232,7 +232,7 @@ class WithFireSimFAME5 extends ComposeIOBinder({
|
|||||||
|
|
||||||
// Shorthand to register all of the provided bridges above
|
// Shorthand to register all of the provided bridges above
|
||||||
class WithDefaultFireSimBridges extends Config(
|
class WithDefaultFireSimBridges extends Config(
|
||||||
new WithSerialBridge ++
|
new WithTSIBridgeAndHarnessRAMOverSerialTL ++
|
||||||
new WithNICBridge ++
|
new WithNICBridge ++
|
||||||
new WithUARTBridge ++
|
new WithUARTBridge ++
|
||||||
new WithBlockDeviceBridge ++
|
new WithBlockDeviceBridge ++
|
||||||
@@ -245,7 +245,7 @@ class WithDefaultFireSimBridges extends Config(
|
|||||||
|
|
||||||
// Shorthand to register all of the provided mmio-only bridges above
|
// Shorthand to register all of the provided mmio-only bridges above
|
||||||
class WithDefaultMMIOOnlyFireSimBridges extends Config(
|
class WithDefaultMMIOOnlyFireSimBridges extends Config(
|
||||||
new WithSerialBridge ++
|
new WithTSIBridgeAndHarnessRAMOverSerialTL ++
|
||||||
new WithUARTBridge ++
|
new WithUARTBridge ++
|
||||||
new WithBlockDeviceBridge ++
|
new WithBlockDeviceBridge ++
|
||||||
new WithFASEDBridge ++
|
new WithFASEDBridge ++
|
||||||
|
|||||||
Submodule generators/testchipip updated: 2bbf3a2fe4...363b683552
Submodule sims/firesim updated: 3ae68ec307...5f9bf2b42b
@@ -52,7 +52,7 @@ SIM_FILE_REQS += \
|
|||||||
|
|
||||||
# the following files are needed for emulator.cc to compile (even if they aren't part of the RTL build)
|
# the following files are needed for emulator.cc to compile (even if they aren't part of the RTL build)
|
||||||
SIM_FILE_REQS += \
|
SIM_FILE_REQS += \
|
||||||
$(TESTCHIP_RSRCS_DIR)/testchipip/csrc/SimSerial.cc \
|
$(TESTCHIP_RSRCS_DIR)/testchipip/csrc/SimTSI.cc \
|
||||||
$(TESTCHIP_RSRCS_DIR)/testchipip/csrc/testchip_tsi.cc \
|
$(TESTCHIP_RSRCS_DIR)/testchipip/csrc/testchip_tsi.cc \
|
||||||
$(TESTCHIP_RSRCS_DIR)/testchipip/csrc/testchip_tsi.h \
|
$(TESTCHIP_RSRCS_DIR)/testchipip/csrc/testchip_tsi.h \
|
||||||
$(TESTCHIP_RSRCS_DIR)/testchipip/csrc/SimDRAM.cc \
|
$(TESTCHIP_RSRCS_DIR)/testchipip/csrc/SimDRAM.cc \
|
||||||
|
|||||||
Reference in New Issue
Block a user