Support independent operator start and output collection #1274
Labels
AMC
Needed for Andrew's memory compiler
C: Calyx
Extension or change to the Calyx IL
S: Discussion needed
Issues blocked on discussion
In the current version of Calyx it is generally assumed that each group issues a start to some component, waits for a done signal, and registers the outputs. However, there are many cases when using pipelined operators where we want to perform other computation while waiting for the output of that operator to be available.
One example of this is shown in PR #1270. We want to be able to feed new input data into a pipelined multiplier on every cycle to achieve an II of 1. This is the most obvious case where independent operator start and output collection is required. If we have to wait for the entire pipelined multiplier to finish before the group is done, we will never be able to achieve a real II of 1.
This issue isn't unique to pipelined loops however. A very common practice in unpipelined scheduling is resource sharing of pipelined resources. This is especially important for reducing the DSP usage for designs with a large number of multipliers.
As an example, let's consider the following scheduled, unpipelined design:

By unpipelined here, we really mean the II is equal to the latency of the loop body. As a result, there are major sharing opportunities available between the different operators. We only need 1 adder and 1 multiplier to implement these operations with this schedule, instead of 2 adders and 2 multipliers if we did the native implementation.
In particular, to share the multiplier we need to set input values on cycle 0 and 1 and read the outputs on cycles 2 and 3.
The text was updated successfully, but these errors were encountered: