文本“for”附近的Verilog HDL语法错误;期待“endmodule”

时间:2014-05-16 21:48:31

标签: 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]&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

但是,当我尝试合成上述内容时,我收到错误。

错误(10170):在文本“for”附近的add.v(10)处的Verilog HDL语法错误;期待“endmodule”

我不确定代码有什么问题。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:1)

i的定义从integer更改为genvar

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

IEEE Std 1800-2012

中的更多信息

答案 1 :(得分:1)

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

替代解决方案1:使用始终阻止

output reg[15:0] Z; // make as reg
reg [15:0] C;

integer i; // integer OK
always @* begin
  for(i=1; i<16; i=i+1) begin
    if (i==0)  C[i] = 1'b0;
    else       C[i]=(X[i-1]&Y[i-1])|(X[i-1]&C[i-1])|(Y[i-1]&C[i-1]);
    Z[i]=X[i]^Y[i]^C[i];
  end
end

替代解决方案2:逐位分配

output [15:0] Z;

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

替代解决方案3:行为分配

output [15:0] Z;
assign Z = X+Y;

工作示例here