为何Verilog计数器赋值错误?HDLBits Popcount255问题疑问
Popcount255问题两次错误代码的原因解析
我在HDLBits网站学习Verilog时,已经解决了Popcount255问题(统计输入向量中'1'的个数),但想明确之前两次尝试的代码错误原因。
正确代码
module top_module( input [254:0] in, output [7:0] out ); int i ; reg [7:0] counter; always @(*) begin counter =0; for (i=0;i<255;i++)begin counter = (in[i]==1)? counter+1:counter; end out = counter ; end endmodule
第一次错误代码及原因
错误代码
module top_module( input [254:0] in, output [7:0] out ); int i ; reg [7:0] counter; always @(*) begin counter =0; for (i=0;i<255;i++)begin counter = (in[i]==1)? counter+1:counter; end end out = counter ; endmodule
错误原因
out = counter;写在了always @(*)块外部,属于语法错误:- Verilog中默认输出端口
out是wire类型,wire变量只能通过连续赋值assign语句驱动,不能用过程赋值=直接赋值。 - 即使忽略类型问题,过程块外的赋值会让综合器无法明确
out的驱动逻辑,导致电路生成异常。
- Verilog中默认输出端口
第二次错误代码及原因
错误代码
module top_module( input [254:0] in, output [7:0] out ); int i ; always @(*) begin out=0; for (i=0;i<255;i++)begin out = (in[i]==1)? out+1:out; end end endmodule
错误原因
- 输出端口
out默认是wire类型,而Verilog规定过程块(always/initial)内只能对reg类型变量进行赋值。直接在always @(*)块中修改wire类型的out违反语法规则,会引发编译错误,或导致综合器无法正确生成预期的组合逻辑。
内容的提问来源于stack exchange,提问作者mouad
相关产品推荐
相关产品推荐

