三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

新手避坑指南:从安装到第一个波形,用NC-Verilog仿真的完整踩坑记录

新手避坑指南:从安装到第一个波形,用NC-Verilog仿真的完整踩坑记录

新手避坑指南:从安装到第一个波形,用NC-Verilog仿真的完整踩坑记录

第一次打开NC-Verilog时,我盯着那个灰蒙蒙的nclaunch界面发呆了十分钟——菜单栏里那些"worklib"、"snapshot"的术语像天书一样,而教程里轻描淡写的一句"运行仿真"背后,隐藏着至少三个可能报错的环节。如果你也是刚接触数字IC验证的新人,这篇记录或许能帮你省去我当初浪费的那三天调试时间。

1. 安装与环境配置:那些教程里没说的细节

大多数教程会告诉你"下载安装包后双击安装",但现实往往更骨感。首先遇到的坑就是版本兼容性问题。去年我在Windows 10上安装最新版时,系统突然弹出"缺少MSVCP140.dll"的错误——这是因为没装Visual C++ Redistributable。解决方法很简单:

# 先安装VC运行库(以2015-2022版本为例) wget https://aka.ms/vs/17/release/vc_redist.x64.exe ./vc_redist.x64.exe /quiet /norestart

环境变量配置是第二个重灾区。官方文档会要求你设置CDS_ROOTPATH,但不会提醒你:

  • 路径中的空格:如果安装目录包含空格(如"C:\Program Files\Cadence"),必须在环境变量里用双引号包裹
  • 权限问题:建议在用户变量和系统变量中都添加一遍,避免某些终端读取不到
  • 版本冲突:已有其他EDA工具时,PATH顺序会影响工具调用

提示:安装完成后,在cmd运行ncverilog -version验证,如果报错"command not found",99%是PATH设置问题。

2. 第一个工程:理解worklib和snapshot

nclaunch的界面设计对新手极不友好。第一次看到"Create New Library"时,我误以为要像VS Code那样先建项目文件夹。实际上:

  1. worklib不是目录:它是NC-Verilog的默认工作库概念,编译后的中间文件都存储在这里
  2. snapshot=仿真配置:每次修改测试激励或参数都应新建snapshot,而不是直接覆盖
  3. 文件映射关系
    • .v源文件 → 存放在任意物理路径
    • worklib→ 工具自动生成在项目目录下
    • snapshot→ 存储在worklib内部

典型错误操作流程:

# 错误示范:重复编译同一文件到不同snapshot ncvlog file1.v -work worklib -snapshot A ncvlog file1.v -work worklib -snapshot B # 会导致引用混乱

正确做法应该是:

# 先编译到worklib,再基于不同配置创建snapshot ncvlog file1.v -work worklib ncelab worklib.moduleA -snapshot cfg1 ncelab worklib.moduleA -snapshot cfg2 -access +rwc

3. 编译报错:从晦涩提示定位真实问题

NC-Verilog的报错信息堪称"谜语大全"。最常见的新手错误包括:

  • 端口不匹配

    ncvlog: *E,BADPAK (testbench.v,10|5): Illegal assignment to package 'P' [12.5.2(IEEE)].

    这通常是因为模块实例化时端口连接顺序错误,建议改用命名关联

    // 避免 moduleA inst1(a, b, c); // 推荐 moduleA inst1(.portX(a), .portY(b), .portZ(c));
  • 文件包含路径

    ncvlog: *E,NOFIL (include.v,1): Unable to find include file 'defines.vh'

    需要添加+incdir+路径参数:

    ncvlog design.v +incdir+../include
  • 时间刻度冲突

    ncelab: *E,TSCALE: Time scales of 'worklib.top(P)' and 'worklib.tb(P)' differ in this hierarchical instance.

    必须在所有文件中统一`timescale:

    `timescale 1ns/1ps // 建议放在每个.v文件开头

4. SimVision波形调试:从懵逼到入门

第一次看到SimVision的波形窗口时,我被这些操作坑过:

  • 信号消失:添加信号后波形窗口空白?试试:

    • CTRL+W刷新波形
    • 检查仿真是否真的运行到该信号所在模块
    • 在ncelab时添加-access +rwc参数
  • 时间轴缩放

    • 鼠标滚轮:水平缩放
    • Shift+滚轮:水平滚动
    • 双击信号名:自动适配时间范围
  • 总线显示

    wire [7:0] data_bus; // 默认显示为十进制

    右键信号 → Radix → 可切换二进制/十六进制

  • 书签功能: 在关键时间点按B键添加标记,后续可通过View -> Bookmarks快速跳转

5. 效率技巧:那些我后来才知道的事

三个月后回头看,这些技巧让效率提升十倍不止:

  • 批处理模式:不用每次都打开GUI

    ncverilog -f filelist.f +access+r +gui

    其中+gui表示仿真后自动打开SimVision

  • TCL自动化

    # 保存当前波形配置 simvision -script save_waves.tcl # 下次直接加载 simvision -input load_waves.tcl
  • 信号过滤

    add wave -r /* # 递归添加所有信号 add wave -regexp "/tb/.*valid" # 正则匹配
  • 调试控制台: 在SimVision中按CTRL+T调出TCL控制台,可直接执行:

    # 强制信号值(用于异常场景测试) force /tb/dut/signal_name 1'b1 # 运行特定时间 run 100ns

第一次成功看到自己设计的信号波形跳动时,那种成就感至今难忘——虽然之前经历了五次编译失败、三次仿真卡死,以及无数次想砸键盘的冲动。现在每次在团队里看到新人对着NC-Verilog抓耳挠腮,我都会把这套"生存指南"发给他们。记住,每个资深工程师都曾在这个工具里栽过跟头,关键是把踩坑变成可控的调试过程。

← 返回列表