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,请检查:

  1. 时钟复位时序是否正确(复位至少保持20ns)
  2. CSB接口信号方向是否与NVDLA端口定义一致
  3. 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用例(如卷积运算)的基础条件。