Verilog-A 模拟算子(Analog Operators)
与模拟信号相关的运算函数。使用限制严格:
- 变量必须是信号变量(电压/电流)
- 只能放在 genvar、常数、变量或 analysis 判断语句中
- 不能用于循环语句、自定义函数、initial/always 语句
时间相关函数
limexp —— 有限指数
limexp(expr);
- 类似
exp,但控制迭代步长、收敛性好得多。 - 最常用于二极管/三极管指数特性:
analog begin
idio = IS * (limexp(V(a,c)/$vt) - 1);
I(a,c) <+ idio;
end
ddt —— 时间微分
ddt(expr [, abstol]);
- 对时间求导;
abstol= 可忽略的最大信号变化量。 - DC 仿真中恒输出 0(时间相关函数)。
- 不能直接嵌套二次微分:
V(out) <+ ddt(ddt(V(in))); // ❌ 错误
需要中间节点:
electrical internal_node;
V(internal_node) <+ ddt(V(in));
V(out) <+ ddt(V(internal_node)); // ✅ 二次微分
idt —— 时间积分
idt(expr [, ic [, assert [, abstol]]]);
ic:初始状态;assert:非 0 时从当前时间重新积分;abstol:可忽略变化量。- DC/AC 静态点仿真行为依参数组合不同(详见书表 3-8):
- 仅 expr:0→t 积分,初态由 DC 决定
- +ic:初态由 ic 决定;DC 返回 ic
- +assert:从 t0(assert≠0 时刻)积分至 t
- 不合理的 ic 可能导致收敛问题。
- 电容电压描述:
V(p, n) <+ idt(I(p, n))/C;
idtmod —— 循环积分
idtmod(expr [, ic [, modules [, offset [, abstol]]]]);
- 积分达到 modules 值后从 0 重新开始(模运算积分)。
- 输出范围:
offset < idtmod() <= modules + offset - 典型应用——产生正弦波:
phase = idtmod(fc + gain*V(in), 0, 1, 0);
V(OUT) <+ sin(2*`M_PI*phase);
信号微分
ddx —— 偏微分
ddx(exprA, exprB);
- 返回 exprA 对 exprB(必须是模拟信号量)的导数。
- exprA 限制严格:不能是动态表达式(ddt...)、不能嵌套(ddx...)、不能含模拟函数(transition...)、不能是数组、不能含未定义值/迭代计算。
延时与滤波
absdelay —— 绝对延时
absdelay(expr, time_delay [, max_delay]);
- 信号延时输出,形状不变;
time_delay >= 0。 - 设置
max_delay后 time_delay 可以是动态值。 - DC 等静态仿真中信号不变。
transition —— 瞬态(边沿)滤波器
transition(expr [, delay [, rise_time [, fall_time [, time_tol]]]]);
- 给快速变化的信号增加延时 + 上升/下降边沿时间,并告知仿真器在这些时间点仿真。
expr必须是 real 型变量(快速变化信号,如数字输出)。- 只设 rise_time 时 fall_time 默认 = rise_time。
- ⚠️ 适用快速变化信号;若 rise_time 大于信号宽度会产生不完整输出(边沿未到顶就开始下降)。
- ⚠️ 对缓慢连续变化信号不要用 transition(大量时间点计算、仿真变慢),用 #slew。
slew —— 摆率限制
slew(expr [, max_pos_rate [, max_neg_rate]]);
- 限制输入信号变化速率(摆率)。
max_pos_rate > 0,max_neg_rate < 0。- 对正弦波等连续信号特别有效——保形 + 限速。
拉普拉斯变换(S 域)函数
定义电路频率响应/滤波。修改参数在仿真中无效(仿真开始即确定滤波器形式)。最后一个参数 ep 为绝对值容差(视仿真器)。
| 函数 | 形式 | 说明 |
|---|---|---|
laplace_nd |
laplace_nd(expr, nn, dd [, ep]) |
分子分母系数数组(0 阶→n 阶) |
laplace_zp |
laplace_zp(expr, zeta, rho [, ep]) |
零点/极点数组(实部,虚部 成对) |
laplace_zd |
laplace_zd(expr, zeta, d [, ep]) |
零点数组 + 分母系数数组 |
laplace_np |
laplace_np(expr, n, rho [, ep]) |
分子系数数组 + 极点数组 |
示例(等效两种写法):
// H(s) = s / (s² - 0.4s + 0.2)
V(out) <+ laplace_zp(V(in), {0,0}, {1,2,1,-2});
V(out) <+ laplace_nd(V(in), {0,1}, {1,-0.4,0.2});
滤波器应用示例(RLC 等效传递函数):
module filter2(in,out,gnd);
input in; electrical in;
output out; electrical out;
inout gnd; electrical gnd;
analog begin
V(out, gnd) <+ laplace_nd(V(in, gnd), {3.948e15,0,0}, {3.948e15,8.886e7,1});
end
endmodule
S 域模型与瞬态器件模型 AC/阶跃响应一致,但无 DC 工作点、大信号非线性与初始状态。建议:非线性特性用瞬态描述,线性小信号用 S 域函数。
Z 变换函数
离散时间用,均需要采样间隔 T。
tor=采样边沿时间(0 会加不连续点、降速),t0=首次采样时间;二者仿真开始时确定,运行中修改无效。
| 函数 | 说明 |
|---|---|
zi_zp(expr, zeta, rho, T [, tor [, t0]]) |
零极点形式 |
zi_zd(expr, zeta, d, T [, tor [, t0]]) |
零点 + 分母系数 |
zi_np(expr, n, rho, T [, tor [, t0]]) |
分子系数 + 极点 |
zi_nd(expr, n, d, T [, tor [, t0]]) |
分子分母系数 |
理想积分器示例(采样保持积分器):
V(out, gnd) <+ zi_nd(V(in, gnd), {0,1}, {1,-1}, 50u);
应用:ADC/DAC、开关电源采样建模。⚠️ 采样时钟应对齐输入稳定周期;边沿与采样点不对齐会采样到斜坡值产生误差。
模拟算子 vs 其他函数对比
| 函数 | 类型 | 静态仿真行为 |
|---|---|---|
| ddt | 时间微分 | 输出 0 |
| idt/idtmod | 时间积分 | 依 ic/assert 返回 |
| absdelay | 延时 | 信号不变 |
| transition/slew | 滤波 | 信号通过 |
| laplace_* | S 域滤波 | 频率响应 |
| zi_* | Z 域采样 | 离散 |
| limexp | 指数 | 同 exp 但收敛好 |
相关笔记
- 数学函数 → 08 - VerilogA 数学函数
- 仿真器函数(
bound_step/$limit) → 09 - VerilogA 仿真器函数 - 事件 → 06 - VerilogA 模拟事件
- S/Z 域建模实践 → 13 - VerilogA 建模与系统设计