clashilator: Automated Clash to Verilator bridge

[ development, hardware, library, mit, program ] [ Propose Tags ]

Code generator and Setup.hs hooks to generate a Verilator simulation and access it from Clash


[Skip to Readme]

Modules

[Last Documentation]

  • Clash
    • Clash.Clashilator
      • Clash.Clashilator.Setup

Downloads

Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.

Maintainer's Corner

Package maintainers

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 && <1.6 || >=2.0 && <2.1), base (>=4.14 && <5), Cabal (>=3.2.1 && <3.5), clash-ghc (>=1.4.2 && <1.5 || >=1.6.1 && <1.7), clash-lib (>=1.4.2 && <1.5 || >=1.6.1 && <1.7), 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
Revised Revision 1 made by GergoErdi at 2024-04-14T08:00:19Z
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
Uploaded by GergoErdi at 2022-09-04T09:45:52Z
Distributions
Executables clashilator
Downloads 387 total (47 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs not available [build log]
All reported builds failed as of 2022-09-04 [all 2 reports]

Readme for clashilator-0.1.2.1

[back to package description]

Clashilator: Automated Clash - Verilator integration

This package provides Cabal Setup.hs functionality to automatically integrate Verilator into your Clash project.

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.