Verilog 开关级建模

在 Verilog 中,开关级建模(Switch-Level Modeling) 是一种低层次的建模方式,用于描述电路在晶体管级别的行为。它通过模拟 MOS 晶体管(如 NMOS、PMOS)和其他开关级元件(如传输门)的行为来实现电路功能。开关级建模主要用于精确描述数字电路的物理实现,特别是在 ASIC 设计或低功耗电路分析中。以下是关于 Verilog 开关级建模的详细说明,包括基本概念、语法、元件、示例和注意事项。


1. 什么是开关级建模?

  • 定义:开关级建模使用 Verilog 提供的开关级原语(如 nmos, pmos, cmos, tran 等)来描述电路中晶体管的开关行为,模拟信号通过晶体管的传播。
  • 特点
  • 直接建模晶体管级电路(如 MOS 管、传输门)。
  • 支持复杂的信号强度(如 strong, pull, weak)和电荷保持。
  • 适合低层次时序和功耗分析。
  • 用途
  • 验证晶体管级电路的逻辑功能。
  • 分析信号传播、竞争冒险(race condition)或电荷共享。
  • 用于标准单元库设计或模拟器验证。

2. 开关级原语

Verilog 提供了一组内置的开关级原语,用于描述晶体管和传输门的行为。以下是常用的原语及其功能:

(1) MOS 开关原语

  • nmos:NMOS 晶体管,栅极控制信号传播。
  • pmos:PMOS 晶体管,栅极控制信号传播(逻辑反转)。
  • cmos:CMOS 传输门,结合 NMOS 和 PMOS。
  • 语法
  nmos (output, input, control); // NMOS 晶体管
  pmos (output, input, control); // PMOS 晶体管
  cmos (output, input, ncontrol, pcontrol); // CMOS 传输门
  • output:输出信号。
  • input:输入信号。
  • control:栅极控制信号(NMOS/PMOS)。
  • ncontrol, pcontrol:CMOS 的 NMOS 和 PMOS 控制信号(通常互补)。
  • 行为
  • NMOS:当 control=1 时,output=input;当 control=0 时,输出为高阻态(z)。
  • PMOS:当 control=0 时,output=input;当 control=1 时,输出为高阻态(z)。
  • CMOS:结合 NMOS 和 PMOS,ncontrolpcontrol 通常互补。

(2) 传输门原语

  • tran:双向传输门,允许信号双向传递。
  • tranif0:当控制信号为 0 时导通的双向传输门。
  • tranif1:当控制信号为 1 时导通的双向传输门。
  • 语法
  tran (inout1, inout2); // 双向传输门
  tranif0 (inout1, inout2, control); // 控制信号为 0 时导通
  tranif1 (inout1, inout2, control); // 控制信号为 1 时导通

(3) 上拉/下拉原语

  • pullup:将信号拉到高电平(1)。
  • pulldown:将信号拉到低电平(0)。
  • 语法
  pullup (signal); // 上拉
  pulldown (signal); // 下拉

(4) 电阻原语

  • rnmos, rpmos, rcmos:带电阻的 MOS 晶体管,模拟弱信号传播。
  • rtran, rtranif0, rtranif1:带电阻的传输门,模拟信号衰减。

3. 信号强度

开关级建模支持 Verilog 的信号强度(Strength),用于模拟晶体管驱动能力或电荷竞争。常见的信号强度包括:

  • supply0, supply1:电源强度(最强)。
  • strong0, strong1:强驱动。
  • pull0, pull1:上拉/下拉强度。
  • weak0, weak1:弱驱动。
  • highz0, highz1:高阻态。

信号强度在开关级建模中用于解决多驱动冲突,例如多个晶体管驱动同一节点时,强度较高的信号获胜。


4. 开关级建模示例

示例 1:CMOS 与非门(NAND Gate)

以下是一个使用 NMOS 和 PMOS 原语实现的 CMOS 与非门:

module nand_switch (input A, B, output Y);
    supply1 vdd; // 电源高电平
    supply0 gnd; // 电源低电平
    wire w1;     // 中间节点

    // PMOS 晶体管(并联)
    pmos (w1, vdd, A); // 当 A=0 时,w1 连接到 vdd
    pmos (Y, vdd, B);  // 当 B=0 时,Y 连接到 vdd

    // NMOS 晶体管(串联)
    nmos (Y, w1, A);   // 当 A=1 时,w1 连接到 Y
    nmos (w1, gnd, B); // 当 B=1 时,w1 连接到 gnd

    // 上拉电阻(可选,确保初始状态)
    pullup (Y);
endmodule

说明

  • PMOS 晶体管:当 A=0B=0 时,Y 被拉到 vdd1)。
  • NMOS 晶体管:当 A=1B=1 时,Y 通过 w1 连接到 gnd0)。
  • 实现逻辑:Y = ~(A & B)

测试代码

module test_nand_switch;
    reg A, B;
    wire Y;

    nand_switch u_nand (A, B, Y);

    initial begin
        $monitor("Time=%0t A=%b B=%b Y=%b", $time, A, B, Y);
        A = 0; B = 0; #10;
        A = 0; B = 1; #10;
        A = 1; B = 0; #10;
        A = 1; B = 1; #10;
        $finish;
    end
endmodule

示例 2:CMOS 传输门

以下是一个使用 CMOS 传输门实现的 2-to-1 多路选择器:

module mux_switch (input A, B, SEL, output Y);
    wire nSEL; // SEL 的反向信号
    not (nSEL, SEL); // 反相器生成 nSEL

    // CMOS 传输门
    cmos (Y, A, SEL, nSEL); // SEL=1 时,Y=A
    cmos (Y, B, nSEL, SEL); // SEL=0 时,Y=B
endmodule

说明

  • SEL=1nSEL=0),第一个 CMOS 导通,Y=A;第二个 CMOS 关闭。
  • SEL=0nSEL=1),第二个 CMOS 导通,Y=B;第一个 CMOS 关闭。

5. 开关级建模与延迟

开关级原语本身支持延迟建模,与门延迟类似,可以指定固定延迟或最小/典型/最大延迟。

语法:

nmos #(delay) (output, input, control); // 固定延迟
nmos #(min:typ:max) (output, input, control); // 最小/典型/最大延迟
nmos #(rise, fall) (output, input, control); // 上升/下降延迟

示例:

module nand_switch_delay (input A, B, output Y);
    supply1 vdd;
    supply0 gnd;
    wire w1;

    pmos #(2:3:4) (w1, vdd, A); // 最小 2ns,典型 3ns,最大 4ns
    pmos #(2:3:4) (Y, vdd, B);
    nmos #(1:2:3) (Y, w1, A);
    nmos #(1:2:3) (w1, gnd, B);
endmodule

说明

  • 每个晶体管的延迟独立指定,模拟实际硬件的传播时间。

6. 注意事项

  1. 仿真与综合
  • 开关级建模主要用于仿真,综合工具(如 Synopsys Design Compiler)通常不支持开关级原语,直接生成门级网表。
  • 在门级仿真中,开关级建模可结合 SDF 文件提供精确的时序信息。
  1. 时间单位
  • 使用 `timescale 指令定义时间单位和精度,例如:
    verilog `timescale 1ns/1ps
  1. 信号强度冲突
  • 当多个晶体管驱动同一节点时,Verilog 根据信号强度(如 supply, strong, pull)解析最终值。
  • 需注意竞争冒险(race condition),确保设计正确。
  1. 高阻态(z
  • 开关级建模广泛使用高阻态(z)表示晶体管关闭时的状态。
  • 使用 pulluppulldown 确保未驱动节点的默认状态。
  1. 复杂性
  • 开关级建模适合小规模电路或标准单元设计,复杂电路建议使用门级或行为级建模以提高效率。
  1. 工具支持
  • 不同仿真工具(如 ModelSim、VCS)对开关级原语和信号强度的支持可能不同,需参考工具文档。

7. 常见应用场景

  • 标准单元设计:在 ASIC 设计中,开关级建模用于定义标准单元(如 NAND、NOR)的晶体管级行为。
  • 低功耗分析:模拟晶体管的开关行为,分析动态功耗或漏电流。
  • 时序验证:在门级仿真中验证晶体管级的时序特性。
  • 教育与研究:用于学习 CMOS 电路的工作原理。

8. 常见问题与解答

  • Q:开关级建模与门级建模的区别?
  • A:开关级建模直接描述晶体管行为(MOS 管、传输门),更接近物理实现;门级建模使用逻辑门(如 and, or),抽象层次更高。
  • Q:开关级建模是否适合综合?
  • A:开关级原语通常不支持综合,综合工具会将设计转换为门级网表。开关级建模主要用于仿真和验证。
  • Q:如何添加延迟?
  • A:通过在原语实例中指定 #delay 或在模块中结合 specify 块添加路径延迟。

9. 扩展建议

  • 结合 SDF 文件:在门级仿真中,使用 SDF 文件导入实际晶体管延迟,覆盖 Verilog 中的延迟值。
  • 测试bench:编写详细的测试bench,验证开关级电路的功能和时序。
  • 行为级建模:对于复杂设计,先用行为级建模验证功能,再用开关级建模验证晶体管行为。

如果你有具体的开关级建模需求(例如某个 CMOS 电路、传输门设计或时序分析),请提供更多细节,我可以为你提供详细的代码示例或优化建议!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注