Loops in SystemVerilog
Loops exist in SystemVerilog, but they do not behave like in computer programs. Loops in computer programs are executed sequentially, but it's not possible to define a sequential loop in synthesizable SystemVerilog. Instead, when the loop is synthesized, each “iteration” of the loop will be synthesized into hardware, generating hardware that will perform all iterations in parallel, effectively unrolling the loop. Here's an example of a synthesizable for loop:
logic [SIZE-1:0] x; logic [SIZE-1:0] y; genvar i; always_comb begin for (i = 0; i < SIZE; i = i + 1) begin y = !x; end end
Optionally, the for loop can be placed inside a generate
block. This is required if unique hardware (such as an instance or always_
block) will be generated for each loop iteration.
logic [SIZE-1:0] x; logic [SIZE-1:0] y; genvar i; generate for (i = 0; i < SIZE; i = i + 1) begin always_comb begin y[i] = !x[i]; end end endgenerate
Limitations
Because of the nature of loops, there are some limitations on loops in synthesizable SystemVerilog.
- The number of iterations must be fixed.
- The iterations in the loop must be independent.