1.【Verilog】门的类型
第一步: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(非门)。 - 例化语法:第一个端口是输出,最后一个端口是输入。多个输出时,依次列出输出信号,最后是输入。
- 可以不指定实例名。
- 真值表:输出不会出现Z;
buf输出与输入相同,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} == 2'b00 ? A : {S1, S0} == 2'b01 ? B : {S1, S0} == 2'b10 ? C : {S1, S0} == 2'b11 ? 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); // enable=1时,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 编程更高效,但读懂门级网表、理解三态和上下拉,是验证工程师调试后仿和解决总线冲突的必备技能。
