0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Verilog编码中位宽不匹配的危害是什么?

ruikundianzi 来源:IP与SoC设计 2023-09-19 10:14 次阅读

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

    文章

    1339

    浏览量

    109901
  • VCS
    VCS
    +关注

    关注

    0

    文章

    78

    浏览量

    9572

原文标题:错误案例:位宽不匹配错误

文章出处:【微信号:IP与SoC设计,微信公众号:IP与SoC设计】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    FIR compiler 7.2 数据输入问题

    AD采集为14,但是在FIR IP核中将输入设置为14,IP核数据输入端依然为16。在之后的仿真阶段会报
    发表于 09-07 10:32

    从设备读取的idcode与bsdl文件的idcode匹配该怎么办?

    我遇到了这个问题。信息:iMPACT:583 - '1':从设备读取的idcode与bsdl的idcode匹配File.INFO:iMPACT:1578 - '1':设备IDCODE
    发表于 08-08 08:58

    带字库LCD12864写数据时类型匹配

    现有带字库LCD12864(控制器ST7920)一块,暂时只需实现往DDRAM写数据来显示汉字。根据技术手册,对DDRAM的发数据操作是一次发一个字型(两个字节)的,但是12864数据口是8
    发表于 11-11 09:00

    怎么实现RocketIOTM GTP在串行高速接口中的设计?

    本文在对Virtex-5 RocketIOTM GTP进行了解的基础上,针对串行高速接口开发匹配的问题,提出了一种
    发表于 05-28 06:21

    Verilog 变量的数值类型

    Verilog 变量的数值类型Verilog变量每个位(bit)的数值类型有四种,分别为1,0,Z,X。其中1,0比较明确就是高、低电
    发表于 08-04 09:42

    在SpinalHDL里有没有什么好的方式实现一个接口转换呢

    整数倍时进行数据填充(默认为false,但如果位不能整除则要设置为true)。其内部设计实现思路并不难,匹配时输入输出直接相连,
    发表于 07-27 14:52

    嵌入式的计算

    ,然后将在扩大1即可。 有符号数的表示为最高位为符号表示数值大小,所以计算完绝对值
    发表于 03-02 19:52

    JPEG2000平面编码的存储优化方案设计

    本文通过对JPEG2000平面编码器的存储方案进行了分析,设计了一个高效的存储结构以及相应的控制电路,设计采用verilog[4]语言描述。
    发表于 08-16 11:28 1462次阅读
    JPEG2000<b class='flag-5'>中</b><b class='flag-5'>位</b>平面<b class='flag-5'>编码</b>的存储优化方案设计

    verilog实现的RS204—188编码

    这是verilog实现的RS204—188编码,附带测试文件
    发表于 01-20 18:24 28次下载

    华为的verilog编码规范

    华为的verilog编码规范
    发表于 11-01 08:41 41次下载
    华为的<b class='flag-5'>verilog</b><b class='flag-5'>编码</b>规范

    Verilog设计如何匹配变量的

      在FPGA设计,我们经常需要用寄存器来寄存某些“数量类”的变量,比如FIFO的深度啦、或者计数器的最大值啦;又或者输入输出信号也需要将用parameter参数化以便更好的调用等。
    的头像 发表于 02-16 16:21 6746次阅读
    <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>

    浅谈IC设计匹配危害

    在IC设计,硬复位用于配置寄存器和配置信号的跨时钟模块。即一个配置信号cfg_mac_mode是由硬复位驱动的,如果要同步到其他时钟域,跨时钟模块需要使用硬复位,而不能使用软复位。
    发表于 07-15 11:53 2386次阅读

    Verilog编码风格的建议

    良好的编码风格,有助于代码的阅读、调试和修改。虽然 Verilog 代码可以在保证语法正确的前提下任意编写,但是潦草的编码风格往往是一锤子买卖。
    的头像 发表于 06-01 16:27 667次阅读
    <b class='flag-5'>Verilog</b><b class='flag-5'>编码</b>风格的建议

    二十进制编码器及Verilog HDL描述 Verilog HDL程序的基本结构及特点

    节通过硬件描述语言Verilog HDL对二十进制编码器的描述,介绍Verilog HDL程序的基本结构及特点。
    的头像 发表于 08-28 09:54 2571次阅读
    二十进制<b class='flag-5'>编码</b>器及<b class='flag-5'>Verilog</b> HDL描述 <b class='flag-5'>Verilog</b> HDL程序的基本结构及特点

    Verilog表达式的确定规则

    很多时候,Verilog中表达式的都是被隐式确定的,即使你自己设计了,它也是根据规则先确定位
    的头像 发表于 10-22 15:41 102次阅读
    <b class='flag-5'>Verilog</b>表达式的<b class='flag-5'>位</b><b class='flag-5'>宽</b>确定规则