| CARVIEW |
clashilator: Automated Clash to Verilator bridge
Code generator and Setup.hs hooks to generate a Verilator simulation and access it from Clash
[Skip to Readme]
Downloads
- clashilator-0.1.4.tar.gz [browse] (Cabal source package)
- Package description (as included in the package)
Maintainer's Corner
For package maintainers and hackage trustees
Candidates
- No Candidates
| Versions [RSS] | 0.1.0, 0.1.1, 0.1.2, 0.1.2.1, 0.1.3, 0.1.4 |
|---|---|
| Dependencies | aeson (>=1.5 && <3.0), base (>=4.14 && <5), Cabal (>=3.2.1 && <3.9), clash-ghc (>=1.4.2 && <2.0), clash-lib (>=1.4.2 && <2.0), containers, filepath, ghc, lens, optparse-applicative, shake, stache (>=2.3 && <2.4), text, unordered-containers [details] |
| License | MIT |
| Author | Gergő Érdi |
| Maintainer | gergo@erdi.hu |
| Uploaded | by GergoErdi at 2024-04-20T10:21:37Z |
| Category | Hardware, Development |
| Home page | https://github.com/gergoerdi/clashilator#readme |
| Bug tracker | https://github.com/gergoerdi/clashilator/issues |
| Source repo | head: git clone https://github.com/gergoerdi/clashilator |
| Distributions | |
| Executables | clashilator |
| Downloads | 645 total (21 in the last 30 days) |
| Rating | (no votes yet) [estimated by Bayesian average] |
| Your Rating |
|
| Status | Docs available [build log] Last success reported on 2024-04-20 [all 1 reports] |
Readme for clashilator-0.1.4
[back to package description]Clashilator: Automated Clash - Verilator integration
This package provides Cabal Setup.hs functionality to automatically
integrate Verilator into your Clash project.
- Detailed introduction: https://unsafePerform.IO/blog/2020-05-07-integrating_verilator_and_clash_via_cabal/
- Example project: https://github.com/gergoerdi/clashilator-example
Usage
Suppose you have a Clash circuit that you want to simulate using Verilator, and then write Haskell code to interact with that simulation. If your Clash code looks like this:
topEntity
:: "CLK" ::: Clock System
-> "FOO" ::: Signal System Bit
-> "BAR" ::: Signal System (Unsigned 4)
-> ( "BAZ" ::: Signal System (Unsigned 10)
, "QUUX" ::: Signal System Bit
)
topEntity = ...
makeTopEntity 'topEntity
and you put this in your Cabal file (x-clashilator-clock can be
omitted if you have only a single clock):
custom-setup
setup-depends: clashilator
executable MySim
main-is: simulator.hs
x-clashilator-clock: CLK
x-clashilator-top-is: MyCircuit
then in your simulator.hs, you can import the "virtual" module
Clash.Clashilator.FFI which provides the following definitions:
data INPUT = INPUT
{ iFOO :: Bit
, iBAR :: Word8
}
deriving (Show)
instance Storable INPUT
data OUTPUT = OUTPUT
{ oBAZ :: Word16
, oQUUX :: Bit
}
deriving (Show)
instance Storable OUTPUT
data Sim
simInit :: IO (Ptr Sim)
simShutdown :: Ptr Sim -> IO ()
simStep :: Ptr Sim -> Ptr INPUT -> Ptr OUTPUT -> IO ()
Note that input and output buses are represented as the smallest
possible Word type, to improve marshalling cost when crossing the
Haskell-C++ barrier.