Module Hardcaml.Always
Always
is a DSL that lets one describe a circuit in the same style as a Verliog always
block.
if
and switch
control constructs are provided. (<--) is used for assignment.
Code is written as lists of assignments, if and control statements.
variables;
let var = wire (zero 8) in
let var = reg r_sync enable 8 in
assignment;
var <-- exp;
if statements;
if_ condition [ ... ] [ ... ]
switch statements;
switch condition [
of_int ~width:3 0, [ ... ];
of_int ~width:3 1, [ ... ];
of_int ~width:3 2, [ ... ];
of_int ~width:3 3, [ ... ];
]
signals;
let (s:signal) = q (v:guarded) in
compilation;
compile [ ... ]
example;
let state = reg r_sync enable 2 in let a = wire 8 in compile [ if_ (a.value ==:. 4) [ a <-- of_int ~width:8 2 ] [ switch state.value [ (of_int ~width:2 0) [ a <--. 3; state <-- of_int ~width:2 1; ]; (of_int ~width:2 1) [ a <--. 2; state <-- of_int ~width:2 2; ]; (of_int ~width:2 2) [ a <--. 1; state <-- of_int ~width:2 3; ]; (of_int ~width:2 3) [ a <--. 0; state <-- of_int ~width:2 4; ] ] ]; let state = state.value in let a = a.value in ....
val sexp_of_t : t -> Ppx_sexp_conv_lib.Sexp.t
type always
= t
module Variable : sig ... end
The type of variables in guarded assignments. Variables may be asychronous
wire
s, or synchronousreg
s. The current value of the variable may be accessed through thevalue
field below.
type 'a case
= 'a * t Hardcaml__.Import.list
type 'a cases
= 'a case Hardcaml__.Import.list
val if_ : Signal.t -> t Hardcaml__.Import.list -> t Hardcaml__.Import.list -> t
if statement
val elif : Signal.t -> t Hardcaml__.Import.list -> t Hardcaml__.Import.list -> t Hardcaml__.Import.list
else if branch
val when_ : Signal.t -> t Hardcaml__.Import.list -> t
if sel then
...
else
val unless : Signal.t -> t Hardcaml__.Import.list -> t
if sel then
else
...
val proc : t Hardcaml__.Import.list -> t
Allows sequences of expressions to be inserted into the code; a syntactic nicety.
val (<--) : Variable.t -> Signal.t -> t
assignment
val (<--.) : Variable.t -> Hardcaml__.Import.int -> t
assignment with an integer constant - width is inferred
module State_machine : sig ... end
val compile : t Hardcaml__.Import.list -> Hardcaml__.Import.unit
compile to structural code