Verilog HDL 生成块 的问题,为什么直接循环不行?

看了VERILOG的生成块那一节,没怎么看懂,然后上网搜了一下生成块的问题,结果搜出来一个人问的东西,但没人解答,求达人解答!

//错误的程序
module try(out,i0,i1);
parameter N=32;
中间声明变量省略掉,定义输出是out,输入是i0,i1
for(i=0;i<N;i=i+1)
begin
xor (out,i1,i0);
end
endmodule

上面是错误的,一定要用生成块才行

程序重写就省略了,只写循环部分:
genvar i;
generate for(i=0;i<N;i=i+1)
begin
xor(out,i1,i0);
end
endgenerate
endmodule

请问为什么必须用生成块,不能直接用循环呢?生成块的作用是什么?我看的是夏宇闻的verilog数字系统设计,觉得讲得不清不楚的。。。
去你妹的第一个答案,直接把别人的复制过来给我看,你当我不会搜百度啊?死去。。。

你要按照功能来啊。generate本来就是用来构建逻辑的,你这个位置就是实例化。而单纯的for只是用来做循环。2个在一起就是循环构建逻辑。你只是单纯的for,编译器当然不知道你是要干嘛。而且for是不能直接出现在module下的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-01-24
首先明确你的目的:从你上述代码来看,你是想要out1初始值为1,10个clock之后out1变成0。此代码如下----

module test(go,out,reset_n);
input go,reset_n;
output out;
wire out;
reg out1;
reg [3:0] counter;
assign out=out1;

always @(negedge go or negedge reset_n)
begin
if(!reset_n)
begin
out1 <= 1'b1;
counter <= 4'b0;
end
else
begin
if (counter==10)
begin
out1 <= 1'b0;
counter <= 4'd10;
end
else
begin
out1 <= 1'b1;
counter <= counter +4'd1;
end
end

end
endmodule

注意:reset_n是FPGA/CPLD的全局复位信号,如果你没有这个信号,那么out1的初始值是由你的芯片决定的,或者说是随机的
第2个回答  2011-01-24
这个没有为什么吧,只是verilog HDL里面是这么定义。你若是不遵循,可能综合或仿真时有些工具不支持。
system verilog中就可以省略"generate"/"endgenerate"了。
参考"IEEE STD 1800-2009 UNIFIED HARDWARE DESIGN, SPECIFICATION, AND VERIFICATION LANGUAGE" Page708

粘贴一段spec中的code,不要骂人:
Example 1—Examples of legal and illegal generate loops
module mod_a;
genvar i;
// "generate", "endgenerate" keywords are not required
for (i=0; i<5; i=i+1) begin:a
for (i=0; i<5; i=i+1) begin:b
... // error -- using "i" as loop index for
... // two nested generate loops
end
end
endmodule
module mod_b;
genvar i;
logic a;
for (i=1; i<0; i=i+1) begin: a
... // error -- "a" conflicts with name of variable "a"
end
endmodule
相似回答