Verilog-A 模块定义与实例化
模块定义基本格式
`include "constants.vams"
`include "disciplines.vams"
module module_name (pin_A, pin_B, ...);
input pin_A;
output pin_B;
inout pin_C;
electrical pin_A, pin_B, pin_C; // 模拟端口声明 electrical
parameter real R = 100; // 参数
real i; // 变量
integer j;
analog begin
// 行为描述
V(pin_A, pin_B) <+ I(pin_A, pin_B) * R;
end
endmodule
要点
- 端口列表:只需列名称,类型在模块体内声明(input/output/inout)。
- 模拟端口必须声明
electrical;数字端口用logic。 - 命名要求:模块名 = 对应电路/图标名,同一库(lib)内唯一。
- 若模块既有电路又有代码,端口声明顺序必须与电路端口一致。
- 模拟/混合信号模块必须有且仅有一个
analog块。
完整模块要素
module mod_name(ports);
// 1. 声明变量
integer variable_A;
real variable_B;
// 2. 声明参数
parameter real par = 1;
// 3. 声明内部节点
electrical node_name;
// 4. 初始化行为(模拟域)
@(initial_step) begin
end
// 5. 模拟行为描述
analog begin
end
// 6. 数字行为描述(仅 Verilog-AMS)
always begin
end
endmodule
模块实例化
位置对应(按声明次序)
module_name instance_name (pin_A, pin_B, ...);
// 例:
submoduleA vd1 (qin, aa1);
submoduleA vd2 (aa1, qout);
- 端口个数必须与模块声明一致。
- 模拟模块不能一次生成多个实例或实例矩阵。
名称对应(.port(外部网))
module_name instance_name (.module_pin_A(pin_A), .module_pin_B(pin_B));
- 书写次序不重要,适合长端口列表。
设置实例参数
按顺序(# 开头):
module_name #(par_A, par_B) instance_name (pins...);
按名称:
module_name #(.m_par_A(par_A), .m_par_B(par_B)) instance_name (pins...);
defparam(实例化后设置):
defparam instance_name.param_name = value;
// 多参数连续设置:
defparam inst.p1 = v1,
inst.p2 = v2,
inst.p3 = v3;
defparam 在语句执行时生效,优先级高于实例化时设置;多个 defparam 定义同一参数时最后出现的生效。
实例化基本器件(SPICE 预定义)
resistor #(.r(100K)) RL (out, pwr); // 电阻
capacitor #(.c(1p), .ic(1)) C1 (vcc, out); // 电容(可设初值)
inductor #(.l(1u)) L1 (vcc, out); // 电感
isource #(.dc(ibias)) Iin (gnd, in); // 电流源
vsource #(.dc(5)) Vdd (vcc, gnd); // 电压源
数组参数(如 s 域零极点):
svcvs #(.gain(gain), .poles({-1M, 0, -1M, 0})) x_VF (vout, vgnd, vin, vgnd);
字符串参数(如 PWL 文件):
vsource #(.type("pwl"), .file("mydata.dat")) X_VS (src, gnd);
基本器件参数名称/支持程度各仿真器不同,查对应手册。
复用模块的两种方式
- 显式:像普通电路模块一样把 symbol 放入电路互连(最常见、直观)。
- 隐式:在另一个 Verilog-A 模块内直接实例化调用(对上层不可见)。
完整示例:RLC 串联负载
`include "constants.vams"
`include "disciplines.vams"
module series_rlc1 (p, n);
parameter real r = 100;
parameter real l = 1n;
parameter real c = 1p exclude 0; // exclude 防止 c=0 除零
inout p, n;
electrical p, n;
analog begin
V(p,n) <+ r*I(p,n); // 电阻
V(p,n) <+ l*ddt(I(p,n)); // 电感(微分)
V(p,n) <+ idt(I(p,n))/c; // 电容(积分)
end
endmodule
叠加赋值的自然结果:三者电压相加 = 串联关系。
相关笔记
- 语法基础 → 02 - VerilogA 语法基础
- 数据类型 → 03 - VerilogA 数据类型与变量
- 常用模型模板 → 15 - VerilogA 常用器件模型
- 建模方法 → 13 - VerilogA 建模与系统设计