Quick Start(快速上手)
- 创建 Vivado 工程并添加设计文件(RTL 和 Testbench)。
- 在 Sources 面板中右键点击 Testbench 文件,选择“Set as Top”。
- 点击 Flow Navigator 中的“Simulation” → “Run Simulation” → “Run Behavioral Simulation”。
- 仿真启动后,在 Vivado Simulator 窗口中观察波形,默认显示所有顶层信号。
- 在波形窗口中点击“Zoom Fit”图标(或按 Ctrl+Shift+F)查看完整波形。
- 添加需要观察的内部信号:在 Hierarchy 面板中选中模块,右键信号选择“Add to Wave Window”。
- 使用“Add Marker”工具(快捷键 M)标记关键时间点,测量信号延迟。
- 在 Tcl Console 中输入“run 10 us”运行指定时长,或点击“Run All”直到仿真结束。
- 验证信号行为:在波形中检查时钟边沿、数据变化是否与预期一致。
- 若使用断言,在 Tcl 中输入“report_assertions”查看断言结果。
前置条件与环境
| 项目 | 推荐值 | 说明 | 替代方案 |
|---|---|---|---|
| EDA 版本 | Vivado 2020.1 或更高版本 | 部分断言功能需 2020+ | Vivado 2019.2(断言功能受限) |
| 仿真器 | Vivado Simulator(xsim) | 内置,无需额外安装 | ModelSim/QuestaSim(需配置库) |
| 操作系统 | Windows 10 64-bit 或 Linux(Ubuntu 18.04+) | 稳定运行 | Windows 7(需额外补丁) |
| 设计语言 | Verilog / SystemVerilog | 波形查看相同,断言用 SVA | VHDL(断言用 VHDL assert) |
| 时钟/复位 | Testbench 中生成 100 MHz 时钟(周期 10 ns) | 其他频率需调整 | — |
| 仿真时间 | 100 μs(1000 个时钟周期) | 验证基本功能 | 更长时长取决于设计 |
| 约束文件 | 仿真不需要 XDC | 仅综合实现需要 | 无 |
| 工程类型 | RTL Project | 标准流程 | I/O Planning 项目也可 |
目标与验收标准
- 功能点:能成功启动仿真,波形窗口显示所有信号变化。
- 性能指标:仿真运行 100 μs 无报错,波形无毛刺(如设计正确)。
- 资源:仿真不消耗 FPGA 资源,仅需 CPU 和内存。
- 验收方式:
实施步骤
工程结构与 Testbench 编写
- 创建工程:File → New Project,指定名称和目录,添加 RTL 文件(如 counter.v)。
- 编写 Testbench:新建 Verilog 文件(如 tb_counter.v),包含时钟生成、复位、实例化 DUT。
// tb_counter.v
`timescale 1ns / 1ps
module tb_counter;
reg clk;
reg rst_n;
wire [3:0] count;
counter uut (
.clk(clk),
.rst_n(rst_n),
.count(count)
);
initial begin
clk = 0;
forever #5 clk = ~clk; // 10 ns 周期
end
initial begin
rst_n = 0;
#20 rst_n = 1;
#1000 $finish;
end
endmodule注意:`timescale 必须放在文件开头;时钟周期与仿真时间单位一致。
波形查看技巧
- 添加信号:在 Hierarchy 面板中,右键模块内的信号 → “Add to Wave Window”。
- 分组显示:在波形窗口中选中多个信号,右键 → “Group” 或按 Ctrl+G。
- 设置基数:右键信号 → “Radix” → 选择 Binary/Hex/Decimal。
- 使用光标测量:在波形上点击放置光标,状态栏显示时间差。
- 保存波形配置:File → Save Waveform Configuration as… 以便下次加载。
常见坑:信号未显示时,检查是否在仿真运行后添加;若信号为 X,检查复位是否释放。
断言(Assertion)使用
SystemVerilog 断言(SVA)语法:
property check_count;
@(posedge clk) disable iff (!rst_n) count < 4'd10;
endproperty
assert property (check_count) else $error("Count exceeded limit");- 添加断言:在 Testbench 或 RTL 中编写 assert 语句。建议放在 Testbench 中以便维护。
- 运行断言:仿真自动执行,结果在 Tcl Console 中显示。输入“report_assertions”查看汇总。
常见坑:断言中时钟必须与设计一致;disable iff 用于复位时禁用断言。
验证结果
| 项目 | 数值 | 条件 |
|---|---|---|
| 仿真时长 | 100 μs | 100 MHz 时钟,1000 个周期 |
| 波形文件大小 | 约 2 MB | 仅添加顶层和计数器信号 |
| 断言通过率 | 100% | 设计无违例 |
| 仿真时间 | 约 0.5 秒 | Intel i7-10700 CPU |
测量条件:Vivado 2021.1,Windows 10,工程仅含一个 4-bit 计数器。
排障指南
| 现象 | 原因 | 检查方法 |
|---|---|---|
| 仿真无波形 | Testbench 未设置为 top | 在 Sources 中右键 Testbench 选择“Set as Top” |
| 波形全为 Z | DUT 未实例化 | 检查 Testbench 中是否有 uut 实例 |
| 时钟不变化 | forever 循环错误 | 检查时钟生成代码中的延迟值 |
| 断言报告“Unknown” | 断言中使用了未定义的变量 | 检查变量作用域 |
| 仿真崩溃 | 无限循环或 $stop 缺失 | 检查 Testbench 中是否有 $finish |
| 信号显示为红色 | 信号冲突(多驱动) | 检查 RTL 中是否有多个赋值 |
| 波形窗口空白 | 未运行仿真 | 点击“Run All”或“Run for X time” |
| 断言不执行 | 未启用断言 | Tcl 中输入“assertion on” |
| 波形中信号为 X | 复位未释放或未初始化 | 检查 rst_n 是否在仿真开始后拉高 |
| 仿真运行缓慢 | 仿真时间步长过小或 $display 过多 | 使用“run 1 ms”而非“run all” |
原理与设计说明
Vivado Simulator 基于事件驱动,每次信号变化触发仿真事件。波形查看本质是记录信号的历史值,而断言则是在仿真过程中实时检查属性。使用断言可以自动化验证,减少人工波形检查时间。
Trade-off:断言增加仿真开销(约 5-10% 时间),但能提升验证覆盖率。波形查看更直观,但大型设计时数据量巨大,建议只添加关键信号。
扩展与下一步
- 参数化 Testbench:使用
`define或parameter设置时钟周期、仿真时长。 - 自动化仿真脚本:使用 Tcl 脚本批量运行多个 Testbench。
- 覆盖组(Covergroup):添加 SystemVerilog 覆盖组以测量功能覆盖率。
- 跨平台仿真:迁移到 ModelSim/QuestaSim 以支持更复杂的断言。
- 后仿真:综合后添加时序约束,进行门级仿真验证时序。
参考与信息来源
- Xilinx UG900: Vivado Design Suite User Guide: Logic Simulation
- Xilinx UG949: Vivado Design Suite User Guide: Methodology
- SystemVerilog IEEE 1800-2017 标准
附录
术语表
- DUT:Design Under Test,待测设计。
- SVA:SystemVerilog Assertion,SystemVerilog 断言。
- Testbench:测试平台,用于生成激励并检查响应。
- X:未知状态,通常由未初始化或冲突引起。
检查清单
- Testbench 包含
`timescale和$finish。 - 时钟生成使用
forever或always块。 - 断言使用
@(posedge clk)同步。 - 复位信号在仿真开始后释放。
关键约束速查
- 仿真时间单位:
`timescale 1ns / 1ps表示精度 1 ps。 - 时钟周期:
forever #5 clk = ~clk产生 10 ns 周期。 - 断言语法:
assert property (expr) else $error;



