**要点速览:**静态冒险是指输入转换期间,本应保持不变的输出可能出现一个脉冲;动态冒险则会在原本只应转换一次时产生多次输出转换。对于假定一次只有一个输入变化的两级 SOP 网络,应让每一对相邻的 1 单元都由同一蕴含项覆盖;新增的一致项不会改变布尔函数,却能封闭有风险的交接点。这项证明不会自动涵盖多输入同时变化、多级映射、异步反馈,或综合工具删除冗余逻辑的情况。
真值表规定的是稳定输入与输出值,却没有描述信号穿过不同延迟的逻辑门时会发生什么。因此,同一布尔函数的两种实现可以在每一个稳定行上完全一致,却在输入变化后的几纳秒内表现不同。
当这种瞬态行为到达异步控制、时钟或复位输入、外部引脚、电平敏感状态元件或采样边沿时,它就十分重要。
冒险、毛刺与竞争
当两条或更多相关信号路径在时间上相互竞争时,就存在竞争。冒险是指某种电路结构与转换,在允许的某种路径延迟顺序下可能产生意外输出转换。毛刺则是在某一实际时序情况下观察到的脉冲。
区分这三个概念很有用:
- 零延迟仿真可能隐藏冒险;
- 某一组延迟下,结构可能存在冒险却不显示脉冲;
- 工艺、电压、温度、布局或布线会改变哪一条路径胜出;以及
- “我没有看到毛刺”并不能证明电路无冒险。
静态冒险
输出本应保持 1 却可能短暂降到 0 时,存在静态 1 冒险。它通常在两级积之和(SOP)网络中分析。
静态 0 冒险与之对偶:输出本应保持 0,却可能短暂升到 1。它通常在两级和之积(POS)网络中分析。
教科书中的卡诺图方法假定:
- 网络按指定的两级形式实现;
- 每次只有一个输入变量变化;
- 逻辑门与互连可能具有任意正延迟;以及
- 稳定输入值符合预期布尔函数。
只要这些假设发生变化,证明方法也必须随之改变。
静态 1 冒险计算示例
考虑:
当 时,无论 为何值,稳定输出都为 1:
- 时, 项使或门输出保持高电平;
- 时, 项使其保持高电平。
当 从 1 转换为 0 时,直接路径可能在反相器路径启用 之前就先禁用 :
| 区间 | 路径 | 路径 | |||
|---|---|---|---|---|---|
| 转换前稳定 | 1 | 0 | 1 | 0 | 1 |
| 可能的交接空隙 | 0 | 0 | 0 | 0 | 0 |
| 转换后稳定 | 0 | 1 | 0 | 1 | 1 |
中间一行并不是另一种真值表输入,而是表示实现内部不同的信号到达时间。
在卡诺图上找到接缝
对于变量 、 与 :
BC
00 01 11 10
+----+----+----+----+
A=0 | 0 | 1 | 1 | 0 |
+----+----+----+----+
A=1 | 0 | 0 | 1 | 1 |
+----+----+----+----+
原始 SOP 使用:
- 覆盖顶行中 的单元;以及
- 覆盖底行中 的单元。
单元 A=0, B=1, C=1 与 A=1, B=1, C=1 互为相邻,因为只有 A 不同。然而,选中的蕴含项没有任何一个同时覆盖这两个单元。A 变化时,保持输出有效的责任必须从一个乘积项交接到另一个。这个未覆盖的相邻关系就是静态 1 接缝。
添加一致项
与 的一致项为 :
一致定理给出:
因此,新增项不会改变任何稳定真值表结果。但是,在 的危险转换期间, 会始终为 1,使或门输出保持高电平。
在卡诺图上, 是跨越两个相邻单元的竖直分组。一般的两级 SOP 处理流程是:
- 找出相邻 1 单元之间每一种允许的单变量转换;
- 检查已实现覆盖中,是否存在跨越每一对单元的蕴含项;
- 为任何未覆盖单元对加入适当的一致项或覆盖项;以及
- 验证综合与物理实现是否保留预期结构。
对偶流程则在 POS 实现中覆盖相邻的 0 单元,以防止静态 0 冒险。
最小逻辑与无冒险逻辑优化不同目标
最小 SOP 的项数更少,因为从布尔函数角度看, 是冗余项。无冒险 SOP 则会有意保留物理冗余。
这会带来实现问题:逻辑综合器通常有权删除不改变布尔函数的项。它还可能把表达式因式分解成多级网络,或映射到具有不同行为的查找表与单元中。
如果无冒险是一项要求:
- 应把它表达为实现约束,而不是一句注释;
- 使用厂商文档规定的结构保留或无冒险方法;
- 检查综合后的网表;
- 对映射后的设计执行可感知时序的验证;以及
- 在目标流程支持时,验证最终布线实现。
仅有 RTL 方程无法保证物理一致路径在优化后仍然存在。
动态冒险
当正确输出本应只变化一次,实现却可能在稳定前变化多次时,就发生动态冒险,例如 0 → 1 → 0 → 1。
动态冒险需要多条相互作用的延迟路径,通常与多级、重汇聚逻辑有关。在单输入变化模型下,已经证明不含相关静态冒险的两级网络更容易推理;经过因式分解或技术映射后的实现,可能不再保有这种结构。
对于任意动态冒险,并不存在通用的“加一项”修复方案。实际应对方法包括:
- 重新设计或重新综合为具有无冒险证明的形式;
- 在结果到达敏感使用者之前先将其寄存;
- 使用为异步工作而设计的握手或状态机风格;
- 使用目标技术专用的无毛刺多路选择器或时钟控制单元;以及
- 验证实现后的延迟行为。
随意添加延迟缓冲器以“平衡”路径十分脆弱。除非设计方法明确依赖有界延迟并对其施加约束,否则工艺、电压、温度与布线变化都会破坏这种平衡。
多输入变化与功能冒险
卡诺图相邻关系表示一个变量发生变化。如果两个独立输入在接近的时间变化,电路可能经过多个中间稳定组合中的任意一个。即使网络没有单输入静态冒险,也可能产生功能冒险。
例如,从 00 转换到 11 可能在物理上经过 01 或 10。如果布尔函数在这些中间行上的值不同,那么在不改变函数的前提下,不存在任何冗余逻辑门能使两条路径完全等效。
系统级方案包括:
- 强制采用单输入变化协议;
- 在适合的情况下对转换编码,使每次只改变一个比特;
- 对相关控制信号进行同步和寄存;
- 使用请求/应答握手;
- 只在有效信号到来后捕获一致的数据束;或者
- 重新设计接口,避免以组合方式解释同时变化的输入。
格雷码有助于解决特定的相邻状态问题,但并不是任意总线的通用解药。
同步逻辑何时能够包容毛刺
如果组合结果只驱动触发器的 D 输入,而且网络在采样边沿前已经稳定并留有建立时间裕量,随后又在整个保持时间内稳定,那么内部毛刺不一定会成为体系结构状态。
这项结论也有边界:
- 毛刺仍然会消耗动态功率;
- 它可能传播到具有不同时序的另一条路径;
- 它对异步复位、置位、时钟、使能与握手很危险;
- 当时序裕量缩小时,它可能被捕获;以及
- 它可能在引脚或片选信号上从外部观察到。
不要让普通组合网络处理逻辑后生成时钟。应使用集成时钟门控单元、FPGA 时钟控制资源,或基于使能的同步设计。
异步冒险与本质冒险
异步时序电路会有意允许转换在没有全局采样边沿的情况下影响状态。其设计方法必须明确说明延迟假设、状态编码、握手以及无冒险条件。
本质冒险与异步反馈实现中,某项输入沿不同路径传播速度不一有关;内部状态可能在输入变化抵达每个必要位置之前就已前进。它并不是组合静态毛刺的另一个名称,而且一致项通常无法消除它。
本质冒险的处理属于异步机器规格与实现的一部分,通常涉及反馈延迟假设或不同电路结构。切换到同步逻辑是一种选择,却不能证明所有冒险都会消失。
仿真正确的模型
零延迟数字仿真器通常会在同一个仿真时刻改变所有相关节点,因而可能完全看不到脉冲。要研究冒险,模型必须包含不相等的传播延迟:
- 构建 ;
- 保持 ;
- 为 A 的直接路径与反相路径指定或引入文档明确的延迟差;
- 只切换 A;
- 以小于建模延迟的时间分辨率检查 F;以及
- 添加 并重复。
如果仿真器中的缓冲元件逻辑延迟为零,串接缓冲器无法证明任何事情。应使用延迟感知功能、门级时序仿真或物理测量。
在一组延迟分配下未出现脉冲,只能作为该次运行的证据,而不能证明所有允许延迟下都不会出现脉冲。
验证检查表
- 哪些输入可以同时变化?
- 输出必须保持不变,还是只转换一次?
- 实现网络是两级、因式分解后,还是映射到 LUT 或单元?
- 每一对相关的卡诺图相邻单元是否共享覆盖项?
- 综合是否会删除或重构冗余?
- 输出只驱动寄存器 D 输入,还是会驱动敏感控制?
- 映射与布线后是否检查了最小和最大延迟?
- 异步反馈与本质冒险是否按照公认方法处理?
下一步
时钟偏斜指南解释了时钟到达时间不一致如何改变建立与保持时间裕量。卡诺图中的无关项则说明何时可以用未指定输入组合帮助化简——但在冒险分析中使用无关项前,必须由系统约定证明它确实不受约束。



