4. FIFO测试环境搭建:Python环境准备、cocotb库安装、DUT接口定义

好了,咱们正式开始动手。这一章,说白了就是先把“战场”打扫干净。你想想看,写测试激励就像炒菜,锅碗瓢盆都没摆好,菜谱再牛也白搭。

我个人习惯,在开始任何验证项目之前,先把环境搞利索。这能省掉后面90%的“哎呀怎么跑不起来”的烦恼。咱们的目标很明确:让Python能跑,让cocotb能调,让DUT的接口能被咱们“看见”。

4.1 Python环境准备

为什么选Python?因为快。写脚本快,调试快,社区资源也丰富。我见过有人用Perl写测试,那代码维护起来...嗯,不提也罢。

首先,你得有个Python。我建议用3.8以上版本。为什么?cocotb对3.6的支持已经不太好了,而且新语法用着确实香。

我的推荐配置:

  • Python 3.8 或 3.10(稳定,兼容性好)
  • pip 21.0+(包管理工具)
  • virtualenv 或 conda(环境隔离,强烈建议)

检查一下你的Python版本:

python3 --version
pip3 --version

如果版本太低,去官网下载一个。别用系统自带的Python,容易搞乱。我在项目中遇到过,有人直接用系统Python装包,结果把系统工具搞崩了...后来重装了系统。

避坑指南: 我曾经因为没做环境隔离,导致两个项目依赖的cocotb版本冲突。一个要1.7,一个要1.9,折腾了一下午。从那以后,每个项目我都用virtualenv。

创建虚拟环境的命令很简单:

python3 -m venv fifo_env
source fifo_env/bin/activate  # Linux/Mac
# 或者 Windows 下:
# fifo_env\Scripts\activate

看到命令行前面多了个 (fifo_env) 就对了。这时候你装什么包都不会影响系统环境。

4.2 cocotb库安装

cocotb,全称是 Coroutine-based Co-simulation Testbench。说白了,就是用Python的协程来驱动仿真。它不像传统的SystemVerilog UVM那么重,写起来轻快多了。

安装cocotb,一行命令搞定:

pip install cocotb

如果你想用最新的开发版(有时候有bug修复),也可以从GitHub装:

pip install git+https://github.com/cocotb/cocotb.git

装完之后,验证一下:

python -c "import cocotb; print(cocotb.__version__)"

如果打印出版本号,恭喜你,环境搭好了。如果报错...嗯,检查一下是不是在虚拟环境里,或者pip是不是指向了正确的Python。

注意: cocotb依赖一个叫 simulator 的东西。你得有Icarus Verilog (iverilog) 或者 Verilator 或者 Questa。咱们这个课程用iverilog,免费又好用。

安装iverilog:

# Ubuntu/Debian
sudo apt-get install iverilog

# macOS
brew install icarus-verilog

# Windows
# 去官网下载安装包,或者用MSYS2

装完跑一下 iverilog -V,看到版本信息就OK。

4.3 DUT接口定义

终于到核心了。咱们要验证的FIFO长什么样?我画了一张图,你看一眼就明白。

FIFO 深度: 16 宽度: 8 bit wr_en wr_data rd_en rd_data full empty clk rst_n 写接口 读接口 时钟与复位

这个FIFO的接口,我列个表给你看:

信号名 方向 位宽 描述
clk 输入 1 时钟,上升沿触发
rst_n 输入 1 异步复位,低电平有效
wr_en 输入 1 写使能,高电平有效
wr_data 输入 8 写入的数据
rd_en 输入 1 读使能,高电平有效
rd_data 输出 8 读出的数据
full 输出 1 满标志,高电平表示FIFO已满
empty 输出 1 空标志,高电平表示FIFO为空

这个接口定义,说白了就是咱们和DUT沟通的“语言”。你写测试激励,本质上就是通过控制这些信号,让FIFO干活。

举个例子:你想写一个数据进去,就得在时钟上升沿之前,把 wr_en 拉高,把 wr_data 放好。然后等时钟沿一来,数据就进去了。

嗯,这里要注意:复位信号 rst_n 是低电平有效。我见过有人写测试时,把复位拉高当成复位...结果FIFO根本没复位,跑出来的结果全是乱的。

我的经验: 写测试之前,先把接口时序图画一遍。哪怕画在草稿纸上都行。我每次接手一个新DUT,第一件事就是画时序图。画着画着,你就知道该怎么写了。

好了,环境搭好了,接口也清楚了。下一章咱们就开始写第一个测试用例。别急,先把这些基础打牢。


可可精品资料库