第一步Verilog 门的类型——分析与知识整理1. 标题与关键词解读关键词三态门、上下拉、选择器2. 门级建模概述定义使用基本逻辑单元与门、与非门等进行低抽象级设计更注重硬件实现方式。对比行为级建模行为级RTL描述算法或流程效率高门级建模用于对硬件有特殊要求的设计例如门控时钟。门级建模通过模块例化方式使用内置门单元。3. 多输入门特点单个输出多个输入。内置门and与、nand与非、or或、nor或非、xor异或、xnor同或。例化语法第一个端口是输出后面是输入。可以不指定实例名。多输入支持超过2个输入时继续在端口列表中添加信号即可。真值表提示输出不会出现高阻Z。代码示例and a1 (OUTX, IN1, IN2); nand na1 (OUTX1, IN1, IN2); or or1 (OUTY, IN1, IN2); nor nor1 (OUTY1, IN1, IN2); xor xor1 (OUTZ, IN1, IN2, IN3); xnor (OUTZ1, IN1, IN2); // 无实例名4. 多输出门特点单个输入多个输出。起缓冲、延时作用。内置门buf缓冲器、not非门。例化语法第一个端口是输出最后一个端口是输入。多个输出时依次列出输出信号最后是输入。可以不指定实例名。真值表输出不会出现Zbuf输出与输入相同not输出取反。代码示例buf buf1 (OUTX2, IN1); buf buf2 (OUTY2, OUTY3, IN2); // 两个输出一个输入 not (OUTZ3, IN3); // 无实例名5. 三态门定义带有控制端的缓冲器控制有效时数据正常传递否则输出高阻Z。四种类型bufif1控制1时导通高有效bufif0控制0时导通低有效notif1控制1时导通输出取反notif0控制0时导通输出取反例化语法第一端口输出第二端口数据输入第三端口控制输入。不支持多输出可不指定实例名。真值表当控制无效时输出Z控制有效时输出等于输入或取反。输入端为Z或X时输出可能为X或Z依赖强度。代码示例bufif1 buf1 (OUTX, IN1, CTRL1); bufif0 buf2 (OUTY, IN1, CTRL2); notif1 buf3 (OUTZ, IN1, CTRL3); notif0 (OUTX1, IN1, CTRL4); // 无实例名6. 上下拉电阻定义将不确定信号钳位至高电平上拉或低电平下拉用于模块端口保护。关键字pullup上拉、pulldown下拉。特点没有输入只有输出。例化时只需填需要设置的信号。不可更改。用途当输入信号为高阻时上拉将其置1下拉将其置0。代码示例pullup p1 (IN1); pulldown (OUTX); // 无实例名7. 4选1多路选择器的门级 vs 行为级对比门级建模使用基本门单元搭建逻辑电路。需先取反选择信号再用与门组合各通道最后用或门汇总。代码冗长。行为级建模使用assign语句和条件表达式简洁易懂。结论行为级建模可读性好、效率高综合结果与门级一致。门级代码module mux4to1_gate( input A, B, C, D, S0, S1, output F ); wire S0R, S1R, AAND, BAND, CAND, DAND; not (S0R, S0); not (S1R, S1); and (AAND, A, S1R, S0R); and (BAND, B, S1R, S0); and (CAND, C, S1, S0R); and (DAND, D, S1, S0); or (F, AAND, BAND, CAND, DAND); endmodule行为级代码module mux4to1_behavior( input A, B, C, D, S0, S1, output F ); assign F {S1, S0} 2b00 ? A : {S1, S0} 2b01 ? B : {S1, S0} 2b10 ? C : {S1, S0} 2b11 ? D : 0; endmodule8. 总结要点门级建模适用于需要精确控制硬件结构如门控时钟、三态总线、上拉/下拉的场景。内置门单元包括多输入门、多输出门、三态门、上下拉电阻单元。例化时端口顺序固定输出在前可省略实例名。对于复杂逻辑行为级建模更高效门级建模用于底层或特殊用途。第二步费曼学习法——“门级建模Verilog 的基本积木”门级建模就是直接用最底层的逻辑元件与门、或门、非门、三态门等搭建电路就像玩乐高积木一样。虽然 RTL 代码行为级更常用但当你需要精确控制信号方向、实现总线共享或者处理门控时钟时门级单元必不可少。作为验证工程师你可能很少自己写门级代码但读懂它、仿真它、检查它的行为是否正确是基本功。本文用“开关、导线、水龙头”的比喻带你彻底搞懂多输入门、多输出门、三态门和上下拉电阻分别做什么什么时候要用门级建模以及一个4选1选择器用手工搭门电路和写一行assign的区别有多大。我们着重讲什么需要关注什么为什么这样做这样做的好处如何学习使用着重讲解多输入门与或非等基本逻辑如何例化端口顺序注意事项。多输出门缓冲器与非门一个输入可以驱动多个输出常用于信号复制。三态门bufif1/bufif0/notif1/notif0——总线共享的关键控制信号无效时输出高阻Z。上下拉电阻pullup/pulldown——解决悬空输入给端口一个确定的默认电平。门级 vs 行为级以4选1选择器为例直观感受代码量的差异理解为什么实际工作中主要用行为级。为什么这样做门级建模更贴近物理电路对于时序控制、低功耗设计中的门控时钟、总线仲裁、IO PAD 配置等场景需要精确控制逻辑门的连接。验证工程师遇到门级网表比如综合后、布局布线后时需要理解这些基本单元的行为。这样做的好处精确控制延迟和信号传播。实现 RTL 中不直接支持的单元如可配置上下拉。生成与工艺无关的低级网表便于后端工具处理。如何学习使用先记住常用门的名称和真值表与或非异或同或。练习例化语法输出在最前输入在后可以不写实例名。用仿真器跑三态门的例子观察控制信号无效时输出是否为 Z。写一个简单的 pullup 来消除仿真中的“悬空输入”警告。对比门级和行为级实现同一个功能理解综合工具的威力。一、多输入门与门、或门……就是最基础的逻辑电路通俗解释多输入门就像做判断题的裁判。比如与门and所有输入都必须为真1输出才为真。或门or只要有一个为真输出就为真。非门not是反过来。这些门都有多个输入至少2个一个输出。Verilog 中的实例// 与门输出 OUT 等于 IN1 IN2 and my_and (OUT, IN1, IN2); // 三输入或门 or my_or (OUT2, A, B, C);端口顺序第一个是输出后面全是输入。这个顺序很重要写错了会导致信号错位。你也可以不写实例名and (OUT, IN1, IN2); // 合法但不推荐复杂设计中使用验证工程师视角在门级仿真中你会看到这些门的行为完全符合真值表。注意输出永远不会变成 Z高阻只有标准 0/1/X。二、多输出门缓冲器和非门一个输入喇叭广播通俗解释缓冲器buf像一根导线但可以增加驱动能力、加入延时。非门not则是取反。它们只有一个输入但可以有多个输出相当于把信号复制多份。代码示例buf b1 (OUT1, IN); // 一个输出一个输入 buf b2 (OUT1, OUT2, IN); // 两个输出一个输入最后一个是输入 not (OUT, IN); // 省略实例名验证工程师注意多输出门在综合后的网表中经常出现用于扇出较大的信号如时钟、复位。仿真时多个输出会同时变化。三、三态门总线共享的“水龙头开关”通俗解释三态门有一个控制端。控制端打开时数据通过控制端关闭时输出变成高阻 Z相当于从电路中断开。这样多个三态门可以共用一根导线只要同一时刻只有一个门打开就不会冲突。这是实现共享总线的基础。bufif1控制1时导通输出 输入bufif0控制0时导通notif1控制1时导通输出取反notif0控制0时导通输出取反代码示例bufif1 my_tri (bus, data_out, enable); // enable1时data_out驱动bus真值表核心控制无效 → 输出 Z控制有效 → 输出等于输入或取反输入为 X/Z 时输出可能是 X/Z取决于驱动强度。验证工程师在仿真中看到输出为 Z 是正常的。要检查是否有多个三态门同时打开导致总线竞争会显示 X 或强度冲突。这是常见 bug。四、上下拉电阻给悬空的输入端一个“默认姿态”通俗解释模块的输入端口如果什么都没接悬空它的逻辑值是不确定的仿真中会显示 X。为了消除这种不确定性可以加一个上拉电阻pullup把它拉到高电平1或者下拉电阻pulldown拉到低电平0。代码示例pullup (input_pin); // 将 input_pin 强制上拉至 1 pulldown (output_pin);特点这类门没有输入只有输出。一旦例化效果永久。验证工程师当你在仿真中看到某个信号是 X 且没有驱动源很可能是缺少上/下拉或者端口漏接。添加上下拉可以避免这种 X但它会掩盖真正的连接错误所以一般只在确实需要固定电平的场合使用如 I/O PAD 配置。五、实战对比4选1选择器的门级 vs 行为级门级实现需要取反两个选择信号然后用 4 个与门分别选中一个通道最后用或门把结果汇总。代码冗长不易读。行为级实现一行assign加条件运算符清晰明了。为什么还要学门级因为行为级代码综合后也会变成门级网表你需要理解网表的结构才能排查问题。而且有些特殊电路如门控时钟必须用门级描述才能精确控制。验证工程师当你拿到综合后的网表你会看到大量的and、or、not单元。你需要通过它们还原出原始的逻辑功能判断是否与 RTL 一致。六、学习路线图第1天用仿真器写一个简单的与门、或门、非门例化观察波形确认真值表。第2天练习多输出门的例化观察两个输出是否同时变化。第3天写一个三态门总线共享的例子两个bufif1连接到同一根线交替使能观察波形不会出现冲突。第4天模拟一个悬空输入观察 X然后加上pullup看 X 变成 1。第5天用门级搭建一个 4 选 1 选择器然后用行为级重写对比综合后的网表是否一致。推荐工具任何 Verilog 仿真器VCS、Questa、Icarus Verilog都可以。写个小 testbench激励输入观察输出。最终总结验证工程师的门级建模检查清单例化门单元时端口顺序正确输出第一输入其后。三态门同时使能时总线不会出现竞争仿真中不应有 X。悬空的输入端口已添加上下拉电阻或确认可以有 X 行为。对于门控时钟等电路使用门级单元比 RTL 更可靠。行为级代码优先仅在需要底层控制时使用门级。门级建模是数字设计的“机器语言”虽然平时用 RTL 编程更高效但读懂门级网表、理解三态和上下拉是验证工程师调试后仿和解决总线冲突的必备技能。