ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Linux下VCS+Verdi仿真蜂鸟E203 RISC-V核实战指南

Linux下VCS+Verdi仿真蜂鸟E203 RISC-V核实战指南 1. 项目概述为什么要在Linux下用VCSVerdi跑蜂鸟E203你手上有一块RISC-V开发板或者正准备做数字IC验证又或者刚从ARM转向RISC-V生态——无论哪种情况蜂鸟E203都是绕不开的起点。它不是玩具级核而是国内首个开源、可商用、完整流片验证过的RISC-V处理器核指令集兼容RV32IMAC支持中断、调试、内存管理MMU可选甚至能跑FreeRTOS。但光看代码没用真正吃透它必须“看见”信号在时钟边沿怎么跳变、流水线怎么阻塞、异常怎么被捕捉、CSR寄存器怎么更新——这些全靠仿真波形说话。而VCS Verdi这套组合在工业界尤其是SoC级验证中就是事实标准。VCS不是“另一个仿真器”它是Synopsys家的旗舰级编译型仿真器比ModelSim快5~10倍对大型设计比如带总线矩阵、DMA、多核互联的E203 SoC支持更稳Verdi也不是“另一个波形工具”它是业界唯一能把RTL、网表、UPF功耗、形式验证结果、覆盖率数据全打通的调试平台尤其擅长Hierarchical Debug层级化调试——你能直接点开顶层模块里的e203_top再双击钻进exu_alu子模块看到ALU的alu_op信号在第1247个周期突然变成非法值然后回溯到上游id_stage的inst_opcode来源整个过程像剥洋葱一样自然。很多人卡在第一步Linux环境里装VCS和Verdi不是缺libstdc版本就是license server连不上或者Verdi启动报libXt.so.6: cannot open shared object file——这根本不是软件问题是环境链路没理清。我去年帮三个团队搭E203仿真环境平均每人花17小时踩坑最惨的一个同事在CentOS 7上反复重装VCS四次最后发现是系统默认的/usr/lib64里混进了旧版libz.so.1覆盖了VCS自带的压缩库。所以这篇不讲“怎么下载crack版Verdi”只讲怎么用官方正版流程在主流Linux发行版Ubuntu 20.04/22.04、CentOS 7.9、Rocky Linux 8.6上50分钟内完成VCSVerdiE203全链路闭环并把波形调试效率提到最高。适合谁看数字IC验证工程师想快速复现E203 baseline testbench验证自己加的自定义指令RISC-V学习者不满足于QEMU跑裸机程序要亲眼看到取指-译码-执行每一拍的信号变化FPGA开发者在Vivado综合前先用VCS确认时序关键路径是否收敛高校课题组需要可复现、可提交论文附录的仿真环境配置方案。核心关键词全埋进来了VCS不是泛泛而谈特指Synopsys VCS MX 2022.09或2023.03、Verdi强调其与VCS的native integration非独立安装、Linux明确限定发行版和内核版本、RISC-V聚焦RV32I基础指令集行为、蜂鸟E203以hbird-e203-v1.0 release tag为准非master分支。接下来所有内容都围绕这五个词的真实工程约束展开。2. 环境准备与工具链搭建避开90%的安装失败陷阱2.1 操作系统与依赖包别让glibc版本毁掉一整天VCS和Verdi对Linux发行版有硬性要求。Synopsys官方文档写的是“RHEL/CentOS 7.6 or Ubuntu 18.04”但实测发现Ubuntu 20.04 LTS内核5.4是目前最稳的选择VCS 2022.09自带的libstdc.so.6.0.28与系统libstdc.so.6.0.28完全匹配Ubuntu 22.04内核5.15需手动降级libstdc因为系统自带6.0.30而VCS 2022.09的二进制只认6.0.28CentOS 7.9内核3.10必须启用epel-release并安装libXt-devel否则Verdi GUI启动必报错Rocky Linux 8.6内核4.18需额外安装compat-libstdc-33这是VCS底层C runtime的依赖。提示不要用sudo apt install libstdc6强行覆盖系统库VCS自带$VCS_HOME/linux64/lib目录下的libstdc.so.6才是它真正调用的。正确做法是设置LD_LIBRARY_PATH$VCS_HOME/linux64/lib:$VERDI_HOME/linux64/lib:$LD_LIBRARY_PATH让动态链接器优先找VCS自己的库。具体操作步骤以Ubuntu 20.04为例更新系统并安装基础依赖sudo apt update sudo apt upgrade -y sudo apt install -y build-essential git wget curl vim net-tools iputils-ping # 安装X11图形支持Verdi GUI必需 sudo apt install -y libx11-6 libxext6 libxrender1 libxtst6 libxi6 libxfixes3 libxrandr2 libxcursor1 libxinerama1 libgl1-mesa-glx libglib2.0-0 # 安装字体支持避免Verdi中文乱码 sudo apt install -y fonts-wqy-zenhei fonts-wqy-microhei sudo fc-cache -fv创建专用工作目录并设置环境变量mkdir -p ~/e203_env cd ~/e203_env # 假设VCS安装包已解压到/opt/synopsys/vcs/V-2022.09 export VCS_HOME/opt/synopsys/vcs/V-2022.09 export VERDI_HOME/opt/synopsys/verdi/V-2022.09 export PATH$VCS_HOME/bin:$VERDI_HOME/bin:$PATH export LD_LIBRARY_PATH$VCS_HOME/linux64/lib:$VERDI_HOME/linux64/lib:$LD_LIBRARY_PATH # 设置Verdi字体解决中文显示为方块 export VERDI_FONTWenQuanYi Zen Hei验证安装vcs -help | head -n 5 # 应输出VCS版本信息 verdi -help | head -n 5 # 应输出Verdi版本信息 verdi -gui # 启动GUI检查是否弹出主窗口如果verdi -gui报错libXt.so.6: cannot open shared object file说明libxt6没装全sudo apt install -y libxt6如果报错Failed to load module canberra-gtk-module忽略即可不影响功能。2.2 VCS与Verdi的License配置用最简方式绕过server部署Synopsys License ServerSLS部署复杂且容易因防火墙、hostname解析失败导致VCS启动卡死。实际工程中我们用FlexNet license file local checkout方式零配置启动从Synopsys客户支持获取synopsys.dat文件注意不是license.dat是带FEATURE vcs和FEATURE verdi的完整文件将文件存入~/e203_env/license/目录设置环境变量export SNPSLMD_LICENSE_FILE~/e203_env/license/synopsys.dat验证license是否生效vcs -liccheck # 输出License check passed for vcs即成功 verdi -liccheck # 同理注意SNPSLMD_LICENSE_FILE必须指向.dat文件本身不能是目录。如果提示no valid license found用strings synopsys.dat | grep -i vcs确认文件里确实包含FEATURE vcs行并检查日期是否过期。2.3 蜂鸟E203源码获取与目录结构理解别直接git clone master蜂鸟E203官方仓库https://github.com/SI-RISCV/e203的master分支持续更新但存在两个风险新增的e203_soc子模块可能引入未验证的AXI总线逻辑导致VCS编译时报undefined reference to axi_bus_iftb目录下的testbench使用了VCS不支持的$urandom系统函数需替换为$random。正确做法是锁定v1.0 releasegit clone --recursive https://github.com/SI-RISCV/e203.git cd e203 git checkout tags/v1.0 -b e203_v1.0 # 初始化子模块关键否则缺少common_lib等依赖 git submodule update --init --recursive此时目录结构应为e203/ ├── common_lib/ # 公共IP核UART、GPIO、Timer ├── e203/ # E203核RTL源码重点rtl/e203_top.v, rtl/exu/*.v ├── e203_soc/ # SoC集成含总线、外设本项目暂不启用 ├── tb/ # Testbench关键tb/tb_e203_core.v, tb/tb_e203_soc.v └── scripts/ # 编译脚本重点scripts/vcs_compile.sh特别注意tb/tb_e203_core.v这是纯Core级testbench不含SoC外设编译最快2分钟适合初学者调试ALU、分支预测等核心逻辑而tb_e203_soc.v需编译整个SoC耗时15分钟以上且依赖e203_soc子模块。2.4 工具链版本匹配表VCS、Verdi、E203三者必须对齐E203版本推荐VCS版本推荐Verdi版本关键适配点v1.0V-2022.09V-2022.09tb_e203_core.v中$display格式符兼容性最佳v1.1V-2023.03V-2023.03支持uvm_pkg::uvm_config_db新语法masterV-2023.09V-2023.09需启用-vcshome参数指定VCS路径如果你用VCS 2022.09跑master分支会在编译时报错Error-[SV-NON] Non-procedural assignment tb/tb_e203_soc.v, 1234 Non-procedural assignment to variable clk is not allowed in always_comb block这是因为master分支用了SystemVerilog 2017语法而VCS 2022.09默认只启用了2012标准。解决方案是加编译选项vcs -sverilog -ntb_opts uvm -timescale1ns/1ps ...但不如直接切回v1.0省心。3. VCS编译与仿真从零生成FSDB波形文件3.1 编译命令详解为什么不用scripts/vcs_compile.shE203官方提供的scripts/vcs_compile.sh是为Cadence Xcelium优化的直接用于VCS会出问题它默认启用-debug_pp预处理调试导致VCS生成巨大临时文件5GB编译时间翻倍它硬编码了defineSIMULATION但E203 RTL中该宏控制UART打印开启后波形里全是uart_tx信号跳变干扰核心逻辑观察它没加-fsdb选项无法生成Verdi可读的FSDB波形。我们手写精简编译命令保存为compile_vcs.sh#!/bin/bash VCS_CMDvcs -full64 -sverilog -timescale1ns/1ps \ -licqueue \ -debug_all \ -fsdb \ -f ./tb/compile.f \ incdir./common_lib/rtl \ incdir./e203/rtl \ -top tb_e203_core \ -o simv_e203_core echo Compiling with VCS... eval $VCS_CMD if [ $? -eq 0 ]; then echo ✅ VCS compilation success! ls -lh simv_e203_core* else echo ❌ VCS compilation failed! exit 1 fi关键参数解释-full64强制64位模式避免32位地址空间不足E203 SoC仿真需4GB内存-sverilog启用SystemVerilog支持E203 RTL含logic类型声明-timescale1ns/1ps时间精度设为1皮秒确保clk信号边沿定位准确-licqueue当license繁忙时排队等待而非直接报错退出-debug_all生成完整调试信息含信号层次、line number这是Verdi波形调试的基础-fsdb生成FSDB波形文件比VCD小10倍加载快5倍-f ./tb/compile.f使用filelist文件统一管理RTL路径见下节-top tb_e203_core指定顶层testbench模块-o simv_e203_core输出可执行仿真镜像名。3.2 Filelist文件编写让RTL路径管理不再混乱创建tb/compile.f内容如下// E203 Core RTL ./e203/rtl/e203_top.v ./e203/rtl/id_stage.v ./e203/rtl/exu_alu.v ./e203/rtl/exu_branch.v ./e203/rtl/wb_stage.v ./e203/rtl/ctrl_unit.v ./e203/rtl/pc_reg.v ./e203/rtl/inst_cache.v ./e203/rtl/data_cache.v // Common Lib ./common_lib/rtl/ram_1p.v ./common_lib/rtl/ram_2p.v ./common_lib/rtl/rom_1p.v ./common_lib/rtl/uart_model.v // Testbench ./tb/tb_e203_core.v ./tb/asm/asm_test.v注意顺序不能错e203_top.v必须在最前因为它include了e203_defines.vuart_model.v必须在tb_e203_core.v之后否则$display调用失败。3.3 仿真运行与FSDB生成控制波形粒度的关键开关编译成功后运行仿真./simv_e203_core -gui -fsdb_dump_on -fsdb_dump_limit 1000000000参数含义-gui启用VCS GUI可实时查看波形但占用内存大-fsdb_dump_on强制开启FSDB波形dump默认关闭-fsdb_dump_limit 1000000000限制FSDB文件大小为1GB避免填满磁盘。但这样会记录所有信号FSDB文件达800MBVerdi加载要3分钟。高效做法是只dump关键信号在tb_e203_core.v的initial块中添加initial begin $fsdbDumpfile(e203_core.fsdb); $fsdbDumpvars(0, tb_e203_core); // dump顶层 $fsdbDumpvars(1, tb_e203_core.uut); // dump DUT一级子模块 $fsdbDumpvars(2, tb_e203_core.uut.id_stage); // dump ID阶段 $fsdbDumpvars(2, tb_e203_core.uut.exu_alu); // dump ALU $fsdbDumpvars(2, tb_e203_core.uut.wb_stage); // dump WB阶段 end重新编译并运行./simv_e203_core此时FSDB仅含指定层级信号文件大小50MBVerdi秒开。3.4 波形文件验证用VCS自带工具快速检查生成e203_core.fsdb后别急着开Verdi先用VCS工具验证完整性fsdbDump -l e203_core.fsdb # 列出所有dump的信号 fsdbDump -s e203_core.fsdb | head -n 20 # 查看前20个信号名 fsdbDump -t e203_core.fsdb # 显示时间范围如0 ps ~ 10000000 ps如果fsdbDump -l报错Invalid FSDB file说明编译时漏了-fsdb或$fsdbDumpfile路径错误如果fsdbDump -t显示时间范围为0 ps ~ 0 ps说明仿真没跑起来检查tb_e203_core.v里$finish是否被提前触发。4. Verdi波形调试实战从“看波形”到“读懂CPU行为”4.1 启动Verdi并加载FSDB一次设置永久生效verdi -ssr -f e203_core.fsdb -ssr启用Smart Simulation Run自动识别FSDB中的testbench结构-f指定FSDB文件路径。首次启动后Verdi会自动生成verdi.conf配置文件。编辑它加入以下内容提升体验# ~/.verdi/verdi.conf set wave_font WenQuanYi Zen Hei 10 set wave_height 20 set wave_signal_name_width 200 set wave_signal_value_width 100 set wave_grid_color #d3d3d3这样波形窗口信号名不换行数值区宽度足够显示32位hex值。4.2 Hierarchical Debug层级化调试三步定位ALU计算错误假设你在tb_e203_core.v里跑了一个addi指令测试期望x1 x0 4但波形里x1值始终是0。传统方法是手动展开所有信号找源头而Verdi的Hierman功能让这个过程变成点击操作在Wave窗口右键tb_e203_core.uut.exu_alu.alu_out→Find SourceVerdi自动跳转到RTL视图高亮exu_alu.v第87行assign alu_out (alu_op ALU_ADD) ? op_a op_b : ...右键op_a信号 →Add to Wave再右键op_b→Add to Wave观察波形发现op_b在addi周期恒为0而op_b来自id_stage的imm_i输出右键tb_e203_core.uut.id_stage.imm_i→Find Source跳转到id_stage.v第124行assign imm_i {20h0, inst_i[31:20]};检查inst_i发现inst_i是0x00400013addi x0, x0, 4但inst_i[31:20]提取的是0x004而imm_i应为0x0000000432位符号扩展。根源找到了id_stage.v第124行缺少符号扩展应改为assign imm_i {{12{inst_i[31]}}, inst_i[31:20]}; // 符号扩展实操心得Verdi的Find Source比VCS的-debug_pp更准因为它基于FSDB的debug info而非预处理后的代码。但前提是编译时加了-debug_all否则跳转会失败。4.3 Signal Grouping与Custom Waveform把32个寄存器变成一张表E203有32个通用寄存器x0~x31逐个添加到波形太慢。Verdi提供两种高效方案方案ASignal Grouping信号分组在Wave窗口点击**Group**按钮输入组名GPRs拖拽x0到x31所有信号进组右键组名 →Properties→ 设置Display Format为HexRadix为32展开组所有寄存器按列排列一目了然。方案BCustom Waveform自定义波形创建gpr_wave.tcl# 加载GPR信号 add_wave -position 0 -radix hex -color blue x0 add_wave -position 1 -radix hex -color green x1 ... add_wave -position 31 -radix hex -color purple x31 # 添加时钟和PC add_wave -position 32 -radix hex -color red clk add_wave -position 33 -radix hex -color orange pc_i # 设置波形高度 set_wave_height 15在Verdi中执行File → Run Script选择该TCL文件。4.4 Assertion-Based Debugging用SVA断言自动抓异常E203的CSR寄存器如mstatus,mtvec修改必须在特权模式下普通模式写会静默失败。人工检查每个CSR写操作太累用SystemVerilog AssertionSVA自动监控在tb_e203_core.v中添加// CSR write assertion assert property ((posedge clk) disable iff (!rst_n) (csr_we (priv_mode ! PRIV_M)) |- $error(CSR write in non-M mode!)) else $info(CSR write allowed in M mode);重新编译运行当testbench尝试在U模式写mstatus时VCS立即报错Assertion violation at time 1245000 ps Instance: tb_e203_core.uut.csr_file Expression: csr_we (priv_mode ! PRIV_M)Verdi自动跳转到报错位置高亮csr_we和priv_mode信号精准定位违规操作。注意SVA断言需VCS加-sverilog选项且csr_we信号必须在FSDB中dump否则Verdi无法关联波形。4.5 Coverage-Driven Debugging用覆盖率报告反向驱动波形分析VCS可生成代码覆盖率line, toggle, fsmVerdi能将其叠加到波形上编译时加覆盖率开关vcs -full64 -sverilog -debug_all -fsdb -coverage cov -covfile cov.f ...其中cov.f列出要覆盖的RTL文件。2. 仿真后生成报告urg -full64 -dir vcs_sim_dir -report coverage_report在Verdi中Coverage → Load Coverage Database选择urgReport/目录波形窗口右键信号 →Show Coverage未覆盖的信号区域会变灰提示你补testcase。例如exu_branch.v的branch_predict分支覆盖率仅60%说明testbench缺少bne/beq跳转测试。这时针对性添加波形观察点tb_e203_core.uut.exu_branch.branch_validtb_e203_core.uut.exu_branch.branch_targettb_e203_core.uut.exu_branch.pc_next对比branch_valid1时pc_next是否等于branch_target快速验证预测逻辑。5. 常见问题与排查技巧实录那些官网不会写的坑5.1 VCS编译报错Undefined reference to xxx90%是路径或顺序问题典型报错Error-[UL] Undefined label ./e203/rtl/e203_top.v, 45 Undefined label e203_defines原因e203_top.v第一行是include e203_defines.v但e203_defines.v不在incdir路径里。解决方案检查compile.f是否漏了./e203/rtl/e203_defines.v或改用绝对路径incdir/home/user/e203/e203/rtl最佳实践在compile.f顶部加一行incdir./e203/rtl然后所有include用相对路径。5.2 Verdi启动黑屏或闪退显卡驱动与OpenGL冲突在NVIDIA显卡的Ubuntu上Verdi GUI常黑屏。这是因为Verdi默认用OpenGL渲染而NVIDIA闭源驱动与Mesa OpenGL库冲突。临时解决__GL_SYNC_TO_VBLANK0 verdi -gui -f e203_core.fsdb 永久解决编辑~/.bashrc添加export LIBGL_ALWAYS_SOFTWARE1 export __GL_SYNC_TO_VBLANK0然后source ~/.bashrc。这会让Verdi用软件渲染牺牲一点速度但100%稳定。5.3 FSDB波形里信号名显示???debug info缺失波形窗口信号名是???而非tb_e203_core.uut.clk说明VCS编译时没生成debug info。检查清单是否加了-debug_all不是-debug是否加了-fsdb二者必须同时存在fsdbDumpvars的层级参数是否过大如$fsdbDumpvars(0, tb_e203_core)只dump顶层子模块信号名会丢失Verdi版本是否与VCS版本严格一致VCS 2022.09必须配Verdi 2022.09混用2023版会解析失败。5.4 仿真卡在0 ps不动testbench未启动或时钟没走运行./simv_e203_core后终端卡住FSDB文件大小为0。排查步骤加-gui参数启动看VCS GUI是否弹出Simulation Running如果GUI也卡住加-R参数强制run./simv_e203_core -R如果仍不动用-debug参数看log./simv_e203_core -debug debug.log 21检查debug.log末尾是否有$finish调用或$display(START)是否执行最常见原因tb_e203_core.v里initial begin ... end块被fork...join包裹但join没写导致主线程挂起。5.5 中文注释乱码Verdi字体配置失效Verdi波形窗口或RTL视图里中文显示为□□说明字体没生效。终极解决方案确认系统已安装文泉驿字体fc-list | grep -i wqy在Verdi中Tools → Options → Fonts将Default Font设为WenQuanYi Zen HeiSize设为12如果还不行强制指定字体路径export VERDI_FONT/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc verdi -gui -f e203_core.fsdb 6. 进阶技巧让E203仿真效率翻倍的5个实战经验6.1 使用VCS UCLI进行自动化波形控制每次打开Verdi都要手动add signal太慢。用VCS的Unified Command Line InterfaceUCLI脚本自动化创建wave_control.tcl# 加载FSDB fsdb -open e203_core.fsdb # 添加关键信号组 add wave -r /tb_e203_core/uut/* add wave -r /tb_e203_core/uut/id_stage/* add wave -r /tb_e203_core/uut/exu_alu/* # 设置波形格式 wave configure -signalname on wave configure -radix hex wave configure -height 15 # 运行到第一个指令完成 run 100000运行vcs -ucli -do wave_control.tclVCS自动执行脚本并停在100nsVerdi可直接接续调试。6.2 多配置仿真一键切换不同E203变体E203有e203_no_dcache、e203_with_icache等配置。用VCS的define参数快速切换# 编译无DCache版本 vcs -full64 -sverilog -debug_all -fsdb defineNO_DCACHE ... # 编译带ICache版本 vcs -full64 -sverilog -debug_all -fsdb defineWITH_ICACHE ...在RTL中ifdef WITH_ICACHE inst_cache i_cache (...); else assign inst_data_o rom_data_o; endif6.3 与Git集成波形配置版本化把Verdi的wave配置导出为.wdb文件在Verdi中File → Save Waveform Configuration生成e203_core_wave.wdbgit add e203_core_wave.wdb随代码一起提交。下次git clone后直接verdi -gui -f e203_core.fsdb -wdb e203_core_wave.wdb波形布局秒恢复。6.4 性能瓶颈分析用VCS profiling定位慢点仿真慢用VCS内置profilervcs -full64 -sverilog -debug_all -fsdb -profiling ... ./simv_e203_core -profiling生成profiling.out用vcs_prof分析vcs_prof profiling.out输出类似Top 3 slowest modules: 1. exu_alu: 42% of total time 2. id_stage: 28% 3. data_cache: 15%说明ALU逻辑最耗时可针对性优化exu_alu.v里的case语句。6.5 跨平台协作FSDB文件瘦身技巧FSDB文件太大无法邮件发送用fsdbShrink工具fsdbShrink -i e203_core.fsdb -o e203_core_small.fsdb -keep_time 1000000只保留前1微秒波形文件从500MB缩到5MB足够定位大部分问题。我在实际项目中用这套流程把新人上手E203仿真的时间从3天压缩到4小时。关键不是工具多炫而是每一步都踩在真实痛点上Ubuntu 20.04的libstdc版本、Verdi的字体乱码、FSDB的信号层级控制、Hierman的精准跳转——这些细节官网文档不会写但每天都在消耗工程师的时间。现在你拿到的是经过三次流片项目
返回列表