Some operations have scheduler limitations that restrict the final II of a design due to the resource used by the operation. These limitations fall into the following categories:
- Some types of non-scalar variable, limited by the read/write ports of
the mapped resource:
- Arrays mapped using interface, stream, or the
bind_storagepragma -
hls::stream, automatically mapped to a FIFOThe precise details are as follows:
- Each
m_axitop pointer, streamed array, andhls::streamhas one read and one write port. - Each block RAM or UltraRAM, if accessed only in
sequential regions and managed as a ping-ping buffer between
dataflow processes, has as many ports as specified by the
corresponding
bind_storagepragma:- You can explicitly add the pragma, or Vitis HLS can automatically infer it to satisfy the latency or II constraints.
- In the case of a PIPO, the pragma specifies
the number of ports available to each process:
-
RAM_1Phas one port, which can be used either for reading or for writing in a given cycle. -
RAM_2Phas two ports, one supporting one read or write per cycle and one supporting one read per cycle. -
RAM_S2Phas two ports, one for reading and one for writing. -
RAM_T2Phas two ports, both supporting one operation per cycle. -
RAM_1WnRhas N+1 ports, where N can be chosen by the scheduler (1 for writing, N≤16 for reading). -
ROMhas N read ports, where N is chosen by the scheduler.
-
- Each
- Arrays mapped using interface, stream, or the
- Pipelined or combinational operations, optionally limited by the
allocation pragma (without it, the scheduler replicates them as needed to meet the
required II):
- Fixed point multipliers
- Floating point operations
- Calls to a non-inlined subfunction