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 |
| 关注点 | 功能正确性、时序 | 精度、噪声、失真、功耗 |
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。
混合信号建模的另一个挑战是精度与速度的平衡。你不能让整个芯片都用晶体管级模型去跑,那会跑到天荒地老。我的做法是:
- 关键模拟模块(PLL、ADC、DAC、LDO)用晶体管级或结构级模型。
- 非关键模拟模块(偏置电路、温度传感器)用行为级模型。
- 数字部分用RTL或门级模型。
- 接口处用Verilog-AMS的
connect module自动处理信号转换。
这样既能保证关键路径的精度,又能控制整体仿真时间。
好了,这一章的内容就这些。记住:建模不是目的,验证才是。选对模型,你的验证工作就成功了一半。