I will start with an overview of designing a complex IP core in HardCaml. Later I will discuss some specific techniques that can be employed to help raise the level of abstraction over standard RTL design flows.
One of the key advantages to designing hardware with HardCaml is the ability to keep both a reference model and the hardware model in the same language. Indeed in the same program.
This offers the designer the ability to cross check between the models at almost completely arbitrary points.
In contrast many standard design flows use a different language for the reference model (probably C) and hardware design (Verilog or VHDL).
When iterating between models removing the language barrier, and associated trace or debug files, is a big win for HardCaml.
A further advantage to bringing the software model and hardware design together is that it allows a both to be iteratively refined towards the final goal.
Here's an example design flow recently used to develop a Reed-Solomon ECC core.
Efficient hardware usually requires conversion of floating point to fixed point arithmetic. Ensuring enough precision is a task resolved by either
HardCaml includes a Fixed point library making tasks 2 and 3 much simpler. Fixed points can be tracked throughout computations by the library along with precise control of rounding and overflow modes.
It's possible to go further, however, by augmenting the fixed point library. One example is self sizing data paths. Given knowledge of the ranges of input values the computations can track the input/output ranges of intermediate values and size buses appropriately. This approach was used to implement an IEEE compliant DCT with the only variable the precision of the sin tables.
In addition for heavily arithmetic circuits it's possible to imagine a way of tracking and specifying the error tolerances of certain arithmetic nodes and having the circuit optimise itself.
Probably the most interesting possibility is the ability to write spcialized domain specific languages. At their simplest something like the fixed point library can be considered a DSL. At their most complex a high level synthesis compiler could be written with HardCaml as a back end.
In between these extremes are various specialized DSL's that can leverage a little bit of compiler like technology to solve specific problems.