3. X传播机制剖析

要治理X传播,先要理解X在网表中究竟沿什么路径扩散。X不是一种“值”,而是一类“不确定状态”的集合:它可能来自未初始化寄存器、多驱动冲突、总线悬空、跨时钟域采样、复位不完整,也可能来自仿真语义本身(例如4态仿真中0与1的与运算结果仍为0,而0与X的与运算结果为X)。因此,X传播路径分析的核心,是判断“不确定”在什么条件下被吸收、被放大、被掩盖,或最终泄漏到可观测输出。

一、门级X传播:控制路径与数据路径的分野

在门级,X的扩散条件取决于逻辑门的“控制值”与“非控制值”。对与门/与非门,控制值是0:只要有一个输入为0,输出即被强制为0(或1),X被屏蔽;非控制值是1,此时若另一输入为X,输出即为X。对或门/或非门,控制值是1,非控制值是0。异或门没有控制值,任一输入为X,输出必为X。这就是门级X传播的第一条判据:控制路径上的确定值可以阻断X,数据路径上的X会继续传递。

以一个2输入与门为例:输入A=0、B=X,输出Y=0,X被吸收;输入A=1、B=X,输出Y=X,X沿数据路径继续传播。若A本身来自未初始化寄存器,则A=X、B=X,输出仍为X。可见,门级X传播不是简单的“有X就传X”,而是由门的控制逻辑决定。

再看选择器(MUX):当选择端S为确定值时,只有被选中的那条数据路径参与传播,未选中路径上的X不会影响输出;当S为X时,两条数据路径可能同时被激活,若两条路径值不同,输出为X;若两条路径值相同,输出可能仍为确定值。这说明控制路径上的X会放大不确定性,而数据路径上的X是否传播取决于控制端的确定程度。

二、RTL级X传播:赋值、条件与位宽扩展

RTL级X传播比门级更隐蔽,因为RTL描述的是行为,而非具体门结构。常见来源包括:未初始化寄存器在复位前输出X;if-else或case语句未覆盖全分支,导致综合出锁存器或仿真中保持旧值;位宽不匹配导致高位补零或符号扩展;以及跨时钟域采样时源寄存器处于X态。

在RTL仿真中,阻塞赋值与非阻塞赋值的时序差异也会影响X的可见时刻。例如:

always @(posedge clk) begin
    if (rst_n) q <= d;
    // 缺少 else 分支,q 在复位期间保持 X
end

若复位期间q未被赋初值,q保持X;复位释放后,q才采样d。若d本身为X,则q继续为X。这里的关键判断是:X是否被复位或默认赋值“清洗”掉。如果复位不覆盖该寄存器,X就会在复位释放后进入功能路径。

另一个典型场景是case语句:

always @(*) begin
    case (sel)
        2'b00: y = a;
        2'b01: y = b;
        default: y = 1'b0;
    endcase
end

若缺少default分支,当sel为2'b1x时,仿真可能保持y旧值或产生锁存行为,X便可能沿数据路径扩散。综合工具通常会将不完整case推断为锁存器,而锁存器在使能无效时保持旧值,若旧值为X,则X被“锁住”并持续传播。

三、控制路径与数据路径的X扩散条件

把上述现象归纳为两条路径:控制路径决定“谁被选中、谁被使能、谁被复位”;数据路径承载“被传输的值”。控制路径上的X通常比数据路径上的X更危险,因为它会让多个数据路径同时不确定,甚至导致状态机进入非法状态。数据路径上的X则可能被控制路径上的确定值屏蔽。

判断X是否扩散,可以依次问三个问题:第一,X出现在控制端还是数据端?第二,控制端是否有确定值可以屏蔽该X?第三,该X是否会被后续寄存器采样并跨周期保持?如果X出现在控制端且无确定屏蔽,扩散概率极高;如果X出现在数据端且控制端确定,扩散通常被阻断;如果X被寄存器采样,则可能跨时钟周期持续存在。

门级与RTL级X传播路径判据 门级:控制值 vs 非控制值 AND / NAND 控制值 = 0 非控制值 = 1 OR / NOR 控制值 = 1 非控制值 = 0 门级X扩散判据 • 控制端为确定控制值 → X被屏蔽 • 控制端为非控制值 → X沿数据路径传播 • XOR/XNOR 无控制值 → 有X则输出X MUX 选择端 S 的X效应 S=0/1 确定 → 仅选中路径参与,未选X被隔离 S=X → 两路同时激活;值不同则输出X S=X 且两路值相同 → 输出可能仍确定 RTL级:X来源与扩散条件 来源1:未初始化寄存器 / 复位不完整 复位未覆盖 → 复位释放后X进入功能路径 来源2:if/case 分支不完整 推断锁存器 → 保持旧值,X被锁存 来源3:位宽不匹配 / 符号扩展 高位补零或扩展,可能引入非预期确定值 RTL级X扩散三问 ① X在控制端还是数据端? ② 控制端是否有确定值屏蔽? ③ 是否被寄存器采样并跨周期保持?

四、从路径分析到验证动作

理解路径之后,验证动作就有了明确靶点。对控制路径,应重点检查复位覆盖率和状态机编码:复位是否覆盖所有寄存器?状态机是否使用独热码或二进制码并具备default分支?对数据路径,应检查未初始化存储、总线多驱动和跨时钟域同步器。一个可执行的检查清单如下:

  • 列出所有未初始化寄存器,确认复位是否覆盖;
  • 检查所有if-else和case语句是否完整,是否存在锁存器推断;
  • 检查MUX选择端是否可能为X,尤其是来自未初始化寄存器的选择信号;
  • 检查跨时钟域路径,确认同步器是否在复位后先进入确定状态;
  • 在仿真中开启X传播检查,观察X是否到达输出或状态机非法状态。

在Synopsys工具链中,VCS的X传播模式(如xprop)可以配置X的传播语义,帮助区分“乐观”与“悲观”传播。例如,使用-xprop选项并配合配置文件,可以指定特定模块的X传播行为。但工具配置不能替代设计理解:只有先明确控制路径与数据路径的X扩散条件,才能判断工具报告中的X是真实风险还是仿真语义造成的假象。

门级看控制值,RTL级看分支与复位。控制路径上的X优先治理,数据路径上的X优先确认是否被屏蔽。

最后需要强调:X传播分析不是一次性动作,而应贯穿RTL开发、综合后网表验证和门级仿真。RTL阶段发现的X传播路径,往往对应复位不完整或分支缺失;门级阶段发现的X传播,则可能对应多驱动、悬空或时序违例。把两级的X路径对照起来,才能定位根因,而不是在波形里反复猜测。