2. 模拟与数字的边界:信号类型、电压域、时序域的划分与交互

做混合信号验证,最头疼的是什么?

我个人觉得,不是模拟电路有多复杂,也不是数字逻辑有多庞大。真正让人抓狂的,是模拟和数字交界处的那些事。信号类型怎么变?电压域怎么跨?时序怎么对齐?

说白了,边界问题不搞清楚,后面验证全是坑。我曾经在一个项目里,就因为忽略了某个电平转换器的时序窗口,导致芯片在低温下频繁误触发。嗯,那次教训挺深刻的。

2.1 信号类型的划分:你以为是数字,其实它是模拟

很多刚入行的朋友会问:信号不就是0和1吗?

在纯数字世界里,确实如此。但在混合信号芯片里,没有绝对的0和1。你看到的数字信号,在物理层面其实是一个连续变化的电压。

我习惯把混合信号中的信号分成三类:

  • 纯数字信号:标准逻辑电平,比如0V代表0,1.8V代表1。这种信号在验证时直接用数字逻辑处理就行。
  • 纯模拟信号:连续变化的电压或电流,比如ADC的输入、运放的输出。验证时要用模拟仿真器。
  • 混合边界信号:这才是重点。比如比较器的输出、电平转换器的输出、施密特触发器的输出。它们本质上是模拟行为,但被数字电路当作逻辑信号来用。

关键认知:边界信号在验证时,不能简单当成数字信号处理。你需要考虑它的上升/下降时间、过冲、噪声容限、以及阈值电压的工艺偏差。

举个例子。一个比较器输出,当输入差模电压接近0时,输出会进入线性区。这时候它既不是0也不是1。数字电路看到这个中间电平,可能会产生亚稳态。你想想看,这种问题在纯数字仿真里根本发现不了。

2.2 电压域的划分与交互:跨域不是简单连线

现代混合信号芯片,电压域越来越多。核心1.2V、IO 3.3V、模拟5V、还有各种可编程电压。每个电压域都有自己的供电轨和参考地。

验证时,电压域交互主要关注三个问题:

  1. 电平转换:信号从1.2V域到3.3V域,必须经过电平转换器。我曾经见过一个设计,直接拿1.2V信号去驱动3.3V的IO pad,结果IO根本识别不了,芯片功能全乱套。
  2. 地电位差:不同电压域的地电位可能不同。尤其是模拟地和数字地,通常会用磁珠或0欧电阻连接。验证时一定要检查地电位差是否在允许范围内。
  3. 电源顺序:多电压域芯片,上电和下电顺序有严格要求。比如模拟域必须先于数字域上电,否则ESD保护电路可能误触发。
电压域 典型电压 主要风险 验证要点
数字核心域 0.8V - 1.2V 低电压下时序退化 检查最差条件下的建立/保持时间
数字IO域 1.8V - 3.3V 电平不匹配 验证电平转换器的输入/输出范围
模拟域 2.5V - 5V 电源噪声耦合 检查PSRR和电源纹波
混合域 可变 跨域时序偏差 使用同步器或异步FIFO

我的小技巧:在验证计划中,专门列一个「电压域交互检查表」。每次流片前,逐项确认电平转换、地电位、电源顺序都覆盖到了。这个习惯帮我避免了好几次流片失败。

2.3 时序域的划分与交互:异步世界的同步难题

时序域,说白了就是时钟域。混合信号芯片里,时钟域通常比纯数字芯片更复杂。为什么?

因为模拟电路有自己的时钟,数字电路也有自己的时钟。这两个时钟可能频率不同、相位不同、甚至来源不同。比如ADC的采样时钟和数字处理器的系统时钟,它们之间就是异步关系。

我建议把时序域交互分成两种情况:

  • 同步交互:两个时钟域有确定的相位关系。比如同一个PLL分频出来的时钟。这种情况相对简单,只要检查时序约束就行。
  • 异步交互:两个时钟域没有固定相位关系。比如外部晶振和内部RC振荡器。这种情况必须使用同步器或异步FIFO。

这里有个常见的坑:亚稳态

当一个信号从一个时钟域进入另一个时钟域时,如果采样时刻刚好落在信号跳变沿上,触发器就可能进入亚稳态。输出既不是0也不是1,而且会持续一段时间。

我曾经在一个项目中,数字逻辑直接从ADC的输出端口采样数据,没有加任何同步处理。结果在某个特定频率下,芯片偶尔会输出错误数据。查了整整两周,才发现是亚稳态导致的。

避坑指南:所有跨时钟域信号,必须经过至少两级同步器。对于高速数据通路,建议使用异步FIFO。不要相信「这个信号变化很慢,不会出问题」这种话。亚稳态是概率事件,测试100次没问题,不代表第101次也没问题。

2.4 边界交互的验证方法

好了,理论说完了。实际验证怎么做?

我个人的做法是三步走:

  1. 静态检查:先看电路图,确认所有跨域信号都经过了正确的处理。电平转换器有没有加?同步器有没有加?电源域划分是否合理?这一步可以用脚本自动检查。
  2. 动态仿真:用混合信号仿真器(比如Cadence的AMS或Synopsys的VCS-AMS)跑边界场景。重点关注:上电/下电过程、时钟切换、模式切换、以及极端电压温度条件。
  3. 形式化验证:对于关键路径,可以用形式化工具证明跨域交互的正确性。比如检查同步器是否满足MTBF(平均无故障时间)要求。

这里给一个简单的验证代码示例,展示如何用SystemVerilog检查跨时钟域信号:

// 跨时钟域同步器检查
module cdc_checker (
    input  logic clk_a,
    input  logic clk_b,
    input  logic data_a,
    output logic data_b_sync
);

    logic sync_ff1, sync_ff2;

    // 第一级同步器
    always_ff @(posedge clk_b) begin
        sync_ff1 <= data_a;
    end

    // 第二级同步器
    always_ff @(posedge clk_b) begin
        sync_ff2 <= sync_ff1;
    end

    assign data_b_sync = sync_ff2;

    // 断言:检查亚稳态概率
    // 实际项目中,这里会调用工艺库提供的MTBF计算函数
    assert property (
        @(posedge clk_b) 
        $rose(data_a) |=> ##[1:2] data_b_sync
    );

endmodule

核心要点:边界验证不是一次性的工作。它应该贯穿整个验证周期。从最初的验证计划,到最终的sign-off,每个阶段都要问自己:模拟和数字的边界,我检查了吗?

嗯,说了这么多,其实就一句话:边界是混合信号验证的命门。信号类型、电压域、时序域,这三个维度缺一不可。你想想看,如果边界都处理好了,芯片内部再复杂,也不会出大问题。

下一章,我会聊聊如何搭建混合信号验证环境。到时候再分享一些实战中的小技巧。