FPGA的仿真分类
摘要:本文系统介绍了 FPGA 仿真的三大分类:功能仿真、综合后仿真和时序仿真。详细阐述了各类仿真的定义、执行时机、延迟信息、核心目的、工程现状及 Quartus 中的操作方法,并提供了时序仿真的三种分析方法。适合 FPGA 初学者和需要系统了解仿真分类的开发者阅读。
一、引言
目录
- 一、引言
- 二、FPGA 仿真的三大分类
- 2.1 功能仿真(前仿真 / RTL 仿真)
- 2.1.1 定义与执行时机
- 2.1.2 延迟信息
- 2.1.3 核心目的
- 2.1.4 工程现状
- 2.1.5 Quartus 中的启动方式
- 2.1.6 关于"功能仿真"界定标准的特别说明
- 2.2 综合后仿真(门级仿真 / 网表仿真)
- 2.2.1 定义与执行时机
- 2.2.2 延迟信息
- 2.2.3 核心目的
- 2.2.4 工程现状
- 2.2.5 Quartus 中的启动方式
- 2.3 时序仿真(后仿真 / 布局布线后仿真)
- 2.3.1 定义与执行时机
- 2.3.2 延迟信息
- 2.3.3 核心目的
- 2.3.4 前置条件
- 2.3.5 Quartus 中的分析方法
- 方法一:ModelSim 波形观察
- 方法二:TimeQuest 时序分析器(推荐)
- 方法三:前后仿波形对比
- 2.1 功能仿真(前仿真 / RTL 仿真)
作为 FPGA 初学者,在使用 ModelSim-Altera 进行入门项目时,很容易遇到各种问题。仿真可以在一定程度上规避上板后出现的问题。仿真主要有两个作用:一是在确定没有 Verilog 语法错误之后进行时序逻辑功能上的排错和验证;二是在没有板子的条件下观看波形效果图。本文主要介绍使用 ModelSim-Altera 进行仿真的分类基础知识。
二、FPGA 仿真的三大分类
2.1 功能仿真(前仿真 / RTL 仿真)
2.1.1 定义与执行时机
- 定义:功能仿真是指对设计代码进行的逻辑功能验证仿真。
- 执行时机:
- 在 Quartus 软件语境下:综合(Synthesis)之后、布局布线(Place & Route)之前,对综合后的网表进行仿真(但强制忽略延迟信息)。
- 在通用教材语境下:综合之前,对 RTL 源码进行仿真。
- 仿真对象:
- Quartus 语境:综合后的门级网表(但延迟被清零)。
- 教材语境:RTL 源码(
.v文件)。
2.1.2 延迟信息
- 不包含任何延迟信息(理想 0 延迟模型),因此功能仿真也称为理想仿真。
- 无论是针对 RTL 源码还是综合后网表,仿真器都会忽略或强制清零所有门延迟和布线延迟。
2.1.3 核心目的
- 验证设计模块的逻辑功能是否正确。
- 常见验证内容:
- 计数器能否按预期计数。
- 状态机跳转是否正常。
- 组合逻辑输出是否符合真值表。
- 按键消抖逻辑是否产生正确的脉冲。
2.1.4 工程现状
- 功能仿真是 FPGA 开发中频率最高、最常用的仿真类型。
- 90% 以上的 Bug 应在此阶段发现并修复。
- 建议:每写完一个模块,就立即编写对应的 Testbench 进行功能仿真,避免问题累积到后期难以定位。
2.1.5 Quartus 中的启动方式
- 菜单路径:
Tools→Run Simulation Tool→RTL Simulation - 或:
Tools→Run Simulation Tool→Gate Level Simulation(此时仍属于功能仿真范畴,因为尚未加载 SDF 时序信息) - ModelSim 自动拉起,加载对应仿真对象并运行。
2.1.6 关于"功能仿真"界定标准的特别说明
- 在通用数字电路教材中,"功能仿真"特指综合前的 RTL 仿真;但在 Quartus II 软件中,"功能仿真(Functional Simulation)"指的是不包含任何时序信息(SDF)的仿真,其目的仅为验证逻辑功能。
- 因此,当题目描述为"对综合后的网表进行仿真,但不带布局布线后的时序信息"时,在 Quartus 语境下的正确答案是"功能仿真",而在通用教材语境下则对应"综合后仿真(门级仿真)"。考试时请以题目所在语境为准。
- 简单总结:"功能仿真"这个名词,在 Quartus 里是按"目的"命名的(看功能、不要时序),在教材里是按"对象"命名的(看 RTL)。两种说法都对,关键看语境。
2.2 综合后仿真(门级仿真 / 网表仿真)
2.2.1 定义与执行时机
- 定义:综合后仿真是指对综合工具生成的门级网表进行的仿真。
- 执行时机:综合(Synthesis)之后,布局布线(Place & Route)之前。
- 仿真对象:综合后的
.vqm或.vo网表文件 + 器件库模型。
2.2.2 延迟信息
- 仅包含门延迟(Cell Delay),不包含布线延迟。
- 原因:此时尚未进行布局布线,信号在芯片内部的物理走线路径未知,因此无法计算线延迟。
2.2.3 核心目的
- 验证综合器是否将 RTL 代码正确地"翻译"成了门级电路。
- 检查综合过程中是否存在语法误译或优化错误。
2.2.4 工程现状
- 现代综合工具(如 Quartus 的
quartus_map)成熟度极高,综合后仿真已逐渐被省略。 - 仅在怀疑综合器存在 Bug、或使用第三方综合工具时,才需要主动执行。
2.2.5 Quartus 中的启动方式
- 菜单路径:
Tools→Run Simulation Tool→Gate Level Simulation - Quartus 会自动生成网表文件并拉起 ModelSim 加载。
2.3 时序仿真(后仿真 / 布局布线后仿真)
2.3.1 定义与执行时机
- 定义:时序仿真是指对布局布线后的网表,结合SDF 延迟文件进行的仿真。
- 执行时机:布局布线(Place & Route)完成之后。
- 仿真对象:布局布线后的网表(
.vo或.vho)+ SDF 延迟文件(.sdo)。
2.3.2 延迟信息
- 包含完整的物理延迟信息:
- 门延迟(Cell Delay):逻辑门本身的响应时间。
- 布线延迟(Wire Delay):信号在芯片内部金属线上传输的延迟。
- SDF 文件由布局布线工具(Fitter)生成,包含了芯片内部真实的物理参数。
2.3.3 核心目的
- 验证设计在实际芯片上能否稳定工作在目标时钟频率。
- 重点检查:
- 建立时间(Setup Time):数据在时钟沿到来前必须保持稳定的时间。
- 保持时间(Hold Time):数据在时钟沿到来后必须保持稳定的时间。
- 如果时序违例,需要通过修改代码或增加时序约束来解决。
- 在软件中一般查看Slow 1200mV 85C Model和Fast 1200mV 0C Model来看是否出现建立违规和保持违规
- slack(裕量 >0才合格 ) TNS(负裕量总和 =0 才合格)
- 一般的解决方法就是写sdc文件,下面是参照格式
set_input_delay -max 2.0 -clock clk [get_ports r*]
set_input_delay -min -1.0 -clock clk [get_ports r*]
set_output_delay -max 2.0 -clock clk [get_ports k*]
set_output_delay -min -1.0 -clock clk [get_ports k*]
2.3.4 前置条件
- 必须先完成全编译(Start Compilation),确保 Fitter 步骤已跑完。
- 必须正确分配引脚约束和时钟约束,否则 SDF 文件中的延迟数据无效。
2.3.5 Quartus 中的分析方法
时序仿真的核心是验证设计在实际芯片上能否稳定工作,常用以下三种分析方法:
方法一:ModelSim 波形观察
放大波形,检查时钟边沿与数据变化之间的时间关系。若数据变化紧贴时钟边沿或出现毛刺,说明可能存在时序违例。
方法二:TimeQuest 时序分析器(推荐)
打开
Tools→Timing Analyzer生成时序网表,读取 SDC 约束文件
查看Setup Summary和Hold Summary报告,精确定位违例路径
方法三:前后仿波形对比
对比功能仿真(前仿)与时序仿真(后仿)波形:
前仿边沿陡峭,后仿边沿变缓(含物理延迟)
若后仿出现前仿没有的毛刺或错误跳变,说明存在竞争冒险,需优化逻辑