验证对象的代码和文档位于:同步 FIFO 的设计规范和代码

准备工作

  1. 创建项目目录结构:
fifo_test/
├── rtl/        # 放置FIFO的RTL代码
└── test_smoke.py  # 测试用例文件
  • 把同步 FIFO 的代码放在该 rtl 下,命名为SyncFIFO.v

1. DUT 类的创建和初始化

  1. 创建同步 FIFO 的 DUT 类

  2. 创建test_reset_dut函数作为的测试用例:把rst_n信号拉低 5 个周期后,再拉高 2 个周期,导出波形信号

  3. 查看波形,关注:在默认的写模式下,rst_n 的拉高是在是在什么时候生效的?

  4. rst_n的写模式修改为立即模式Imme,再重新观察rst_n 的拉高是在是在什么时候生效的?跟默认情况下的波形做一个比对。

  5. 思考:在对模块进行初始化时,仅仅是对rst_n进行赋值就足够了吗?还需要注意什么?

    • 可以阅读以下材料帮助你思考:

    • (4.1 Value set) Verilog HDL 的数值集合包含四种基本值:

      • 0:表示逻辑零或假条件
      • 1:表示逻辑一或真条件
      • x:表示未知逻辑值
      • z:表示高阻态

      (4.2.1 Net declarations) wire 类型的初始值为 z

      (4.2.2 Variable declarations) reg 类型的初始值为 x

      —— 来自IEEE Std 1364-2005, IEEE Standard for Verilog® Hardware Description Language

    • Verilator 本质上是一个二态仿真器,所以对于 xz 值会分配一个具体的常量值,可以是随机数也可以只固定值,具体取决于相关选项的控制。

      —— 来自 Verilator 文档的 Unknown States 部分

2. 编写复位测试

在测试用例test_reset_dut的基础上,测试完成复位后,用assert判断 FIFO 的输出、读写指针是否为 0

3. 编写冒烟测试

冒烟测试是验证流程中的第一道防线,用于快速确认系统的基本功能是否正常工作。

这一术语源自硬件行业:当新硬件首次通电时,如果没有冒烟,则初步通过测试。

在芯片验证中,冒烟测试能够在开发早期发现严重问题,节省大量调试时间。

添加测试用例test_smoke_dut,测试步骤如下所示:

  1. 对 DUT 进行复位

  2. 向 FIFO 分别写入两个数据:

    1. we_i置高,data_i赋值为0x114,保持一个周期,之后判断empty_ofull_o是否为 0

    2. we_i置高,data_i赋值为0x514,保持一个周期

  3. 从 FIFO 读出两个数据:

    1. we_i置低、re_i置高,保持一个周期,之后读取data_o,判断结果是否为0x114

    2. we_i置低、re_i置高,保持一个周期,之后读取data_o,判断结果是否为0x514empty_o是否为 1

然后运行测试用例,验证 DUT 能否通过测试。