Verilog HDL语法错误,靠近文本“;“为”;;期待;endmodule";

Verilog HDL语法错误,靠近文本“;“为”;;期待;endmodule";,verilog,Verilog,于是我开始学习verilog,并在其中实现了一个基本的二进制加法器。 根据我对verilog有限的理解,下面应该添加两个16位值 module ADD(X, Y, Z); input[15:0] X; input[15:0] Y; output Z[15:0]; wire C[15:0]; assign C[0] = 0; integer i; for(i=1; i<16; i=i+1) begin assign C[i]=(X[i-1]&Y[i-1])|(X[i-1]&am

于是我开始学习verilog,并在其中实现了一个基本的二进制加法器。 根据我对verilog有限的理解,下面应该添加两个16位值

module ADD(X, Y, Z);
input[15:0] X;
input[15:0] Y;

output Z[15:0];
wire C[15:0];

assign C[0] = 0;
integer i;
for(i=1; i<16; i=i+1) begin 
assign C[i]=(X[i-1]&Y[i-1])|(X[i-1]&C[i-1])|(Y[i-1]&C[i-1]);
end
for(i=0; i<16; i=i+1) begin
assign Z[i]=X[i]^Y[i]^C[i];
end
endmodule
模块添加(X,Y,Z);
输入[15:0]X;
输入[15:0]Y;
输出Z[15:0];
导线C[15:0];
分配C[0]=0;
整数i;

对于(i=1;i将
i
的定义从
integer
更改为
genvar

请注意,
for
循环可以在
始终
块中使用,也可以在
生成
块中使用。后者隐式地表示您在代码中使用它的上下文。在生成块中,循环变量的类型应为
genvar


for循环中的更多信息是在always块之外使用的,因此
i
需要是
genvar
而不是
integer
。此外,您可能希望Z和C声明压缩数组而不是解包数组,将
[15:0]
移动到另一端

output [15:0] Z; // make as packed bits
wire [15:0] C;

assign C[0] = 0;
genvar i; // not integer
generate // Required for IEEE 1364-2001, optional for *-2005 and SystemVerilog
for(i=1; i<16; i=i+1) begin 
  assign C[i]=(X[i-1]&Y[i-1])|(X[i-1]&C[i-1])|(Y[i-1]&C[i-1]);
end
for(i=0; i<16; i=i+1) begin
  assign Z[i]=X[i]^Y[i]^C[i];
end
endgenerate // must be matched with a generate
备选方案3:行为分配

output [15:0] Z;

wire [15:0] C = { (X&Y)|(X&C)|(Y&C) , 1'b0 };
assign Z = X^Y^C;
output [15:0] Z;
assign Z = X+Y;

工作示例

您可以使用:
output[15:0]Z;wire[15:0]C={(X&Y)|(X&C)|(Y&C),1'b0};assign Z=X^Y^C;
跳过for循环。如果您不需要演示全加器操作,那么只需说
assign Z=X+Y;
我试过做C={(X&Y)|(X&C)|(Y&C)}我得到一个错误,说我必须单独分配给数组元素。我猜C仍然声明为
wire C[15:0]
,应该是
wire[15:0]C
。它们有不同的含义。工作示例[此处]()(ModelSim10.1d/Icarus0.10)这解决了问题,谢谢Greg!我用genvar替换了上面代码中的整数,仍然得到相同的错误。@Harry,你在用什么模拟器?所有的替代解决方案都有效,但第一个解决方案仍然给我相同的错误。我使用的是Quartus II 13。1@Harry,我做了一些挖掘;Veilog-2001需要一个
generate
/
endgeneate
包装器。它对于Verilog-2005和SystemVerilog是可选的。Quartus支持Verilog-2001,而不是Verilog-2005。当文件以
.sv
而不是
.v
结尾时,Quartus确实支持SystemVerilog。要使第一个解决方案起作用,请添加
生成
/
endgeneate
(请参阅更新的答案)或者通过重命名文件来启用SystemVerilog。
output [15:0] Z;
assign Z = X+Y;