RISC-V Verilog仿真:Makefile与VCS编译调试实战指南

发布时间:2026/10/28 23:33:11

RISC-V Verilog仿真:Makefile与VCS编译调试实战指南 简介这份资源面向计算机体系结构学习者、FPGA/IC验证初学者以及嵌入式开发人员提供一套完整的RISC-V处理器开发与仿真环境帮助读者从汇编程序、硬件描述到仿真验证全流程理解开源指令集架构的落地方式。压缩包共22个文件约159KB以Verilog源码8个.v文件涵盖ALU、寄存器堆、指令译码、CPU核心等模块为主体辅以汇编程序、十六进制内存数据、C语言转换工具、ROM初始化文件及处理器逻辑图与说明文档结构紧凑、模块划分清晰。目前已有798人学习下载。读者可借助其中的Makefile构建流程、VCS仿真脚本与测试数据动手完成处理器核心的编译、仿真与功能验证并对照文档理解RISC-V的模块化设计思路适合作为课程设计、自学实践或项目原型的参考素材。1. 从一份 RISC-V 源码和它的 Makefile 说起为什么 VCS 仿真跑不起来你拿到一份 RISC-V 核的 Verilog 源码目录里躺着rtl/、tb/、Makefile满心欢喜敲下make结果终端甩回来一句make: *** No targets specified and no makefile found. Stop.或者更气人的是文件明明在却报vcs: command not found。这不是你环境差而是 RISC-V 源码 Makefile VCS 这套组合本身就横跨了三个知识域RTL 源码怎么组织、Makefile 怎么驱动编译、VCS 怎么把 Verilog 编成可仿真可波形的产物。热搜里天天有人问「make没有指明目标并且找不到makefile」「vcs安装」「vcs与verdi联合仿真」本质都是这条链路上某一环断了。这篇笔记就按一线做法把一份 RISC-V Verilog 源码从目录结构、Makefile 编写、VCS 编译到波形调试整条路径拆开新手能照着复现熟手能对照参数和踩坑边界。适合正在做 RISC-V 核验证、数字 IC 前端仿真、或者刚接手一份别人写的 Verilog 工程却不知道怎么跑起来的工程师。2. RISC-V 源码目录与 Makefile 的职责边界谁编译谁谁管依赖2.1 一份典型 RISC-V Verilog 工程的目录长什么样先别急着写 Makefile得先看清源码是怎么摆的。RISC-V 核的 Verilog 工程常见做法是按功能分层而不是把所有.v堆在一个文件夹里。我一般见到的结构是这样riscv_core/ ├── rtl/ │ ├── core/ # 取指、译码、执行、访存、写回 │ ├── bus/ # 总线互联、仲裁 │ ├── periph/ # UART、SPI、GPIO 等外设 │ └── pkg/ # 参数、宏定义、类型定义 ├── tb/ │ ├── tb_top.v # 仿真顶层 │ └── tests/ # 测试激励、hex 程序 ├── sim/ │ └── filelist.f # 文件列表 ├── Makefile └── README.md这个结构不是强制的但分层的好处是 Makefile 可以用通配符或 filelist 批量收集源文件而不是一行行手写。RISC-V 核里经常有include defines.v这种头文件依赖如果目录乱了VCS 找不到 include 路径报的就是Cannot find include file跟 Makefile 本身没关系是路径没配对。2.2 Makefile 在仿真流程里到底管什么很多人把 Makefile 当成「编译脚本」其实在 Verilog 仿真里它管三件事收集源文件、调用 VCS 编译、启动仿真并管理波形。它不负责综合不负责时序约束那些是后端的事。热搜里「cmake和makefile区别」问得多放到这里说清楚CMake 是跨平台构建系统生成器适合 C/C 大工程Verilog 仿真这套Makefile 足够因为 VCS 本身就是命令行工具Makefile 只是把命令和依赖串起来没必要上 CMake 增加复杂度。一个最小可用的 Makefile 骨架长这样# 工具与选项 VCS vcs SIMV ./simv FILELIST ./sim/filelist.f INCDIR incdir./rtl/pkg # 编译选项 VCS_OPTS -full64 -sverilog -debug_accessall -timescale1ns/1ps # 默认目标 all: compile run # 编译 compile: $(VCS) $(VCS_OPTS) $(INCDIR) -f $(FILELIST) -o $(SIMV) # 运行仿真 run: $(SIMV) ntb_random_seed1 # 清理 clean: rm -rf simv csrc *.vpd *.fsdb ucli.key这段逻辑说明-full64生成 64 位可执行文件-sverilog支持 SystemVerilog 语法RISC-V 测试平台常用-debug_accessall打开调试访问权限后面联合 Verdi 看波形必须加。incdir指定 include 搜索路径-f读文件列表。参数怎么改如果源码是纯 Verilog-2001去掉-sverilog如果要做覆盖率加-cm linecondfsmtgl。run目标里的ntb_random_seed是控制随机种子的复现问题时要固定它。2.3 filelist 怎么写才不会漏文件filelist 是 VCS 编译的输入清单写法有讲究。常见做法是每行一个相对路径支持incdir和-v库文件incdir../rtl/pkg ../rtl/pkg/riscv_defines.v ../rtl/core/if_stage.v ../rtl/core/id_stage.v ../rtl/core/ex_stage.v ../rtl/core/mem_stage.v ../rtl/core/wb_stage.v ../rtl/bus/axi_interconnect.v ../tb/tb_top.v注意顺序被例化的模块要放在例化它的模块之前或者 VCS 能自动解析层次但 include 文件必须靠incdir找到。如果报module not found先查 filelist 里有没有漏再查路径对不对。我一般会在 Makefile 里加一个check目标用grep统计 filelist 行数和实际.v文件数对比防止手滑漏加。3. 用 VCS 把 RISC-V 源码编起来从命令到波形的最小闭环3.1 VCS 编译命令的每个参数都要知道为什么加上一章的 Makefile 只是骨架真正跑起来要理解 VCS 的编译流程。VCS 把 Verilog 编译成simv可执行文件分两步分析analysis和展开elaboration。常用命令vcs -full64 -sverilog -debug_accessall \ -timescale1ns/1ps \ incdir./rtl/pkg \ -f ./sim/filelist.f \ -l compile.log \ -o ./simv逐项说明-full64在 64 位机器上必须加否则可能链接 32 位库失败-sverilog允许.sv和 SystemVerilog 语法-debug_accessall是给 Verdi 联合仿真用的不加的话波形里看不到信号层次-timescale统一时间单位RISC-V 核里不同模块可能各自定义 timescale统一指定避免冲突-l compile.log把编译日志写文件报错时翻日志比翻终端快-o指定输出名。如果编译报Error-[MFNF] Module not found九成是 filelist 漏文件或 include 路径不对。3.2 跑通第一个 RISC-V 测试从复位到第一条指令编译通过后./simv启动仿真。RISC-V 核的测试平台通常会给一个 hex 程序加载到指令存储器然后释放复位。最小测试流程./simv ntb_random_seed1 TEST_HEX./tb/tests/add.hex -l run.logTEST_HEX是测试平台自定义的 plusarg用$value$plusargs读取。仿真开始后看run.log里有没有UVM_INFO或自定义的$display输出。如果核没动先查复位信号是不是一直有效再查时钟有没有翻转。我一般会在 tb 里加一句initial begin $dumpfile(wave.vpd); $dumpvars; end生成 VPD 波形用 DVE 或 Verdi 打开看。3.3 生成 FSDB 波形并联合 Verdi 调试VPD 是 VCS 自带格式FSDB 是 Verdi 的格式信号多的时候 FSDB 更小更快。生成 FSDB 要在 tb 里加initial begin $fsdbDumpfile(wave.fsdb); $fsdbDumpvars(0, tb_top); end编译时要加-P ${VERDI_HOME}/share/PLI/VCS/LINUX64/novas.tab ${VERDI_HOME}/share/PLI/VCS/LINUX64/pli.a或者用-kdb生成 KDB 库供 Verdi 直接读。联合仿真命令verdi -ssf wave.fsdb -nologo 热搜里「vcs与verdi联合仿真」问的就是这一步。注意$fsdbDumpvars的第一个参数是层次深度0 表示全部信号多的时候会拖慢仿真建议只 dump 关心的层次。4. 避坑与排查RISC-V Makefile VCS 最常见的 5 个翻车现场4.1 现象make 报「No targets specified and no makefile found」原因当前目录没有 Makefile或者文件名不是Makefile/makefile/GNUmakefile。有时候从 Windows 拷过来文件名变成Makefile.txtLinux 下不认。解决ls -la确认文件名用make -f 实际文件名指定或者重命名。如果 Makefile 在子目录cd过去再 make或者make -C 子目录。4.2 现象VCS 报「Cannot find include file defines.v」原因incdir路径写错或者 filelist 里 include 的文件路径是相对路径但 VCS 的工作目录和你想的不一样。解决在 Makefile 里用绝对路径或$(PWD)拼相对路径incdir$(PWD)/rtl/pkg。另外检查defines.v是不是真的在那个目录别笑我见过有人把defines.v放在rtl/根目录却写incdirrtl/pkg。4.3 现象编译通过但仿真一跑就「$finish at time 0」原因测试平台在 time 0 就调用了$finish通常是复位逻辑写错或者initial块里条件判断反了。解决在 tb 里加$display打印复位释放时间检查reset_n是不是一直为 0。RISC-V 核常见做法是复位持续几个周期后释放如果计数器写错永远不释放。4.4 现象波形里信号全是 X 或 Z原因RISC-V 核里存储器初始化没做或者寄存器复位值没给。Verilog 里 reg 默认是 X仿真开始前必须复位。解决检查复位逻辑覆盖了所有寄存器存储器用$readmemh加载 hex 文件。如果 hex 文件路径不对$readmemh会报 warning 但不停止存储器保持 X。4.5 现象Verdi 打开 FSDB 看不到信号层次原因编译时没加-debug_accessall或者$fsdbDumpvars的层次参数写错。解决重新编译加-debug_accessall$fsdbDumpvars(0, tb_top)里的tb_top要和实际顶层模块名一致。如果还是不行检查VERDI_HOME环境变量有没有设PLI 库路径对不对。5. 进阶技巧用 Makefile 参数化测试与回归让 RISC-V 验证可复现5.1 用变量把测试名、种子、波形格式抽出来写死命令的 Makefile 只能跑一次参数化才能做回归。我一般这样改TEST ? add SEED ? 1 DUMP ? fsdb SIMV ./simv run: $(SIMV) ntb_random_seed$(SEED) TEST_HEX./tb/tests/$(TEST).hex \ DUMP_FORMAT$(DUMP) -l run_$(TEST)_$(SEED).log regress: for t in add sub and or; do \ for s in 1 2 3; do \ $(MAKE) run TEST$$t SEED$$s; \ done; \ done?表示如果命令行没给就用默认值make run TESTsub SEED5就能换测试换种子。regress目标用 shell 循环跑多组日志按测试名和种子分开出问题能定位到具体哪一组。参数说明DUMP_FORMAT是 tb 里自定义的 plusarg控制 dump VPD 还是 FSDB仿真慢的时候可以关掉波形。5.2 用 filelist 自动生成减少手写错误手写 filelist 容易漏可以用 find 自动生成find ./rtl -name *.v -o -name *.sv | sort ./sim/filelist.f echo incdir./rtl/pkg | cat - ./sim/filelist.f tmp mv tmp ./sim/filelist.f注意sort之后顺序可能不满足例化依赖VCS 一般能自动解析模块层次但 include 文件必须靠incdir。如果报模块找不到再手动调整顺序。这个技巧在 RISC-V 核源码文件多的时候特别省事但每次加文件要重新生成。5.3 验证方法怎么确认仿真真的跑对了跑完仿真不能只看「没报错」要确认核真的执行了指令。我一般看三个地方一是run.log里有没有$display打印的 PC 值在递增二是波形里指令存储器的读使能和读地址在动三是测试平台里的结果寄存器比如tohost有没有写预期值。RISC-V 测试常用tohost地址写 1 表示通过写其他值表示失败。如果tohost一直是 0说明程序没跑完或者卡在某个循环。5.4 一个我踩过的坑Makefile 的 tab 和空格Makefile 里命令行必须以 tab 开头不能用空格。从网页复制代码经常把 tab 变成空格报missing separator。我现在的习惯是在编辑器里把 tab 显示出来或者用.RECIPEPREFIX改前缀。这个坑不致命但很烦尤其是赶项目的时候。5.5 最后一句实在话这套 RISC-V 源码 Makefile VCS 的流程我前后搭过不下十次每次都会在 include 路径、filelist 顺序、波形 dump 上翻车。后来我养成了一个习惯新工程先写一个最小 tb只例化一个模块跑通编译和波形再逐步加源码。这样出问题能快速定位是环境、Makefile 还是 RTL 本身。希望帮到你。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/10/28 23:33:11

C#中YOLO推理的预处理与后处理实践指南

1. 项目概述:C#与YOLO推理中的预处理/后处理陷阱在计算机视觉领域,YOLO系列算法因其出色的实时检测性能而广受欢迎。作为一名长期使用C#进行工业视觉开发的工程师,我发现90%的YOLO推理结果异常问题都源于同一个环节——预处理(Pre…

2026/10/28 23:33:11

智能体开发必读:从成本到生态,算清AI Agent六笔账

这几天技术圈里最热闹的物种,非智能体(AI Agent)莫属。招聘平台上挂着“智能体工程师”的岗位,技术群里飘着Coze和Dify的截图,就连做财务的朋友都在问“AI智能体能不能帮我生成现金流报表”。大家嘴上都在聊智能体&…

2026/10/28 23:33:11

千笔与万方智搜AI:学术写作工具深度评测与实战技巧

1. 学术写作工具对决:千笔与万方智搜AI深度评测作为一名在学术圈摸爬滚打多年的研究者,我深知论文写作的痛苦。从开题报告到最终定稿,每个环节都可能遭遇导师的"重写"暴击。最近两款国产学术AI工具——千笔专业学术智能体和万方智搜…

2026/10/29 0:43:45

绿豆7.0木白动态域名版JAVA影视源码部署指南

简介:这是一套面向影视类APP开发者的高功能完整性源码,专为快速构建iOS端原生JAVA影视应用而设计,适用于具备Android Studio开发经验的中高级开发者,解决从零搭建支持广告变现、多终端播放与用户运营体系的影视平台难题。资源共20…

2026/10/29 0:43:44

信号与系统入门:从信号分类到线性时不变系统核心概念解析

简介:这份《信号与系统》第一章课件面向电子类专业学生及备考复习者,聚焦课程开篇的基本概念与分析方法,帮助读者建立信号分类、运算与系统描述的入门框架。压缩包内共1个PPT文件,约1.29MB,以电子教案形式呈现&#xf…

2026/10/29 0:43:44

医院挂号小程序毕业设计:SSM+MySQL与微信小程序全栈实践

简介:微信小程序与SSM后台结合的医院挂号系统毕业设计资源,面向计算机及相关专业毕业生、需要快速搭建完整项目的开发者。项目覆盖患者、医生、科室、专家、预约与取消预约申请等核心模块,后台基于SSM框架,数据库采用MySQL&#x…

2026/10/29 0:38:44

系统接口设计对接方案:协议选型、规范设计与安全验收

简介:围绕系统与外部系统之间如何对接这一工程难题,这份系统接口设计对接方案面向系统架构师、后端开发与集成实施人员,梳理从对接方式选型到接口规范落地的完整思路。内容以SOA体系架构与服务总线为主线,依次说明服务目录标准&am…

2026/10/28 14:42:12

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/28 15:28:56

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/28 3:32:29

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/29 0:03:42

学生选课系统DFD图绘制指南:边界划分与分层校验实战

简介:文档以顶层与第一层DFD图为核心,完整刻画学生选课系统的逻辑模型,面向软件工程课程设计、系统分析学习及毕设前期建模人群。顶层图界定系统边界,外部实体包括管理员、教师和学生三类角色;第一层图进一步细化用户登…

2026/10/29 0:03:42

JIRA敏捷落地:Scrum角色权限、Sprint与燃尽图避坑指南

简介:围绕“基于JIRA的敏捷开发项目管理”这一主题,面向产品负责人、Scrum Master及研发测试成员,梳理Scrum角色分工、迭代流程与JIRA工具配置的对应关系,适合初、中级团队导入敏捷管理时参考。压缩包共1个docx文件,大…

2026/10/29 0:03:42

SEMI S8人机工程验收实战:从条款拆解到现场实测的完整指南

简介:面向半导体设备设计、制造与运维工程师及安全合规人员,这份资料聚焦SEMI标准体系下的设备安全规范,重点收录SEMI S8-0308《半导体制造设备人体工程学工程安全指南》。内容围绕设备设计原则、错误与事故预防、人体工程学适配三大主线展开…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑