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!
As we saw in a previous article, bigger and complex designs are built by integrating multiple modules in a hierarchical manner. Modules can be instantiated within other modules and ports of these instances can be connected with other signals inside the parent module.
Verilog Generate Loop The syntax for a generate loop is similar to that of a for loop statement. The loop index variable must first be declared in a genvar declaration before it can be used. The genvar is used as an integer to evaluate the generate loop during elaboration.
Hardware modules may not be instantiated inside an always block. All of the always blocks in a module are considered to be parallel blocks of hardware. Likewise, modules are considered to be separate hardware blocks that operate in parallel. Functions, however, can be instantiated in an always block.
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 for 10 instances:
status whatever_status[9:0] (
.clk(clk),
.reset_n(reset_n),
.a(a),
.b(b),
.out(out)
);
This is equivalent to the generate
block above assuming that a
, b
, and out
being passed are declared as [9: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
, and out
are declared [19:0]
, then every 2 bits will be passed to each instance, and it is assumed they are declared as [1:0]
within the module status
.
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:
genvar i;
generate
for (i=1; i<=10; i=i+1) begin : generate_block_identifier // <-- example block name
status whatever_status (
.clk(clk),
.reset_n(reset_n),
.a(a[i]),
.b(b[i]),
.out(out[i])
);
end
endgenerate
Give your block a name:
for (i=1; i<=10; i=i+1) begin: my_status
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With