Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Instantiate Modules in Generate For Loop in Verilog

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!

like image 845
Colin Avatar asked Nov 24 '15 17:11

Colin


People also ask

How do you instantiate multiple modules in Verilog?

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.

What is generate for loop in Verilog?

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.

Can we instantiate a module inside always block in Verilog?

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.


3 Answers

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.

like image 144
Patrick Roberts Avatar answered Nov 07 '22 12:11

Patrick Roberts


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
like image 44
Greg Avatar answered Nov 07 '22 11:11

Greg


Give your block a name:

for (i=1; i<=10; i=i+1) begin: my_status
like image 28
toolic Avatar answered Nov 07 '22 12:11

toolic