verilog 常见的位宽问题集合
1. 位宽不等
wire b[31:0];
assign b = 5'b0;
这种错误常见于赋值操作中。
2. 保留最低位
wire b;
assign b = 32'h5;
此时因为b缺省定义为1位长度,因此只能被赋值最低为1。
3.位宽不匹配
wire b[4:0];
reg a;
assign b = 5'ha;
always @(*) begin
if(b)begin
a = 1;
end
end
此段代码本意是想判断若b不为5’b0则将a赋值为1。但由于verilog的判断只对1位数据有效,因此取最低位0判断为无效。
有两种解决办法:
- 用比较运算符取代
本例中,可以使用if(b != 5’b0)代替 - 用规约运算符
本例中,可以使用if(|b)代替
第三种位宽问题最难识别,也很容易出问题。
2024年4月22日,评论区补充:
上述写法存在报错:
(modelsim报错信息:** Error: tb_top.v(9): (vlog-2110) Illegal reference to net array “b”.)
wire [4:0] b;
reg a;
assign b = 5'ha;
always @(*) begin
if(b)begin
a = 1;
end
end
这位朋友的平台为Modelsim SE-64 10.4。
笔者未验证,特列在此。
感谢@璃_