Main Content

For-Loop Best Practices for HDL Code Generation

When you generate HDL code from your MATLAB® design, you are converting an algorithm into an architecture that must meet hardware area and speed requirements. Some best practices for using loops in MATLAB code for HDL code generation are:

  • Use monotonically increasing loop counters, with increments of 1, to minimize the amount of hardware generated in the HDL code.

  • When implementing a loop to find an index value, use a conditional if-else statement inside of the loop.

  • If you want to use the loop streaming optimization:

    • When assigning new values to persistent variables inside a loop, do not use other persistent variables on the right side of the assignment. Instead, use an intermediate variable.

    • If a loop modifies any elements in a persistent array, the loop should modify all of the elements in the persistent array.

Monotonically Increasing Loop Counters

By using monotonically increasing loop counters with increments of 1, you can reduce the amount of hardware in the generated HDL code. The following loop is an example of a monotonically increasing loop counter with increments of 1.

a=1;
for i=1:10
    a=a+1;
end

If a loop counter increases by an increment other than 1, the generated HDL code can require additional adders. Due to this additional hardware, do not use the following type of loop.

a=1;
for i=1:2:10
    a=a+1;
end

If a loop counter decreases, the generated HDL code can require additional adders. Due to this additional hardware, do not use the following type of loop.

a=1;
for i=10:-1:1
    a=a+1;
end

Find Indices Using Loops

When generating HDL code, control flow-like breaks are not possible, see Supported MATLAB Data Types, Operators, and Control Flow Statements. Because a for loop must run for a constant number of iterations, to find an index using loops, use a conditional inside the loop, such as an if-else statement. For example, to find the first index of a one in the array u, you can use this code:

function y = fcn(u)

y = fi(0, 0, ceil(log2(numel(u))), 0);

for ii = cast(1:numel(u), 'like', y)
    if y == 0 && u(ii) == true
        y = ii;
    end
end
end

The final value for y is the smallest possible fixed-point value of the index that contains a one in the array u.

Persistent Variables in Loops

If a loop contains multiple persistent variables, when you assign values to persistent variables, use intermediate variables that are not persistent on the right side of the assignment. This practice makes dependencies clear to the compiler and assists internal optimizations during the HDL code generation process. If you want to use the loop streaming optimization to reduce the amount of generated hardware, this practice is recommended.

In the following example, var1 and var2 are persistent variables. var1 is used on the right side of the assignment. Because a persistent variable is on the right side of an assignment, do not use this type of loop:

for i=1:10
    var1 = 1 + i;
    var2 = var1 * 2;
end

Instead of using var1 on the right side of the assignment, use an intermediate variable that is not persistent. This example demonstrates this with the intermediate variable var_intermediate.

for i=1:10
    var_intermediate = 1 + i;
    var1 = var_intermediate;
    var2 = var_intermediate * 2;
end

Persistent Arrays in Loops

If a loop modifies elements in a persistent array, make sure that the loop modifies all of the elements in the persistent array. If all elements of the persistent array are not modified within the loop, HDL Coder™ cannot perform the loop streaming optimization.

In the following example, a is a persistent array. The first element is modified outside of the loop. Do not use this type of loop.

for i=2:10
    a(i)=1+i;
 end
 a(1)=24;

Rather than modifying the first element outside the loop, modify all of the elements inside the loop.

for i=1:10
   if i==1
      a(i)=24;
   else
      a(i)=1+i;
   end
end

See Also

Apps

Objects

Functions

Related Topics