Hardcaml.CyclesimCycle accurate simulator
module Port_list : sig ... endmodule Traced : sig ... endmodule Node : sig ... endmodule Reg : sig ... endmodule Memory : sig ... endRead and write access for memories. They have much the same API as Nodes. and Regs except for an extra address argument.
module Config : sig ... endtype t_port_list = (Port_list.t, Port_list.t) tval cycle : ?n:int -> (_, _) t -> unitAdvance by n clock cycles (check->comb->seq->comb). n defaults to 1.
val cycle_check : (_, _) t -> unitCheck inputs are valid before a simulation cycle
val cycle_before_clock_edge : (_, _) t -> unitUpdate combinatorial logic before clock edge and relative to new inputs.
val cycle_at_clock_edge : (_, _) t -> unitUpdate sequential logic - registers and memories.
val cycle_after_clock_edge : (_, _) t -> unitUpdate combinatorial logic after clock edge
val clock_mode : (_, _) t -> [ `All_one_domain | `By_input_clocks ]Clock mode specified in the config. See the Cyclesim0.Config of an explanation of each mode
val cycle_until_clocks_aligned : (_, _) t -> unitRepeatedly call cycle until all clocks specified in the config are aligned with their periods.
val reset : (_, _) t -> unitReset simulator
val raise_after_timeout :
?message:string ->
here:lexing_position ->
('i, 'o) t ->
timeout:int ->
('i, 'o) tAttach to a simulator and cause it to raise after the given number of steps. Resetting the simulation will also reset the timeouts.
val with_timeout :
?message:string ->
here:lexing_position ->
timeout:int ->
f:(('i, 'o) t -> 'c) ->
('i, 'o) t ->
'cRaise if the provided callback f takes more than timeout cycles to execute.
Signals and their unique (mangled) names to be traced by the simulation. Includes both IO ports and internal signals - the latter are accessible via the lookup function.
Get output port given a name. If clock_edge is Before the outputs are computed prior to the clock edge - After means the outputs are computed after the clock edge.
val inputs : ('i, _) t -> 'ival in_ports : (_, _) t -> Port_list.tval out_ports : ?clock_edge:Side.t -> (_, _) t -> Port_list.tval lookup_node : (_, _) t -> Traced.internal_signal -> Node.t optionCurrent value of an internal (combinational) node within the simulator.
val lookup_node_or_reg : (_, _) t -> Traced.internal_signal -> Node.t optionval lookup_reg : (_, _) t -> Traced.internal_signal -> Reg.t optionPeek at internal registers, return Some _ if it's present. Note that the node must marked as traced in Cyclesim.Config.t when creating simulations for this to return (Some _). Writing to the Bits.Mutable.t will change the simulation internal node's value and affect the results of simulation.
val lookup_mem : (_, _) t -> Traced.internal_signal -> Memory.t optionSimilar to lookup_data, but for memories. This is very useful for initializing memory contents without having to simulate the entire circuit.
val create : ?config:Config.t -> Circuit.t -> t_port_listconstruct a simulator from a circuit
module Combine_error : sig ... endval combine :
?port_sets_may_differ:bool ->
?on_error:(Combine_error.t -> unit) ->
('i, 'o) t ->
('i, 'o) t ->
('i, 'o) tCombine 2 simulators. The inputs are set on the 1st simulator and copied to the 2nd. Outputs are checked and on_error is called if a difference is found. By default, on_error raises.
The simulators should have the same input and output port sets, unless port_sets_may_differ is true, in which case only ports which exist on both simulators are checked.
module With_interface (I : Interface.S) (O : Interface.S) : sig ... endmodule Private : sig ... end