Col*_*lin 4 verilog system-verilog
我正在尝试使用generate
块在Verilog中实例化一些模块,因为我将实例化其中的可变数量.
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
Run Code Online (Sandbox Code Playgroud)
a
&b
被声明为父模块的输入数组,out
并被声明为连线数组.
我在这做错了什么?这是Verilog不允许的吗?Quartus告诉我:
Error (10644): Verilog HDL error at driver.v(63): this block requires a name
Run Code Online (Sandbox Code Playgroud)
第63行是上面的for循环.任何帮助表示赞赏!
Gre*_*reg 10
您可以在开始之后使用冒号将标签标识符应用于begin
- end
block(例如:begin : label
- end
.这一直是生成块的可选功能,但强烈建议使用.Quartus不应该给出错误.
这是一个简单的解决方案来满足Quartus--添加你想要的任何名称的标签:
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
Run Code Online (Sandbox Code Playgroud)
我知道这并不能直接回答这个问题,但是您也可以在这种形式中声明几个模块,而无需generate
为 10 个实例使用这样的块:
status whatever_status[9:0] (
.clk(clk),
.reset_n(reset_n),
.a(a),
.b(b),
.out(out)
);
Run Code Online (Sandbox Code Playgroud)
这等同于所述generate
块上面的假设a
,b
以及out
被传递被声明为[9:0]
。只要它们是它们在模块中声明的整数倍,这种语法就会起作用;它们将均匀分布在每个实例中,否则合成将引发错误。
例如,如果a
、b
和out
被声明[19:0]
,那么每 2 位将被传递给每个实例,并且假定它们被声明为[1:0]
在模块内status
。