Verilog HDL描述的组合逻辑环在FPGA实现时到底有什么问题?

“ 课堂上给大家介绍代码规范的时候,反复强调不能出现组合逻辑环,具体就是组合逻辑所有的else语句要写全,case语句也要写全,但组合逻辑环到底有什么危害?下面就详细举例说明。”
01

什么是组合逻辑环?
组合逻辑反馈环路是数字同步逻辑设计的大忌,它最容易因振荡、毛刺、时序违规等问题引起整个系统的不稳定和不可靠。 组合逻辑反馈环路是二种高风险的设计方式,主要原因如下:
1.组合反馈环的逻辑功能完全依赖于其反馈环路上组合逻辑的门延时和布线延时等,如果这些传播延时有任何改变,则该组合反馈环单元的整体逻辑功能将彻底改变,而且改变后的逻辑功能很难确定。
 2.组合反馈环的时序分析是无穷循环的时序计算,综合、实现等eda 工具迫不得已一般必须主动割断其时序路径,以完成相关的时序计算。而不同的eda工具对组合反馈环的处理方法各不相同,所以组合反馈环的最终实现结果有很多不确定因素。
 3.通常的综合工具在处理组合逻辑反馈问题时,将产生latch,这将对时序造成许多问题。 
在用verilog hdl进行可综合电路设计时,有很多情况都有可能产生组合逻辑环。
•在组合逻辑的组合进程中, 条件语句描述时应该指定所有条件下所有输出的状态,以避免锁存。比如if/case语句的所有分支必须定义全部的输出才可能避免出现锁存。
•在设计中,应该尽量避免使用锁存!因为锁存要占去大量的触发器资源,而且会对电路带来某种不稳定的隐患。
•所谓的latch,其实质是组合电路中有反馈!反馈的形成是利用到了前一个状态。
具体举例如下:
总结如下:
•组合电路描述中,条件判断语句必须指明所有条件分支情况下,被赋值信号的值。
•分支不完整,意味着电路需要在某种电平状态下,让被赋值的信号“保持原值”,这只能使用锁存电路实现。
02

一个实例
设计代码如下:
// **************************************************************
// copyright(c)2015, xidian university
// all rights reserved.
//
// ip lib index :  
// ip name      :      
// file name    : 
// module name  : 
// full name    :  
//
// author       : liu-huan 
// email        : assasin9997@163.com 
// data         : 
// version      : v 1.0 
// 
// abstract     : 
// called by    :  
// 
// modification history
// -----------------------------------------------------------------
// 
// 
//
// *****************************************************************
// *******************
// timescale
// ******************* 
`timescale 1ns/1ps
// *******************
// information
// *******************
//*******************
//define(s)
//*******************
//`define udly 1    //unit delay, for non-blocking assignments in sequential logic
//*******************
//define module port
//*******************
module  top   (     
           input    clk ,
           input    rst 
              ) ;
//*******************
//define local parameter
//*******************
//parameter(s)
parameter idle  = 5'b0_0001 ;
parameter s1    = 5'b0_0010 ;
parameter s2    = 5'b0_0100 ;
parameter s3    = 5'b0_1000 ;
parameter s4    = 5'b1_0000 ;
//*********************
//inner signal declaration
//*********************
//regs
(* mark_debug = true *)reg [4:0] c_state ;
(* mark_debug = true *)reg [4:0] n_state ;
reg [3:0] cnt ;
(* mark_debug = true *) reg [3:0] led ;
//wires
//*********************
//instantce module
//*********************
//*********************
//main core
//********************* 
always @(posedge clk or posedge rst) begin
    if (rst == 1'b1) begin
        cnt <= 4'b0 ;
    end
    else begin
       cnt <= cnt+1'b1 ; 
    end
end
// 三段式状态机 验证 第二段 if无else的异常跳转
// 第一段  状态转移
always @(posedge clk or posedge rst) begin
    if (rst == 1'b1) begin
       c_state <= idle ; 
    end
    else begin
        c_state <= n_state ;
    end
end
// 第二段 计算下一状态
always @ (*) begin
    case ( c_state ) 
        idle : begin
            if ( cnt == 'b0 )
                n_state = s1 ;
        end
        s1 : begin
            if ( cnt == 'd2 )
                n_state = s2 ;
        end
        s2 : begin
            if ( cnt == 'd4 )
                n_state = s3 ;
        end
        s3 : begin
            if ( cnt == 'd8 )
                n_state = s4 ;
        end
        s4 : begin
            if ( cnt == 'd15 )
                n_state = idle ; 
        end
        default : begin
            n_state = idle ;
        end
    endcase
end
// 第三段 输出
always @(posedge clk or posedge rst) begin
    if (rst == 1'b1) begin
        led <= 4'b0 ;
    end
    else begin
       case ( n_state ) 
            idle : led <= 4'b0 ;
            s1   : led <= 4'd1 ;
            s2   : led <= 4'd2 ;
            s3   : led <= 4'd3 ;
            s4   : led <= 4'd4 ;
            default : begin
              led <= 4'd0 ;  
            end
        endcase 
    end
end
endmodule
仿真激励代码如下:
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// company: 
// engineer: 
// 
// create date: 2017/12/11 2030
// design name: 
// module name: test
// project name: 
// target devices: 
// tool versions: 
// description: 
// 
// dependencies: 
// 
// revision:
// revision 0.01 - file created
// additional comments:
// 
//////////////////////////////////////////////////////////////////////////////////
module test ;
reg clk ;
reg rst ;
initial begin
    clk = 1'b0 ;
    rst = 1'b1 ;
    # 100 
    rst = 1'b0 ;
end
always # 5 clk = ~clk ;
top  u_top   (     
           .clk     (  clk ) ,
           .rst     (  rst ) 
              ) ;
endmodule
上面组合逻辑环的代码已经用红色字体显示。
先看前仿真结果:
看不太清?让我们再看一张图。
状态跳变正常,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

组合逻辑环的好处
在实际芯片设计中,也是不允许出现组合逻辑环的。但组合逻辑环能够减少电路逻辑资源,降低电路功耗,具有很多优点。但是其难以被静态时序分析工具分析和计算,且难以生成功能验证向量和自动测试图形向量.针对此问题,很多人都提出了多种组合逻辑环转化方法,以解决硬件描述语言以及高级语言逻辑综合阶段所面临的组合逻辑环拆分问题。


RS485通讯接口应用自恢复保险丝,能达到防护效果吗?
中国航发正在全面推动航空产业链加快复工复产
日本三家上市公司在加密货币业务发展中进行大动作布局
基于总线与DCS技术实现相造纸厂碱回收车间燃烧工段自控系统的设计
教你DIY一个四轴飞行器
Verilog HDL描述的组合逻辑环在FPGA实现时到底有什么问题?
碳化硅如何实现更高效的分布式太阳能发电
世界十大手表品牌排行
Linux中易混淆命令的区别
基于四分之一波长传输线的阻抗匹配原理
三菱模拟量模块的种类 三菱模拟量模块的输出值调整
来2018 未来科技创芯大会,体验一次与众不同的原力觉醒!
区块链软件公司:如何看待目前区块链金融发展
新型AI系统问世,只需19个神经元可控制汽车
LiFi无线通信技术在商场中的应用说明
氮气回流焊有什么优势
3d打印的未来发展方向
realme watch最新搭载1.4英寸屏幕 支持心率和血氧检测
直流电机实验
RA6T2无传感器矢量控制系统概述