MATLAB: Does Loop Streaming not work for the nested loop when generating HDL Code

coder.hdl.loopspecHDL Coderlooploopsnestedstreaming

I would like to decrease hardware resource usage in my FPGA design by applying Loop Streaming optimization. In the Check Report provided after HDL code generation, I can see a warning that streaming failed:
"Could not apply coder.hdl.loopspec pragma with the 'stream' option. This could be because the 'stream' option
was applied on a loop containing a nested loop with a streaming factor that is not equal to the number of iterations,
or because the 'stream' option was applied in a System Object."
My loop indeed contains a nested loop, but the streaming factor is accurate. Also, I have closely followed the requirements and limitations given on the Optimize MATLAB Loops documentation page.
Why is streaming still failing?

Best Answer

Besides the points mentioned on the documentation page, nested loops are only supported for streaming when the loop body resides in the nested loop alone, i.e. loop over rows in outer loop and columns in inner loop for some element-wise operations on a matrix.
If the loop body almost solely lives in the outer loop, it cannot be streamed as it is. In this case, in order to do loop streaming on the outer loop, this nested loop could be unrolled. This can be done by using a second loopspec pragma and specifying 'unroll' in it at the nested loop:
coder.hdl.loopspec('stream')
for i = 1:N
%...


coder.hdl.loopspec('unroll')
for j = 1:M
%...
end
%...
end