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

要点

完整模块要素

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);

基本器件参数名称/支持程度各仿真器不同,查对应手册。

复用模块的两种方式

  1. 显式:像普通电路模块一样把 symbol 放入电路互连(最常见、直观)。
  2. 隐式:在另一个 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

叠加赋值的自然结果:三者电压相加 = 串联关系。

相关笔记