1、位宽不匹配
Verilog编码中,常见的位宽不匹配错误,有赋值左右位宽不匹配(<=,=),比较位宽(>,<,>=,<=)不匹配,计算位宽(+,-)不匹配
位宽不匹配会导致综合产生的网表与个人预期差异较大,导致功能不正确。VCS仿真能及时发现问题,但VCS仿真存在部分场景没有覆盖的问题,因此仅仅通过VCS仿真不容易发现问题。通过spyglass lint检测可以发现所有位宽不匹配的情况。
2、位宽不匹配的危害
下文以比较位宽不匹配为例,讲解位宽不匹配的危害。
注意:
1)在条件判断中(if语句),不建议使用加减后结果直接进行比较,禁止进行加减运算后与位宽不匹配的数据/变量进行比较。
2)拼接符号中“{}”,不允许使用加减乘除等运算,综合类软件无法正确判断数据运算结果位宽。数字运算必须先通过wire指定位宽,然后通过assign得到运算结果
错误案例1
如下代码,代码本意是:当cnt0与cnt1之和大于8的时候,count加1。
错误代码中:
比较数据是4’h8,此时综合完成后的网表中,会将cnt0与cnt1之和截位成4bit,再与4’h8比较,如果cnt0与cnt1之和为5’h10000,在此会截位为4’h0000,反而小于4’h8,与预期功能不符
正确代码&推荐代码中:
先定义:wire [4:0] cnt_add ; 指定cnt_add位宽为5bit,然后assign cnt_add = (cnt0+cnt1) ;最后与5’h8比较,因为通过wire指定了位宽,所以对于各类综合软件而言都不会发生截位,不会发生错误。
正确代码&不推荐中
直接将4’h8修改为5’h8,也避免了cnt0+cnt1累加截位,但是spyglass lint会报warning,
不推荐。
reg [3:0] cnt0 ; reg [3:0] cnt1 ; reg [4:0] count ; reg ov_nc ; //-------------case 1----------------- //wrongcode错误代码 always @ (posedge clk or negedge rst_n) if(!rst_n)begin count <= 5'b0 ; end else if((cnt0+cnt1)>4'h8) //should be 5'h8 begin {ov_nc, count} <= count +1'b1; end //right ,but not recommended always @ (posedge clk or negedge rst_n) if(!rst_n)begin count <= 5'b0 ; end else if((cnt0+cnt1)>5'h8) //should be 5'h8 begin {ov_nc, count} <= count +1'b1; //right code and recommended 正确且推荐 wire [4:0] cnt_add ; assign cnt_add = (cnt0+cnt1) ; always @ (posedge clk or negedge rst_n) if(!rst_n)begin count <= 5'b0 ; end else if(cnt_add >5'h8) // (cnt0+cnt1) is 5 bits begin {ov_nc, count} <= count +1'b1; end 错误案例2
NOTE: 拼接符号中“{}”,不允许使用加减乘除等运算,综合类软件无法正确判断数据运算结果位宽。数字运算必须先通过wire指定位宽,然后通过assign得到运算结果。
错误代码中:
{1'b0,(cnt0+cnt1)} ,在if语句()拼接符号中,综合软件无法识别 (cnt0+cnt1)应该是多少bit,(cnt0+cnt1)可能会是5bit,也可能是4bit。
正确代码&推荐代码中
通过 wire [4:0] cnt_add ; assign cnt_add = (cnt0+cnt1) ; 指定了(cnt0+cnt1)之和为5bit,利用拼接符指定{1'b0,cnt_add}为6bit,然后与6bit的cnt2比较。
正确代码&不推荐中
通过 wire [4:0] cnt_add ; assign cnt_add = (cnt0+cnt1) ; 指定了(cnt0+cnt1)之和为5bit,但是直接与6bit的cnt2比较,各类综合软件也会正确识别位宽,不会发生截位,但是spyglass lint会报warning,虽然功能正确,但是不推荐。
//-------------case 2-----------------// reg [3:0] cnt0 ; reg [3:0] cnt1 ; reg [5:0] cnt2 ; //wrong code always @ (posedge clk or negedge rst_n) if(!rst_n)begin count <= 5'b0 ; end else if({1'b0,(cnt0+cnt1)}编辑:黄飞
-
Verilog
+关注
关注
28文章
1352浏览量
110517 -
VCS
+关注
关注
0文章
80浏览量
9661
原文标题:错误案例:位宽不匹配错误
文章出处:【微信号:IP与SoC设计,微信公众号:IP与SoC设计】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
从设备读取的idcode与bsdl文件中的idcode不匹配该怎么办?
带字库LCD12864写数据时类型不匹配
怎么实现RocketIOTM GTP在串行高速接口中的位宽设计?
Verilog 变量中位的数值类型
在SpinalHDL里有没有什么好的方式实现一个接口位宽转换呢
JPEG2000中位平面编码的存储优化方案设计
![JPEG2000<b class='flag-5'>中</b><b class='flag-5'>位</b>平面<b class='flag-5'>编码</b>的存储优化方案设计](https://file1.elecfans.com//web2/M00/A5/F6/wKgZomUMOwaAcvptAAAJOqRRWBU731.jpg)
Verilog设计中如何匹配变量的位宽
![<b class='flag-5'>Verilog</b>设计<b class='flag-5'>中</b>如何<b class='flag-5'>匹配</b>变量的<b class='flag-5'>位</b><b class='flag-5'>宽</b>](https://file.elecfans.com/web2/M00/30/E1/pYYBAGIMwgKACB0HAAD3qV0cV_o010.png)
浅谈IC设计中的位宽不匹配的危害
二十进制编码器及Verilog HDL描述 Verilog HDL程序的基本结构及特点
![二十进制<b class='flag-5'>编码</b>器及<b class='flag-5'>Verilog</b> HDL描述 <b class='flag-5'>Verilog</b> HDL程序的基本结构及特点](https://file1.elecfans.com/web2/M00/A0/38/wKgZomTr_rGACKVfAAAOC0Y73xs441.jpg)
评论