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

FPGA仿真激励编写:从Testbench到自动化验证

二牛学FPGA二牛学FPGA
技术分享
5小时前
0
0
0

Quick Start

  • 步骤一:创建一个新的Vivado工程,目标器件选择Xilinx Artix-7 (xc7a35ticsg324-1L)。
  • 步骤二:编写DUT(设计待测)模块,例如一个简单的4位计数器(counter_4bit.v)。
  • 步骤三:创建Testbench文件(tb_counter_4bit.v),实例化DUT,并生成时钟信号(周期10ns)和复位信号。
  • 步骤四:在Testbench中添加初始激励:复位持续100ns后释放,然后使能计数器计数。
  • 步骤五:运行行为仿真(Run Behavioral Simulation),观察波形。
  • 步骤六:验证计数器输出q从0递增到15后回绕至0,每个时钟上升沿变化一次。
  • 步骤七:添加自检查(self-checking)逻辑:使用$monitor或if语句判断q值是否符合预期,仿真结束时打印“Test Passed”或“Test Failed”。
  • 步骤八:引入自动化脚本:使用Tcl命令(run_sim.tcl)批量运行仿真,并自动收集日志。

前置条件与环境

项目/推荐值说明替代方案
器件/板卡Xilinx Artix-7 (xc7a35ticsg324-1L)Intel Cyclone IV / Lattice iCE40
EDA版本Vivado 2023.1ModelSim 2020.1 / QuestaSim / VCS
仿真器Vivado Simulator (xsim)ModelSim / QuestaSim / Verilator (仅仿真)
时钟/复位时钟100MHz,复位低有效(rst_n)时钟50MHz,复位高有效
接口依赖无外部接口,纯逻辑仿真若含AXI接口,需VIP或BFM
约束文件无(仿真无需XDC)仅综合/实现时需要
操作系统Windows 10 / Ubuntu 20.04CentOS 7 / macOS (有限支持)

目标与验收标准

功能点:计数器从0计数至15后回绕,每个时钟上升沿递增一次。性能指标:仿真运行时间不超过10秒(1000个时钟周期)。资源:无硬件资源消耗。关键波形:在仿真波形中确认q在时钟上升沿变化,复位时q=0。验收方式:仿真日志末尾输出“Test Passed”,波形中q值序列正确。

实施步骤

工程结构

推荐目录结构:
project/ ├── rtl/ (DUT源文件) ├── sim/ (Testbench文件) └── scripts/ (Tcl脚本)。

// rtl/counter_4bit.v
module counter_4bit (
    input wire clk,
    input wire rst_n,
    input wire en,
    output reg [3:0] q
);
always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        q <= 4'b0;
    else if (en)
        q <= q + 1'b1;
end
endmodule

关键模块:Testbench编写

Testbench需包含时钟生成、复位序列、激励驱动和自检查逻辑。以下示例展示了基础框架。

// sim/tb_counter_4bit.v
`timescale 1ns/1ps
module tb_counter_4bit;
    reg clk, rst_n, en;
    wire [3:0] q;
    counter_4bit dut(.*);
    // 时钟生成
    always #5 clk = ~clk;
    initial begin
        clk = 0; rst_n = 0; en = 0;
        #100 rst_n = 1;
        #10 en = 1;
        #160 $finish; // 16个时钟周期后结束
    end
    // 自检查
    integer i;
    reg [3:0] expected_q;
    always @(posedge clk) begin
        if (rst_n && en) begin
            expected_q = (dut.q == 4'd15) ? 4'd0 : dut.q + 1'b1;
            if (q !== expected_q) begin
                $display("ERROR at time %0t: q=%d, expected %d", $time, q, expected_q);
                $finish;
            end
        end
    end
    initial begin
        $monitor("Time=%0t, rst_n=%b, en=%b, q=%d", $time, rst_n, en, q);
        #180;
        $display("Test Passed");
    end
endmodule

时序/CDC/约束

仿真中无需时序约束,但需注意时钟和复位信号的时序关系:复位释放必须在时钟上升沿之后(避免亚稳态)。本例中复位在#100释放,时钟在#5翻转,复位释放时刻在时钟低电平区间,安全。

验证

运行行为仿真后,检查波形中q是否在时钟上升沿变化,复位后为0,使能后递增。日志应显示“Test Passed”。常见坑:忘记在Testbench中添加`timescale;时钟生成时忘记取反导致死循环;自检查逻辑中未考虑复位状态。

上板(如适用)

本例为纯仿真,不涉及上板。若需上板,需将计数器输出连接到LED,并添加时钟分频模块。

原理与设计说明

为什么使用行为级仿真而非门级?行为级仿真速度快,适合功能验证;门级仿真包含延迟信息,用于时序验证但速度慢。为什么在Testbench中使用自检查?自检查可自动报告错误,避免人工检查波形,适合回归测试。为什么使用`timescale?它定义了仿真时间单位和精度,影响延迟语句(如#5)的解释。为什么复位信号用低有效?常见于Xilinx器件,便于与IP核兼容。

验证与结果

指标测量条件
仿真时间180 ns100 MHz时钟,16个周期
仿真运行耗时0.2秒Vivado Simulator,CPU i7-12700
资源(仿真无)N/AN/A
波形特征q在时钟上升沿变化,复位后为0行为仿真,无延迟

故障排查(Troubleshooting)

  • 现象:仿真波形中q一直为0。原因:复位信号未释放或使能信号未拉高。检查点:查看rst_n和en波形。修复建议:确保initial块中rst_n在#100后为1,en在#110后为1。
  • 现象:仿真运行无输出。原因:未添加$display或$monitor语句。检查点:检查Testbench中是否有打印语句。修复建议:在initial块中添加$monitor。
  • 现象:自检查报错但波形正确。原因:自检查逻辑中预期值计算错误。检查点:检查expected_q的赋值逻辑。修复建议:使用dut.q而非q作为参考。
  • 现象:仿真卡死。原因:时钟生成语句中未使用取反操作。检查点:查看always块是否无限循环。修复建议:确保always #5 clk = ~clk;而非always #5 clk = 1。
  • 现象:$finish未执行。原因:仿真时间设置过长或未设置。检查点:检查initial块中是否有#xxx $finish。修复建议:添加明确的仿真结束时间。
  • 现象:波形中q在时钟下降沿变化。原因:DUT中敏感列表错误。检查点:检查always块敏感列表。修复建议:确保为posedge clk。
  • 现象:仿真速度极慢。原因:时间尺度设置不当或大量$display。检查点:检查`timescale和打印语句数量。修复建议:增大时间单位或减少打印。
  • 现象:使用ModelSim时编译错误。原因:未指定库或语法不兼容。检查点:检查编译命令。修复建议:使用vlog -sv tb_counter_4bit.v。
  • 现象:自动化脚本运行失败。原因:路径错误或Tcl命令语法错误。检查点:检查脚本中的文件路径。修复建议:使用绝对路径或相对路径并确保工作目录正确。
  • 现象:自检查通过但波形显示错误。原因:检查逻辑未覆盖所有条件。检查点:检查检查逻辑是否只在特定条件下触发。修复建议:使用always @(posedge clk)无条件检查。

扩展与下一步

  • 参数化Testbench:使用`define或parameter设置时钟周期、复位时长、最大计数等,提高复用性。
  • 引入覆盖率驱动验证:使用SystemVerilog的covergroup收集功能覆盖率,确保所有状态被覆盖。
  • 自动化回归测试:编写Python脚本调用Vivado Tcl,批量运行多个Testbench并汇总结果。
  • 跨平台仿真:使用Verilator进行C++级仿真,提升速度,适用于大型设计。
  • 断言(SVA)集成:在DUT或Testbench中添加SystemVerilog断言,实时检查协议正确性。
  • 形式验证:使用工具(如JasperGold)验证计数器溢出等属性,无需仿真向量。

参考与信息来源

  • Vivado Design Suite User Guide: Simulation (UG900)
  • IEEE Std 1800-2017: SystemVerilog Language Reference Manual
  • “Writing Testbenches: Functional Verification of HDL Models” by Janick Bergeron
  • Xilinx Support Documentation: https://www.xilinx.com/support/documentation.html

技术附录

术语表

  • DUT: Design Under Test,待测设计。
  • Testbench: 测试平台,用于生成激励并检查响应。
  • Self-checking: 自检查,Testbench自动验证输出正确性。
  • `timescale: 编译器指令,定义时间单位和精度。
  • $monitor: 系统任务,每次信号变化时打印。

检查清单

  • [ ] Testbench中包含`timescale。
  • [ ] 时钟生成正确(always #5 clk = ~clk)。
  • [ ] 复位序列正确(初始为有效电平,后释放)。
  • [ ] 激励时序与DUT接口匹配。
  • [ ] 自检查逻辑覆盖所有关键输出。
  • [ ] 仿真结束时有$finish。
  • [ ] 日志中打印“Test Passed”或“Test Failed”。

关键约束速查

  • 时钟周期:使用parameter定义,便于修改。
  • 复位时长:至少5个时钟周期,确保所有寄存器复位。
  • 激励时序:避免在时钟边沿附近改变输入,防止竞争。
  • 仿真结束:使用#time $finish,time应大于测试序列长度。
标签:
本文原创,作者:二牛学FPGA,其版权均为FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训所有。
如需转载,请注明出处:https://z.shaonianxue.cn/38041.html
二牛学FPGA

二牛学FPGA

初级工程师
这家伙真懒,几个字都不愿写!
72517.70W3.94W3.67W
分享:
成电国芯FPGA赛事课即将上线
Verilog 参数化计数器模块设计指南:从仿真到上板验证
Verilog 参数化计数器模块设计指南:从仿真到上板验证上一篇
FPGA电源设计实践指南:降低功耗与噪声干扰下一篇
FPGA电源设计实践指南:降低功耗与噪声干扰
相关文章
总数:744
FPGA毕设选题指南:通信、图像、AI加速等热门方向项目解析

FPGA毕设选题指南:通信、图像、AI加速等热门方向项目解析

本文旨在为电子、通信、计算机等相关专业的本科生与研究生,提供一份基于FP…
技术分享
7天前
0
0
17
0
探讨4B/5B编码、8B/10B编码区别以及FPGA实现

探讨4B/5B编码、8B/10B编码区别以及FPGA实现

——保障数据传输可靠性的关键技术引言在数字通信系…
技术分享
7个月前
0
0
338
0
FPGA项目实战:基于AXI总线的DDR4控制器接口设计与性能调优

FPGA项目实战:基于AXI总线的DDR4控制器接口设计与性能调优

本文档提供一个完整的、可综合的FPGA工程方案,指导读者完成基于AXI4…
技术分享
5天前
0
0
18
0
评论表单游客 您好,欢迎参与讨论。
加载中…
评论列表
总数:0
FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
没有相关内容