1. 搭建NVDLA仿真环境
任务说明
本案例目标是在本地搭建NVDLA(NVIDIA Deep Learning Accelerator)的RTL仿真环境,并运行一个最小测试用例验证工具链与依赖库配置正确。完成本案例后,你将拥有一个可执行NVDLA硬件模型仿真的基础环境,为后续定制化设计提供验证平台。
环境依赖与工具链
NVDLA仿真需要以下组件,请确保版本兼容:
- 操作系统:Ubuntu 18.04/20.04(64位)
- 仿真工具:VCS 2017.03+ 或 QuestaSim 10.6+(本案例以VCS为例)
- HDL编译器:Verilog-2001兼容(NVDLA源码使用SystemVerilog)
- Python:3.6+(用于测试向量生成脚本)
- 依赖库:NVDLA硬件源码(从GitHub获取)
获取NVDLA源码
NVDLA硬件代码托管在GitHub,使用以下命令获取完整源码(约2GB,含子模块):
git clone https://github.com/nvdla/hw.git nvdla_hw
cd nvdla_hw
git checkout v1.0.0 # 使用稳定版本
git submodule update --init --recursive
配置仿真环境
NVDLA提供自动化配置脚本,位于hw/tools/bin/目录。执行以下步骤完成环境配置:
# 设置环境变量(建议添加到~/.bashrc)
export NVDLA_HW_ROOT=$(pwd)
export VCS_HOME=/path/to/vcs # 替换为实际VCS安装路径
export PATH=$VCS_HOME/bin:$PATH
# 运行配置脚本生成仿真文件列表
cd $NVDLA_HW_ROOT
make -C tools/bin generate
配置脚本会生成synth目录下的RTL文件列表(filelist.f),该文件是后续仿真编译的输入。若使用QuestaSim,需将VCS_HOME替换为QuestaSim路径,并修改tools/bin/Makefile中的仿真器选项。
最小测试用例:寄存器读写验证
为验证环境正确性,我们使用NVDLA自带的CSB(Configuration Space Bus)寄存器读写测试。该测试不涉及复杂计算,仅验证仿真平台能否正确启动时钟、复位并完成总线事务。
创建测试文件csb_test.sv:
module csb_test;
// 时钟与复位
reg clk;
reg rst_n;
// CSB接口信号(连接到NVDLA的csb从端口)
reg [7:0] csb_addr;
reg [31:0] csb_wdata;
reg csb_write;
reg csb_valid;
wire [31:0] csb_rdata;
wire csb_ready;
// NVDLA顶层实例(仅连接CSB相关端口)
nv_nvdla u_nvdla (
.clk(clk),
.rst_n(rst_n),
.csb_addr(csb_addr),
.csb_wdata(csb_wdata),
.csb_write(csb_write),
.csb_valid(csb_valid),
.csb_rdata(csb_rdata),
.csb_ready(csb_ready)
);
// 时钟生成:10ns周期
initial clk = 0;
always #5 clk = ~clk;
// 测试序列
initial begin
// 复位
rst_n = 0;
csb_valid = 0;
csb_write = 0;
csb_addr = 0;
csb_wdata = 0;
#20;
rst_n = 1;
#20;
// 写寄存器:S_POINTER_0 (地址0x0000) = 0x00000001
@(posedge clk);
csb_valid = 1;
csb_write = 1;
csb_addr = 8'h00;
csb_wdata = 32'h00000001;
@(posedge clk);
wait (csb_ready === 1);
@(posedge clk);
csb_valid = 0;
// 读回验证
@(posedge clk);
csb_valid = 1;
csb_write = 0;
csb_addr = 8'h00;
@(posedge clk);
wait (csb_ready === 1);
@(posedge clk);
csb_valid = 0;
// 检查读回值
if (csb_rdata === 32'h00000001)
$display("TEST PASSED: Register readback matches write data");
else
$display("TEST FAILED: Expected 0x00000001, got 0x%08x", csb_rdata);
#50;
$finish;
end
// 超时保护
initial begin
#10000;
$display("TEST TIMEOUT");
$finish;
end
endmodule
编译与运行
使用VCS编译并运行测试:
cd $NVDLA_HW_ROOT
vcs -sverilog -f synth/filelist.f csb_test.sv -o simv -debug_access+all
./simv
若使用QuestaSim,命令为:
vlog -sv -f synth/filelist.f csb_test.sv
vsim -c csb_test -do "run -all; quit"
验证判定标准
环境配置成功的标志是仿真输出包含以下内容:
- 编译阶段无致命错误(warning可接受)
- 仿真运行至
$finish正常结束 - 控制台打印
TEST PASSED: Register readback matches write data
若出现TEST FAILED或TEST TIMEOUT,请检查:
- 时钟复位时序是否正确(复位至少保持20ns)
- CSB接口信号方向是否与NVDLA端口定义一致
- filelist.f是否包含所有必要的RTL文件(可通过
vcs -f synth/filelist.f -E查看展开列表)
常见问题
- 编译报错“Cannot find nv_nvdla”:确认
synth/filelist.f路径正确,且NVDLA顶层模块名是否为nv_nvdla(部分版本为NV_nvdla,需检查源码) - 仿真卡死无输出:检查时钟是否翻转,复位释放后CSB总线是否处于空闲状态(
csb_valid应保持低电平) - VCS license错误:确认
VCS_HOME环境变量指向正确安装路径,且license服务已启动
本案例仅验证CSB寄存器通路,不涉及NVDLA计算核心。若此测试通过,说明仿真环境已具备运行更复杂NVDLA用例(如卷积运算)的基础条件。