40 lines
1.5 KiB
ReStructuredText
40 lines
1.5 KiB
ReStructuredText
.. _dma-devices:
|
|
|
|
Adding a DMA Device
|
|
===================
|
|
|
|
DMA devices are Tilelink widgets which act as masters. In other words,
|
|
DMA devices can send their own read and write requests to the chip's memory
|
|
system.
|
|
|
|
For IO devices or accelerators (like a disk or network driver), instead of
|
|
having the CPU poll data from the device, we may want to have the device write
|
|
directly to the coherent memory system instead. For example, here is a device
|
|
that writes zeros to the memory at a configured address.
|
|
|
|
.. literalinclude:: ../../generators/chipyard/src/main/scala/InitZero.scala
|
|
:language: scala
|
|
|
|
.. literalinclude:: ../../generators/chipyard/src/main/scala/Top.scala
|
|
:language: scala
|
|
:start-after: DOC include start: Top
|
|
:end-before: DOC include end: Top
|
|
|
|
We use ``TLHelper.makeClientNode`` to create a TileLink client node for us.
|
|
We then connect the client node to the memory system through the front bus (fbus).
|
|
For more info on creating TileLink client nodes, take a look at :ref:`Client Node`.
|
|
|
|
Once we've created our top-level module including the DMA widget, we can create a configuration for it as we did before.
|
|
|
|
.. literalinclude:: ../../generators/chipyard/src/main/scala/InitZero.scala
|
|
:language: scala
|
|
:start-after: DOC include start: WithInitZero
|
|
:end-before: DOC include end: WithInitZero
|
|
|
|
.. literalinclude:: ../../generators/chipyard/src/main/scala/RocketConfigs.scala
|
|
:language: scala
|
|
:start-after: DOC include start: InitZeroRocketConfig
|
|
:end-before: DOC include end: InitZeroRocketConfig
|
|
|
|
|