Field_ops_lib.Ground_multiplierA full "naive" multiplication module without tricks.
This module use used as the base case of more complicated recursive multipliers (eg: Karatsuba_ofman_mult and Approx_msb_multiplier)
This module offers 3 ways of implementing multipliers, which can be specified by Config.t, they are:
Verilog_multiply - this generates a a * b in verilog and lets the synthesizer decides how to implement it. This will usually get mapped into DSPs.Hybrid_dsp_and_luts - this generate a hybrid multiplier where the multiplier result computation is split into 2 parts, where some is done in DSP and some is done in LUTs.Mixed - Generates a Verilog_multiply for multiplication between unknowns. If one of the operand is a constant, it might optionally implement a custom lut-based multiplier depending on its value. Read on for more info.Mixed and Hybrid_dsp_and_luts also support a lut_only_hamming_weight_threshold that uses LUTs-only to implement multiplication when b is a constant and its Non-Adjacent Form has a low hamming weight. This is useful to tune LUT vs DSP trade-off in designs. The multiplier implemented in LUTs uses the high-school multiplication algorithm.
module Config : sig ... endval create :
clock:Hardcaml.Signal.t ->
enable:Hardcaml.Signal.t ->
config:Config.t ->
Hardcaml.Signal.t ->
Hardcaml.Signal.t ->
Hardcaml.Signal.tmodule For_testing : sig ... end