Verilog 门的类型

在 Verilog 中,门(Gate) 是用于描述数字电路基本逻辑单元的原语(Primitive),主要用于门级建模(Gate-Level Modeling)开关级建模(Switch-Level Modeling)。Verilog 提供了多种内置门类型,包括逻辑门、缓冲器、三态门和开关级原语,用于模拟硬件的行为。以下是 Verilog 中门的类型、功能、语法及其应用的详细说明。


1. Verilog 门的分类

Verilog 的门可以分为以下三大类:

  1. 基本逻辑门:实现基本的布尔逻辑运算(如与、或、非)。
  2. 缓冲器和三态门:用于信号缓冲或高阻态控制。
  3. 开关级原语:模拟晶体管级行为(如 NMOS、PMOS)。

2. 基本逻辑门

这些门实现基本的布尔逻辑运算,常用于组合逻辑设计。

门类型功能语法示例
and与门(AND)and (out, in1, in2, ...);
or或门(OR)or (out, in1, in2, ...);
not非门(NOT)not (out, in);
nand与非门(NAND)nand (out, in1, in2, ...);
nor或非门(NOR)nor (out, in1, in2, ...);
xor异或门(XOR)xor (out, in1, in2, ...);
xnor同或门(XNOR)xnor (out, in1, in2, ...);
  • 特点
  • 支持多个输入(in1, in2, ...),但只有一个输出(out)。
  • 逻辑功能直接对应布尔运算,例如 nand 输出 ~(in1 & in2 & ...)
  • 延迟:可通过 #delay 指定传播延迟,例如:
  and #5 (Y, A, B); // 5ns 延迟的与门
  • 示例
  module logic_gates (input A, B, output Y_and, Y_or, Y_not);
      and (Y_and, A, B); // Y_and = A & B
      or (Y_or, A, B);   // Y_or = A | B
      not (Y_not, A);    // Y_not = ~A
  endmodule

3. 缓冲器和三态门

这些门用于信号缓冲或控制信号的高阻态输出。

门类型功能语法示例
buf缓冲器(Buffer)buf (out, in);
not反相器(Inverter)not (out, in);
bufif0三态缓冲器(控制信号为 0 时导通)bufif0 (out, in, control);
bufif1三态缓冲器(控制信号为 1 时导通)bufif1 (out, in, control);
notif0三态反相器(控制信号为 0 时导通)notif0 (out, in, control);
notif1三态反相器(控制信号为 1 时导通)notif1 (out, in, control);
  • 特点
  • bufnot 是单输入单输出的门,分别实现直通(out = in)和反相(out = ~in)。
  • 三态门(bufif0, bufif1, notif0, notif1)根据控制信号决定输出是否为高阻态(z)。
  • 三态门行为:
    • bufif1:当 control=1 时,out=in;当 control=0 时,out=z
    • bufif0:当 control=0 时,out=in;当 control=1 时,out=z
    • notif1, notif0:类似,但输出反相(out=~in)。
  • 延迟:支持固定延迟、上升/下降延迟或最小/典型/最大延迟,例如:
  bufif1 #(2:3:4) (Y, A, EN); // 最小 2ns,典型 3ns,最大 4ns
  • 示例
  module tri_state (input A, EN, output Y);
      bufif1 (Y, A, EN); // EN=1 时,Y=A;EN=0 时,Y=z
  endmodule

4. 开关级原语

开关级原语用于模拟晶体管级行为,主要用于开关级建模,描述 MOS 晶体管或传输门的行为。

门类型功能语法示例
nmosNMOS 晶体管nmos (out, in, control);
pmosPMOS 晶体管pmos (out, in, control);
cmosCMOS 传输门cmos (out, in, ncontrol, pcontrol);
tran双向传输门tran (inout1, inout2);
tranif0双向传输门(控制为 0 导通)tranif0 (inout1, inout2, control);
tranif1双向传输门(控制为 1 导通)tranif1 (inout1, inout2, control);
pullup上拉电阻pullup (signal);
pulldown下拉电阻pulldown (signal);
rnmos, rpmos, rcmos, rtran, rtranif0, rtranif1带电阻的对应原语类似上述,但信号强度较弱
  • 特点
  • NMOS/PMOS:模拟 MOS 晶体管的单向信号传播。
    • NMOS:control=1 时,out=incontrol=0 时,out=z
    • PMOS:control=0 时,out=incontrol=1 时,out=z
  • CMOS:结合 NMOS 和 PMOS,通常 ncontrolpcontrol 互补。
  • tran/tranif:双向传输门,允许信号双向流动,常用于多路选择器或总线。
  • pullup/pulldown:为信号提供默认高电平或低电平,防止浮空。
  • 带电阻原语(如 rnmos):模拟弱信号传播,强度低于正常原语。
  • 延迟:支持与基本逻辑门相同的延迟模型,例如:
  nmos #(2:3:4) (Y, A, G); // NMOS 晶体管,最小 2ns,典型 3ns,最大 4ns
  • 示例
  module cmos_inv (input A, output Y);
      supply1 vdd;
      supply0 gnd;
      pmos (Y, vdd, A); // A=0 时,Y=vdd (1)
      nmos (Y, gnd, A); // A=1 时,Y=gnd (0)
  endmodule

5. 门延迟

所有门类型都支持延迟建模,用于模拟信号传播时间。延迟类型包括:

  • 固定延迟#delay
  and #5 (Y, A, B); // 5ns 延迟
  • 上升/下降延迟#(rise, fall)
  and #(3, 2) (Y, A, B); // 上升 3ns,下降 2ns
  • 最小/典型/最大延迟#(min:typ:max)
  and #(2:3:4) (Y, A, B); // 最小 2ns,典型 3ns,最大 4ns

6. 综合示例

以下是一个结合多种门类型的 Verilog 模块:

`timescale 1ns/1ps
module gate_example (input A, B, EN, output Y, Z);
    wire w1, w2;

    // 基本逻辑门
    and #3 (w1, A, B); // A & B,延迟 3ns
    not (w2, A);       // ~A

    // 三态缓冲器
    bufif1 #2 (Y, w1, EN); // EN=1 时,Y=w1;延迟 2ns

    // 开关级建模
    supply1 vdd;
    supply0 gnd;
    pmos #(1:2:3) (Z, vdd, w2); // w2=0 时,Z=1
    nmos #(1:2:3) (Z, gnd, w2); // w2=1 时,Z=0
endmodule

测试代码

module test_gate_example;
    reg A, B, EN;
    wire Y, Z;

    gate_example u_gate (A, B, EN, Y, Z);

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

7. 注意事项

  1. 仿真与综合
  • 基本逻辑门和缓冲器通常可综合为标准单元。
  • 开关级原语(如 nmos, pmos)主要用于仿真,综合工具通常不支持,需转换为门级网表。
  • 延迟仅用于仿真,综合工具依赖 SDC 文件定义时序。
  1. 时间单位
  • 使用 `timescale 指令定义时间单位,例如:
    verilog `timescale 1ns/1ps
  1. 信号强度
  • 开关级原语支持信号强度(如 supply, strong, pull),用于解决多驱动冲突。
  • 基本逻辑门和三态门默认使用 strong 强度。
  1. 高阻态(z
  • 三态门和开关级原语广泛使用高阻态(z)表示未驱动状态。
  • 使用 pulluppulldown 避免浮空节点。
  1. 适用场景
  • 基本逻辑门:适合门级网表或简单组合逻辑。
  • 三态门:用于总线驱动或多路复用。
  • 开关级原语:用于晶体管级建模或低功耗分析。

8. 常见问题与解答

  • Q:基本逻辑门与开关级原语的区别?
  • A:基本逻辑门(如 and, or)是更高层次的抽象,描述逻辑功能;开关级原语(如 nmos, pmos)模拟晶体管行为,更接近物理实现。
  • Q:如何为门添加延迟?
  • A:通过 #delay 指定固定延迟、上升/下降延迟或最小/典型/最大延迟,也可使用 specify 块定义路径延迟。
  • Q:开关级原语是否适合综合?
  • A:通常不支持综合,仅用于仿真。综合工具将设计转换为门级逻辑。

9. 扩展建议

  • 门级仿真:结合 SDF 文件导入实际延迟,验证综合后的网表。
  • 行为级建模:对于复杂设计,先用行为级建模(always, assign)验证功能,再用门级或开关级验证时序。
  • 测试bench:编写详细测试bench,确保覆盖所有输入组合和时序条件。

如果你有具体的门类型设计需求(例如实现某个逻辑电路或晶体管级功能),请提供更多细节,我可以为你提供详细的代码示例或优化建议!

类似文章

发表回复

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