FPGA基础 -- Verilog 门级建模
一、什么是 Verilog 的门级建模?
Verilog 中的建模方式有三种层级:
建模层级 | 描述 | 适用场景 |
---|---|---|
行为级建模(Behavioral) | 使用 always 、if/else 、case 描述行为 | 通用逻辑/控制流程建模 |
数据流级建模(Dataflow) | 使用运算符表达式(assign ) | 简单组合逻辑、加法器、比较器等 |
门级建模(Gate-Level) | 使用 Verilog 内建的基本门元件进行建模 | 结构级建模、与电路原理图一致的设计表达 |
门级建模是通过调用 Verilog 中的内建原语(primitive gates)来构造电路,模拟出真实门电路逻辑连接过程。可理解为电路图的代码表达方式。
二、Verilog 常用的门级原语(Primitive Gates)
Verilog 提供了以下内建逻辑门:
1. 基本逻辑门
原语 | 逻辑功能 | 描述 |
---|---|---|
and | 与门 | 输出为所有输入之与 |
or | 或门 | 输出为所有输入之或 |
not | 非门 | 输出为输入的取反 |
xor | 异或门 | 两输入不同为1 |
nand | 与非门 | and 的反逻辑 |
nor | 或非门 | or 的反逻辑 |
xnor | 同或门 | xor 的反逻辑 |
2. 三态门
原语 | 描述 |
---|---|
bufif1 , bufif0 | 条件缓冲器:高电平/低电平使能下输出 |
notif1 , notif0 | 条件非门:高电平/低电平使能下输出反 |
三、Verilog 门级建模代码实例
例1:构建一个简单的与非门电路 nand_out = ~(a & b)
module nand_gate_example(output y, input a, input b);wire w1;and (w1, a, b); // and门:w1 = a & bnot (y, w1); // not门:y = ~w1
endmodule
或者更简洁地:
module nand_gate_example(output y, input a, input b);nand (y, a, b); // 直接使用 Verilog 的 nand 原语
endmodule
例2:构建半加器 Half Adder
输入 | 输出 |
---|---|
A, B | Sum, Carry |
module half_adder(output sum, carry, input a, b);xor (sum, a, b); // sum = a ^ band (carry, a, b); // carry = a & b
endmodule
四、门级建模的工程价值与局限
优势
- 非常贴近硬件原理图,适合教学、逻辑级仿真或逆向工程场景;
- 可以用于 自动生成 Netlist 的回灌仿真(Back Annotation);
- 便于理解布局布线后的逻辑功能;
局限
- 不适合开发复杂系统(FSM、CPU 等);
- 可读性差、难以维护;
- 可综合性较差(部分原语不能直接综合);
- 时序和 CDC(跨时钟域)不易表达;
五、门级建模在实际工程中的应用场景
场景 | 示例 |
---|---|
1. 回灌仿真(Gate-Level Simulation) | Vivado/Quartus P&R 后导出 .v netlist 文件进行功能仿真与功耗分析 |
2. 静态分析(STA)路径可视化 | 与 TimeQuest/Vivado STA 工具配合调试逻辑路径 |
3. 教学/电路结构设计练习 | 初学者构建逻辑门电路模型 |
4. 自定义原语模型/库 | 与模拟建模混合设计中自定义门级行为,如 delay 模型 |
六、门级建模与延迟(延伸)
Verilog 支持在门级建模中使用 延迟模型:
and #(5) u1 (y, a, b); // 传播延迟 5 时间单位
and #(3, 4) u2 (y, a, b); // 上升延迟 3,下降延迟 4
用于 延时仿真建模、时序验证、行为近似建模,但实际综合会忽略这些延迟信息。
总结
项目 | 描述 |
---|---|
适用阶段 | 初学者、结构电路建模、Netlist 仿真 |
编码方法 | 使用 and/or/nand/nor/not/xor/xnor 等原语 |
工程建议 | 用于结构表达与验证回灌,不适合构建复杂系统 |
与 P&R 关系 | 门级建模常用于 P&R 后回灌仿真与功耗估计 |
补充工具 | 搭配 Vivado Netlist Viewer、RTL Viewer 使用 |