竞争与冒险不光会出现在实际的电路中,在仿真时也会存在信号竞争。下面我将展开分析。
一、电路中的竞争冒险
1.竞争冒险的定义
- 竞争: 在组合电路当中,当某个输入变量具有两条以上的路径到达输出端的时候,由于每条路径上的延迟时间的不同,到达终点的时间就会有先有后,这一现象称作竞争。所以这是一个输入级的概念。
- 冒险:组合逻辑电路中有两个输入信号A和B,当A、B同时向相反的逻辑电平跳变(A : 1—> 0 ; B : 0 —> 1),有可能导致输出端可能产生毛刺的现象,称为冒险。这是一个输出级概念。
这里解释一下为了竞争可能会产生毛刺的原因?
例如在与门中,稳态时,只要A为高、B为低,则输出Y为低。如果A由高拉低,同时B由低拉高。注意:有效点位是一个范围值,而非一个确定值。如果B率先达到点位高有效的最低有效点位,则会在极短的时间内使得电路的输出为高,产生一个毛刺(称为1型冒险),这就使得电路的逻辑发生错误。同样的在或门中,如果同时向相反跳变,也可能会产生一个低电位毛刺(称为0型冒险)。
这里我推荐阅读亚稳态的产生和消除就,进一步了解竞争冒险与亚稳态之间的联系。
2.判断竞争冒险的方法
方法一:逻辑代数法
技巧:若某个变量以原变量(A)和反变量(A’)的形式同时出现,就有可能出现冒险现象。
可能产生竞争与冒险的逻辑代数可以化简分为两类:
- Y = A · A’ ,产生1型冒险
- Y = A + A’ ,产生0型冒险
由这两种类型也可以扩展出或非门( Y = (A + A’)’ )和 与非门( Y =(A · A)’ )也存在竞争冒险。
方法二:卡诺图法
技巧:输入变量在卡诺圈上相切处发生电平跳变,可能发生冒险。
如图所示:
当A=1,B=1时,也就是两个卡诺圈相切处,C发生1 —> 0跳变,这就可能发生冒险。
其他方法
- 实验法:用实验来检查输出端是否产生毛刺;
- 计算机辅助分析
- 观察法
3.消除竞争冒险的方法
方法一:接入滤波电容
在输出端并接一个滤波电容Cf,可以将毛刺的幅度削弱至有效点平范围之下。
缺点:增加了输出电压波形的上升时间和下降时间,使波形变坏。适合对输出波形前后无严格要求的场合。
方法二:引入选通脉冲
设法得到一个与输入信号同步的选通脉冲,对这个脉冲的宽度和作用时间有严格要求。
方法三:增加冗余项
例如:Y = AB +A’C,在B=C=1的条件下,会产生竞争冒险。通过增加冗余项BC来消除。
由于BC=1,所以Y = AB +A’C + BC成立。
此时,无论A的状态如何变化,都不会引起竞争与冒险。
二、仿真时的竞争与冒险。
采样时发生竞争(delta cycle的存在),会导致采样数据错误。为了避免在RTL仿真中发生信号竞争的问题,可以通过非阻塞赋值或者特定的信号延迟来解决同步问题。也可以使用时钟块来决定信号的驱动和采样的方式,避免采样时的信号竞争。
这里推荐阅读clocking时钟块消除采样时的信号竞争一文;
如果想要更深层次的了解time-slot,推荐大佬的文章time-slot,仿真的竞争与冒险
PS:什么是delta cycle?
在RTL仿真时,由于无法确定具体电路的延迟时间,默认情况下时钟驱动电路时会添加一个无限最小的时间(delta cycle)的延迟,这个延迟要比最小时间单位精度还要小(可以理解成远小于1ps)。
在一个时间片(time - slot)中可以发生很多的事,例如在仿真时输入run0,即让仿真器运行一个delta-cycle的时间。由于各种可能性,clk与被采样数据之间如果只存在若干个delta-cycle的延迟,那么采样就会出问题。