“ 介绍代码规范的时候,反复强调不能出现组合逻辑环,具体就是组合逻辑所有的else语句要写全,case语句也要写全,但组合逻辑环到底有什么危害?下面就详细举例说明。”
01 什么是组合逻辑环?
组合逻辑反馈环路是数字同步逻辑设计的大忌,它最容易因振荡、毛刺、时序违规等问题引起整个系统的不稳定和不可靠。 组合逻辑反馈环路是二种高风险的设计方式,主要原因如下:
1.组合反馈环的逻辑功能完全依赖于其反馈环路上组合逻辑的门延时和布线延时等,如果这些传播延时有任何改变,则该组合反馈环单元的整体逻辑功能将彻底改变,而且改变后的逻辑功能很难确定。
2.组合反馈环的时序分析是无穷循环的时序计算,综合、实现等EDA 工具迫不得已一般必须主动割断其时序路径,以完成相关的时序计算。而不同的EDA工具对组合反馈环的处理方法各不相同,所以组合反馈环的最终实现结果有很多不确定因素。
3.通常的综合工具在处理组合逻辑反馈问题时,将产生Latch,这将对时序造成许多问题。
在用Verilog HDL进行可综合电路设计时,有很多情况都有可能产生组合逻辑环。
•在组合逻辑的组合进程中, 条件语句描述时应该指定所有条件下所有输出的状态,以避免锁存。比如if/case语句的所有分支必须定义全部的输出才可能避免出现锁存。
•在设计中,应该尽量避免使用锁存!因为锁存要占去大量的触发器资源,而且会对电路带来某种不稳定的隐患。
•所谓的latch,其实质是组合电路中有反馈!反馈的形成是利用到了前一个状态。
具体举例如下:
总结如下:
•组合电路描述中,条件判断语句必须指明所有条件分支情况下,被赋值信号的值。
•分支不完整,意味着电路需要在某种电平状态下,让被赋值的信号“保持原值”,这只能使用锁存电路实现。
02 一个实例
设计代码如下:
仿真激励代码如下:
上面组合逻辑环的代码已经用红色字体显示。
先看前仿真结果:
看不太清?让我们再看一张图。
状态跳变正常,n_state[4:0]按照1、2、4、8、16、1……的顺序重复跳变,没有任何问题。
但在用FPGA工具(如vivado)进行综合时,会报警告:
但是上板抓取信号,发现状态机异常跳转,如下图所示。
此时的n_state[4:0]信号跳变状态为:1、2、4、8、9、1……,出现了9这样的一个状态!
此时,水落石出!出现组合逻辑环会给电路带来严重问题!
而上面的例子是显而易见的,一眼就能看出来,还有一些组合逻辑环,是在写代码时不小心引入的,并且是由多个always模块组成的,这种组合逻辑环在综合的时候也会报warning,必须要修改掉之后才能继续后续工作。否则,等真正上板调试时,规模稍微大点的设计如果要定位到这个错误估计也得花掉好几天的时间,所以代码规范至关重要!
03 组合逻辑环的好处
在实际芯片设计中,也是不允许出现组合逻辑环的。但组合逻辑环能够减少电路逻辑资源,降低电路功耗,具有很多优点。但是其难以被静态时序分析工具分析和计算,且难以生成功能验证向量和自动测试图形向量.针对此问题,很多人都提出了多种组合逻辑环转化方法,以解决硬件描述语言以及高级语言逻辑综合阶段所面临的组合逻辑环拆分问题。我师弟也曾经写过一篇组合逻辑环的拆分方法的文章,有兴趣的同学可以参考如下参考文献:
[1]邸志雄, 史江义, 马佩军,等. 一种组合逻辑环转化方法[J]. 西安电子科技大学学报(自然科学版), 2014, 41(1):75-80.