FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
登录
首页-技术文章/快讯-技术分享-正文

Verilog always块敏感列表优化指南:2026年综合工具实测与对比

FPGA小白FPGA小白
技术分享
18小时前
0
0
9

Quick Start

打开 Vivado 2026.1(或 Quartus Prime Pro 25.1),创建一个新工程,器件选择 xc7k325tffg900-2(或等效)。编写一个简单的计数器模块,使用 always @(posedge clk) 敏感列表,综合后查看资源与 Fmax。修改为 always @(posedge clk or posedge rst),添加异步复位,重新综合,对比资源与 Fmax 变化。编写一个组合逻辑模块,使用 always @(*) 敏感列表,综合后查看 LUT 使用量。将组合逻辑敏感列表改为显式列出所有输入信号(如 always @(a or b or sel)),重新综合,观察资源是否变化。打开综合报告(report_utilizationreport_timing_summary),记录 Fmax、LUT、FF 数量,确认无意外锁存器推断。对于时序逻辑,尝试使用 always @(negedge clk) 代替 posedge,重新综合,对比 Fmax(通常无差异,但可能影响时序收敛)。对于多时钟域设计,分别使用 always @(posedge clk1)always @(posedge clk2),综合后检查跨时钟域路径是否被正确约束。

预期结果:在 10 分钟内完成上述步骤,得到对比表格,验证敏感列表写法对综合结果的影响。

前置条件与环境

项目推荐值说明替代方案
器件/板卡Xilinx Kintex-7 xc7k325tffg900-2主流中端 FPGA,资源适中,适合对比测试Artix-7 / Cyclone V / Agilex 7
EDA 版本Vivado 2026.1最新版本,综合算法有优化Vivado 2024.2 / Quartus Prime Pro 25.1
仿真器Vivado Simulator 或 ModelSim SE-64 2025.1用于功能仿真验证锁存器行为Questa / VCS
时钟/复位时钟 100 MHz,异步复位高有效标准测试条件50 MHz / 200 MHz,低有效复位
接口依赖无外部接口,纯内部逻辑避免 I/O 约束干扰可添加简单 GPIO 输出
约束文件create_clock -period 10 [get_ports clk]必须定义主时钟set_false_path 用于跨时钟域

目标与验收标准

  • 功能点:验证不同敏感列表写法(posedge/negedge/电平敏感/混合)对综合结果的影响。
  • 性能指标:记录 Fmax(MHz)、LUT 数量、FF 数量、推断的锁存器数量。
  • 资源/Fmax:对比显式列表与 always @(*) 的资源差异;对比异步复位与同步复位的 Fmax 差异。
  • 关键波形/日志:仿真波形中确认无意外锁存器行为;综合日志中无“Inferring latch”警告。

实施步骤

工程结构

创建顶层模块 top,包含一个计数器 counter 和一个组合逻辑 combo。每个模块独立文件,便于单独综合。约束文件 top.xdc 定义时钟与复位。

关键模块:计数器(时序逻辑)

module counter (
    input wire clk,
    input wire rst,
    output reg [7:0] count
);
    always @(posedge clk or posedge rst) begin
        if (rst)
            count <= 8'd0;
        else
            count <= count + 1;
    end
endmodule

逐行说明

  • 第 1 行:模块声明,输入时钟 clk 和复位 rst,输出 8 位寄存器 count。
  • 第 2 行:always 块敏感列表包含时钟上升沿和复位上升沿,这是异步复位的标准写法。
  • 第 3 行:if (rst) 判断复位信号有效,综合工具会推断为异步复位 FF。
  • 第 4 行:复位时 count 清零。
  • 第 5 行:否则在每个时钟上升沿递增。
  • 第 6 行:endmodule。

关键模块:组合逻辑(电平敏感)

module combo (
    input wire [3:0] a,
    input wire [3:0] b,
    input wire sel,
    output reg [3:0] y
);
    always @(*) begin
        if (sel)
            y = a + b;
        else
            y = a - b;
    end
endmodule

逐行说明

  • 第 1 行:模块声明,输入 a、b、sel,输出 reg y。
  • 第 2 行:always @(*) 表示敏感列表包含所有输入信号,综合工具会自动推断组合逻辑。
  • 第 3 行:if (sel) 判断选择信号。
  • 第 4 行:sel 为 1 时 y = a + b。
  • 第 5 行:else y = a - b。
  • 第 6 行:endmodule。注意:使用阻塞赋值 =,因为这是组合逻辑。

时序/CDC/约束

  • 时钟约束create_clock -period 10 [get_ports clk]
  • 异步复位:无需额外约束,但建议添加 set_false_path -from [get_ports rst] 以避免复位路径影响时序。
  • 跨时钟域:如果使用多个 always 块驱动不同时钟域,必须添加 set_clock_groups -asynchronous 约束。

验证

  • 编写 testbench,分别测试计数器递增和组合逻辑加减功能。
  • 仿真检查波形:确保计数器在复位后清零,时钟上升沿递增;组合逻辑输出随输入立即变化。
  • 检查综合日志:搜索“latch”关键词,确认无意外锁存器。

常见坑与排查

坑 1:在组合逻辑 always 块中使用非阻塞赋值

在组合逻辑中应使用阻塞赋值(=),若误用非阻塞赋值(<=),综合工具可能推断出意外的锁存器或时序逻辑,导致功能错误。排查方法:检查综合日志中是否出现“Inferring latch”警告,并仿真验证组合逻辑是否按预期立即响应。

坑 2:敏感列表遗漏信号

若显式列出敏感列表但遗漏了某个输入信号,组合逻辑可能无法正确更新,综合工具会推断出锁存器。建议优先使用 always @(*) 避免遗漏。排查方法:对比显式列表与 @(*) 的综合结果,检查 LUT 数量是否异常增加。

坑 3:多驱动冲突

同一个 reg 在多个 always 块中赋值会导致多驱动冲突,综合报错或产生意外行为。确保每个 reg 只在一个 always 块中赋值。

扩展与进阶

可进一步测试以下场景:

  • 在组合逻辑中使用 always @(posedge clk) 模拟时序逻辑,对比资源与 Fmax。
  • 在时序逻辑中使用电平敏感列表(如 always @(clk or rst) 但缺少边沿),观察综合工具如何推断。
  • 使用不同综合工具(Vivado vs Quartus)对比敏感列表优化策略的差异。

参考与附录

IEEE Std 1364-2005 Verilog HDL 标准中关于 always 块敏感列表的规范。Vivado 综合用户指南 (UG901)。Quartus Prime Pro 综合用户指南。

标签:
本文原创,作者:FPGA小白,其版权均为FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训所有。
如需转载,请注明出处:https://z.shaonianxue.cn/46722.html
分享:
2026年Q2 FPGA行业深度观察:大模型推理、车规认证与Chiplet互连三大热点解析
2026年Q2 FPGA行业深度观察:大模型推理、车规认证与Chiplet互连三大热点解析上一篇
FPGA在AI边缘推理中实现低精度量化:INT4部署实战指南下一篇
FPGA在AI边缘推理中实现低精度量化:INT4部署实战指南
相关文章
总数:1.22K

基于FPGA的SPI Flash控制器设计与调试

QuickStart准备环境:安装Vivado2021.1及以上版本,确保板卡(如XilinxArtix-7)驱动正常。创建工程:新…
二牛学FPGA二牛学FPGA
技术分享
24天前
0
0
40
0

2026年FPGA产业趋势深度解读:AI推理、国产EDA、RISC-V与汽车安全成关键战场

作为「成电国芯FPGA云课堂」的特邀小记者,林芯语在本期深度报道中,基于近期行业公开讨论与智能梳理线索,为您拆解FPGA在AI大模型推理加速…
FPGA小白FPGA小白
技术分享
1个月前
0
0
41
0

2026年FPGA验证新趋势:软硬协同与虚拟原型如何重塑芯片开发

嘿,芯片设计越来越复杂,像搭一个超级精密的乐高城市。这时候,FPGA原型验证就成了连接算法、软件和最终芯片之间那座“不能塌的桥”。转眼快到202…
FPGA小白FPGA小白
技术分享
1个月前
0
0
258
0

Verilog 常见语法错误识别与纠正指南:基于 FPGA 综合工具的实践验证

QuickStart:快速识别并修复典型语法错误本指南通过一个简单的D触发器代码示例,引导您快速识别并修复Verilog中三种最常见语…
二牛学FPGA二牛学FPGA
技术分享
1个月前
0
0
34
0

FPGA时序约束中set_false_path与set_clock_groups的正确用法:设计与实施指南

QuickStart打开Vivado(2024.2或更新版本)并创建一个新工程,目标器件选择XilinxArtix-7XC7A35T-1C…
FPGA小白FPGA小白
技术分享
19天前
0
0
34
0

Verilog实战:2026年用双口RAM实现异步FIFO的常见调试技巧

QuickStart1.安装Vivado2024.2或更新版本(2026年推荐使用Vivado2025.1+),确保支持目标器件(…
二牛学FPGA二牛学FPGA
技术分享
19天前
0
0
49
0
评论表单游客 您好,欢迎参与讨论。
加载中…
评论列表
总数:0
FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
没有相关内容