Take a non-rentrant function:
int multiply(int A, int B) { RA=A // This is our source code RB=B RC=0 while(RA>0) { if odd(RA) RC=RC+RB; RA = RA >> 1; RB = RB << 1; } return RC; }
This simple example has no multi-cycle primitives and a 1-to-1 mapping of ALUs to the source code text, so no schedulling was needed from the HLS tool.
Each register has a multiplexor that ranges over all the places it is loaded from.
We followed a syntax-directed approach with no search in the solution space for minimum clock cycles or minium area or maximum clock frequency.
The resulting block could serve as a primitive to be instantiated by an HLS tool. This example is not fully-pipelined and so typically would not be used for that purpose.
12: (C) 2008-17, DJ Greaves, University of Cambridge, Computer Laboratory. |