I'm trying to instantiate some modules in Verilog using a generate
block since I'm going to be instantiating a variable amount of them.
genvar i;
generate
for (i=1; i<=10; i=i+1) begin
status whatever_status (
.clk(clk),
.reset_n(reset_n),
.a(a[i]),
.b(b[i]),
.out(out[i])
);
end
endgenerate
a
& b
are declared as input arrays to the parent module and out
is declared as a array of wires.
What am I doing wrong here? Is this not allowed in Verilog? Quartus is telling me:
Error (10644): Verilog HDL error at driver.v(63): this block requires a name
Line 63 is the for loop above. Any help is appreciated!
Give your block a name:
You can apply label identifier to
begin
-end
block with a colon after the begin (example:begin : label
-end
. This has always been an optional feature for generate blocks, though it is highly recommended. Quartus should not be giving an error.It is an easy fix to satisfy Quartus-- add a label of any name you want:
I know this doesn't directly answer the question, but you can also declare several modules in this formation without using a
generate
block like so:This is equivalent to the
generate
block above assuming thata
,b
, andout
being passed are declared as[10:0]
. This syntax will work as long as they're integer multiples of how they're declared in the module; they'll be spread evenly among each instance, otherwise synthesis will throw an error.For example if
a
,b
, andout
are declared[21:0]
, then every 2 bits will be passed to each instance, and it is assumed they are declared as[1:0]
within the modulestatus
.