所以我开始学习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”
我不确定代码有什么问题。任何帮助表示赞赏!
答案 0 :(得分:1)
将i
的定义从integer
更改为genvar
。
请注意,for
循环可以在always
块中使用,也可以在generate
块中使用。后者隐含在您的代码中使用它的上下文。在生成块中,循环变量应为genvar
类型。
答案 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