2. 电路建模基础:模拟电路与数字电路建模的区别、行为级模型、结构级模型、混合信号模型

好,咱们进入正题。这一章聊的是电路建模的基础。说白了,就是搞清楚我们怎么用模型去描述一个电路。

我刚开始做验证那会儿,总觉得建模就是画个原理图。后来才发现,模型的世界远比想象中丰富。尤其是当你面对一个复杂的混合信号芯片时,选对模型类型,往往比写对代码更重要。

2.1 模拟电路建模 vs 数字电路建模

这两者的区别,我习惯用一个比喻来解释。

数字电路建模,就像是在描述一个开关。要么开,要么关。0和1,清清楚楚。你不需要关心电压是3.3V还是3.2V,只要它落在逻辑高电平的范围内就行。

模拟电路建模,则像是在描述一条河流。水位、流速、温度,每一个连续变化的量都很重要。你不能说“水要么在,要么不在”,因为中间有无数种可能。

我在项目中遇到过最典型的例子:一个ADC的建模。数字部分我们用了Verilog,几行代码就搞定了逻辑。但模拟前端,我们不得不写一个Verilog-A模型,因为要精确描述采样保持电路的建立时间、噪声特性。这两种模型,从底层思维上就是不同的。

对比维度 数字电路建模 模拟电路建模
信号值 离散(0, 1, X, Z) 连续(电压、电流)
时间精度 事件驱动,基于时钟沿 连续时间,基于微分方程
建模语言 Verilog, VHDL, SystemVerilog Verilog-A, Verilog-AMS, VHDL-AMS
仿真器 数字仿真器(VCS, NC-Sim) SPICE, Spectre, Eldo
关注点 功能正确性、时序 精度、噪声、失真、功耗
注意: 千万不要试图用数字仿真器去跑一个精确的模拟模型。我曾经见过有人把运放的Verilog-A模型扔进VCS里跑,结果仿真器直接报错崩溃。工具选不对,再好的模型也是白搭。

2.2 行为级模型

行为级模型,说白了就是“黑盒子”。我只关心输入输出关系,不关心内部是怎么实现的。

举个例子,一个运算放大器。结构级模型可能需要几十个晶体管,仿真一次要跑半天。但行为级模型呢?我只需要写一个传递函数:

// Verilog-A 行为级运放模型
module opamp (vout, vp, vn);
    input vp, vn;
    output vout;
    electrical vp, vn, vout;

    parameter real gain = 100000;  // 开环增益
    parameter real GBW = 10e6;     // 增益带宽积

    analog begin
        V(vout) <+ gain * (V(vp) - V(vn));
        // 这里还可以加极点、压摆率限制等
    end
endmodule

你看,就这么几行。仿真速度比晶体管级快好几个数量级。

我个人的习惯是:在系统级验证阶段,尽量用行为级模型。因为这时候我们需要快速迭代,验证架构是否正确。等架构定下来,再逐步用结构级模型替换关键模块。

小技巧: 行为级模型不是越简单越好。要保留关键的非理想特性。比如运放,至少要包含有限增益、有限带宽和压摆率。否则你的系统级仿真结果会过于乐观,到了流片回来才发现问题。

2.3 结构级模型

结构级模型,就是“白盒子”。它描述了电路的真实结构——用了哪些器件,怎么连接的。

你想想看,一个数字加法器,行为级模型可能就是一行代码:sum = a + b。但结构级模型,你得把全加器、半加器一个个例化出来,把连线都画清楚。

结构级模型的好处是:它更接近真实电路。可以用来做精确的时序分析、功耗分析。但代价是仿真速度慢,建模工作量大。

我记得有一次,我需要验证一个PLL的锁定时间。行为级模型告诉我1us就能锁定。但我不放心,又搭了一个结构级模型(用晶体管级的VCO和电荷泵)。结果仿真跑了整整两天,最后发现实际锁定时间是2.3us。嗯,这就是结构级模型的价值——它不会骗你。

// 结构级模型示例:一个简单的反相器链
module inv_chain (out, in);
    input in;
    output out;
    wire n1, n2;

    inv U1 (.out(n1), .in(in));
    inv U2 (.out(n2), .in(n1));
    inv U3 (.out(out), .in(n2));
endmodule

2.4 混合信号模型

这才是真正的难点。现在的芯片,很少有纯数字或纯模拟的。SoC、IoT芯片,都是数模混合的。

混合信号模型要解决的核心问题:数字域和模拟域怎么通信?

数字域是事件驱动的,模拟域是连续时间的。两者之间的接口,需要特殊的处理。

我常用的方法是:

  • 使用Verilog-AMS:它同时支持数字和模拟的建模。在同一个模型中,你可以既有always块,又有analog块。
  • 定义清晰的接口:模拟信号进入数字域时,需要加一个比较器或施密特触发器。数字信号进入模拟域时,需要加一个DAC或电压源。
  • 注意仿真器的选择:混合信号仿真需要专门的工具,比如Cadence的AMS Designer或Synopsys的VCS AMS。
避坑指南: 我曾经在做一个Sigma-Delta ADC的验证时,直接把数字滤波器的Verilog模型和模拟调制器的Verilog-A模型连在一起。结果仿真速度慢得像蜗牛。后来发现,问题出在数字模块和模拟模块之间的信号传递频率太高。解决方案是在接口处加了一个采样保持器,把模拟信号离散化后再传给数字域。仿真速度提升了10倍。

混合信号建模的另一个挑战是精度与速度的平衡。你不能让整个芯片都用晶体管级模型去跑,那会跑到天荒地老。我的做法是:

  1. 关键模拟模块(PLL、ADC、DAC、LDO)用晶体管级或结构级模型。
  2. 非关键模拟模块(偏置电路、温度传感器)用行为级模型。
  3. 数字部分用RTL或门级模型。
  4. 接口处用Verilog-AMS的connect module自动处理信号转换。

这样既能保证关键路径的精度,又能控制整体仿真时间。

好了,这一章的内容就这些。记住:建模不是目的,验证才是。选对模型,你的验证工作就成功了一半。