我试图使用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
a
&amp; b
被声明为父模块的输入数组,out
被声明为连线数组。
我在这里做错了什么?这是Verilog不允许的吗? Quartus告诉我:
Error (10644): Verilog HDL error at driver.v(63): this block requires a name
第63行是上面的for循环。任何帮助表示赞赏!
答案 0 :(得分:10)
您可以在开始后使用冒号将标签标识符应用于begin
- end
块(示例: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
答案 1 :(得分:3)
我知道这并没有直接回答这个问题,但你也可以在这个阵型中声明几个模块而不使用像这样的generate
块:
status whatever_status[10:0] (
.clk(clk),
.reset_n(reset_n),
.a(a),
.b(b),
.out(out)
);
这相当于上面的generate
块,假设传递的a
,b
和out
被声明为[10:0]
。只要它们是模块中声明的整数倍,该语法就可以工作;它们将在每个实例之间均匀分布,否则合成将引发错误。
例如,如果a
,b
和out
被声明为[21:0]
,则每2位将传递给每个实例,并假设它们已声明在[1:0]
模块中为status
。
答案 2 :(得分:2)
给你的区块命名:
for (i=1; i<=10; i=i+1) begin: my_status