IC设计错误案例001:位宽不匹配的错误

1、位宽不匹配

Verilog编码中,常见的位宽不匹配错误,有赋值左右位宽不匹配(<=,=),比较位宽(>,<,>=,<=)不匹配,计算位宽(+,-)不匹配

位宽不匹配会导致DC之后的网表与预期差异较大,导致功能不正确,通过spyglass lint检测可以发现所有位宽不匹配的情况,而vcs编译只能发现少数连线位宽不匹配的情况。

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,

不推荐。


 
 
  1. reg [ 3: 0] cnt0 ;
  2. reg [ 3: 0] cnt1 ;
  3. reg [ 4: 0] count ;
  4. reg ov_nc ;
  5. //-------------case 1-----------------
  6. //wrong code
  7. always @ (posedge clk or negedge rst_n)
  8. if(!rst_n)begin
  9. count <= 5'b0 ;
  10. end
  11. else if((cnt0+cnt1)> 4'h8) //should be 5'h8
  12. begin
  13. {ov_nc, count} <= count + 1'b1;
  14. end
  15. //right ,but not recommended
  16. always @ (posedge clk or negedge rst_n)
  17. if(!rst_n)begin
  18. count <= 5'b0 ;
  19. end
  20. else if((cnt0+cnt1)> 5'h8) //should be 5'h8
  21. begin
  22. {ov_nc, count} <= count + 1'b1;
  23. //right code and recommended 正确且推荐
  24. wire [ 4: 0] cnt_add ;
  25. assign cnt_add = (cnt0+cnt1) ;
  26. always @ (posedge clk or negedge rst_n)
  27. if(!rst_n)begin
  28. count <= 5'b0 ;
  29. end
  30. else if(cnt_add > 5'h8) // (cnt0+cnt1) is 5 bits
  31. begin
  32. {ov_nc, count} <= count + 1'b1;
  33. 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,虽然功能正确,但是不推荐。


 
 
  1. //-------------case 2-----------------//
  2. reg [3:0] cnt0 ;
  3. reg [3:0] cnt1 ;
  4. reg [5:0] cnt2 ;
  5. //wrong code
  6. always @ (posedge clk or negedge rst_n)
  7. if(!rst_n)begin
  8. count <= 5'b0 ;
  9. end
  10. else if({1'b0,(cnt0+cnt1)}<cnt2) //
  11. begin
  12. {ov_nc, count} <= count +1'b1;
  13. end
  14. //right code and not recommended 正确不推荐
  15. wire [4:0] cnt_add ;
  16. assign cnt_add = (cnt0+cnt1) ;
  17. always @ (posedge clk or negedge rst_n)
  18. if(!rst_n)begin
  19. count <= 5'b0 ;
  20. end
  21. else if(cnt_add<cnt2) //
  22. begin
  23. {ov_nc, count} <= count +1'b1;
  24. end
  25. //right code and recommended 正确且推荐
  26. wire [4:0] cnt_add ;
  27. assign cnt_add = (cnt0+cnt1) ;
  28. always @ (posedge clk or negedge rst_n)
  29. if(!rst_n)begin
  30. count <= 5'b0 ;
  31. end
  32. else if({1'b0,cnt_add}<cnt2) //
  33. begin
  34. {ov_nc, count} <= count +1'b1;
  35. end

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 数字IC设计:方法、技巧与实践.pdf是一本关于数字芯片设计的指南,涵盖了数字电路和系统设计的基本概念、方法和技术。 本书分为四个部分,分别为芯片架构、数字电路的建模与分析、数字电路与系统的综合和设计管理与实践。其中,芯片架构部分主要介绍芯片设计的基本原则,包括需求分析、性能指标、架构拓扑等;数字电路的建模与分析部分重点探讨了数字电路元件建模方法,包括状态机、FSM等;数字电路与系统的综合部分重点解决数字芯片设计中的综合问题,如亚微米工艺和PLL设计等;设计管理与实践部分着重强调了数字芯片设计项目的管理和实践经验。 本书的核心内容是数字电路设计方法和技巧方面,包括数字电路的建模方法、电路和系统的综合方法、对数字芯片设计项目进行管理和实践的经验总结等。尤其是在数字电路的建模方面,本书给出了多种建模方法,如状态机模型和卡诺图分析法等,帮助读者理解数字电路的基本特性,从而更好地进行设计。 此外,本书还对数字电路中常见的问题进行了分析和解决方案的描述,如时序约束、时钟树综合、功耗优化、数据通路的综合和测试等问题,进一步推动了数字芯片设计的发展。 综上所述,数字IC设计:方法、技巧与实践.pdf是一本非常有价值的数字芯片设计指南,具有很高的实践性和指导性,对于数字芯片设计方面的初学者和资深工程师都具有很高的参考价值。 ### 回答2: 数字IC设计:方法、技巧与实践是一本全面介绍数字电路设计的经典教材。该书包含了数字电路设计的基本原理、常用技巧以及实践经验。读者可以通过详尽的讲解和大量的实例来深入了解数字IC设计的各个方面。 本书主要内容涵盖数字系统设计的基本概念、设计流程、高级数字电路设计、时序与互联、时钟和定时、高速数字信号传输等方面。书中详细介绍了常用的数字设计方法和技巧,如:逻辑门设计,寄存器设计,状态机设计等。此外,还讲解了数字电路的优化技术,例如:布线、时序优化、功耗优化等。 在场效应晶体管时代,数字IC设计主要依靠手动设计和测试实现。而在CMOS技术的普及下,数字IC设计变得更加复杂和精确。因此,数字IC设计需要各种工具的支持,如:EDA工具、逻辑仿真和物理仿真等。本书还介绍了数字IC设计软件工具的使用,如:Mentor Graphics、Cadence、Synopsys等。还介绍了ASIC设计和FPGA设计的流程和方法。 总体来说,数字IC设计:方法、技巧与实践是一本理论和实践相结合的优秀教材。对于想要深入研究数字IC设计的学生和工程师来说,这是一本值得阅读的经典著作。 ### 回答3: 《数字ic设计:方法、技巧与实践.pdf》是一本介绍数字集成电路设计的书籍,包含了数字电路的基础知识、设计方法和实际应用等方面的内容。 在数字ic设计中,最基本的方法是模块化设计。该方法将电路分成多个模块,每个模块独立设计、独立测试,之后再将所有模块组合成完整的电路。这种方法可以提高电路设计的可维护性和可重复性,降低设计难度和出错率。 另外,数字ic设计需要熟练掌握逻辑电路的基本原理和设计方法。例如,门电路、触发器、计数器、存储器等基本电路的设计和实现方法。此外,需要掌握现代数字ic设计的流程和工具,例如EDA(电子设计自动化)软件。 在实践中,数字ic设计需要注意一些技巧和细节。例如,时序分析、电源干扰等方面的考虑,还要注意布线优化、电路可靠性和工艺细节等。同时,需要进行充分的测试和验证,确保设计的正确性和可靠性。 总之,数字ic设计不仅需要深厚的理论基础,还需要将理论与实践相结合,注重细节和技巧,以确保设计出高质量的数字电路。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值