Verilog HDL语法错误,靠近文本“;“为”;;期待;endmodule";
于是我开始学习verilog,并在其中实现了一个基本的二进制加法器。 根据我对verilog有限的理解,下面应该添加两个16位值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
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;