
做FPGA的人日常工作里最烦的往往不是写代码本身而是频繁在几个重型工具之间来回切换。写Verilog用Quartus自带的编辑器画框图要打开Visio或亿图看仿真波形又得启动GTKWave写文档再切回Word或在线笔记等这一圈窗口全铺开一上午基本就交代了。我这两年把一部分工作固定在了VSCode里用Draw.io画架构图和时序图用Waveform Render直接查看仿真波形配合开源仿真工具基本能在编辑器里完成“设计—画图—仿真—看波形—写文档”的完整闭环。这篇文章就把这套组合的完整玩法拆开讲清楚包括安装配置、实操步骤、踩坑记录适合刚入门FPGA的开发者也适合想把自己工作流再精简一点的工程师。1. 为什么我建议把FPGA设计搬到VSCode里1.1 传统FPGA工作流的痛点在哪里FPGA开发绕不开Quartus、Vivado这类厂商IDE但说实话它们的核心竞争力是综合、布局布线、时序分析、引脚分配这些EDA能力编辑器部分做得只能说“能用”。语法高亮勉强代码补全看心情更不要提在IDE里画一张像样的模块连接图有多别扭。很多同事的项目文档里框图是拿画图板随便画的有几个版本已经对不上代码了。另一个痛点是波形查看。GTKWave本身并不差但界面风格停留在上世纪打开大一点儿的VCD文件要等很久想在波形图上标注、导出到文档里也不顺手。更麻烦的是你正在VSCode里改代码一抬头得切到另一个窗口去对波形来回切几次思路就断了。文档和代码的割裂更让人头疼。写完模块要补架构说明画时序图要么用Visio的笨重模板要么用在线工具画完截图粘贴。这些图一旦脱离代码仓库基本就失去了维护价值代码改了图还在原地。整个流程下来真正花在“思考电路”上的时间反而被这些工具摩擦消耗掉不少。1.2 为什么选中Draw.io和Waveform Render这对组合选工具我一直坚持一个原则能用文本表示的就不要用二进制格式。Draw.io保存的.drawio文件本质是XML用文本编辑器能打开能进Git做版本管理能参与代码评审时的diff。这对FPGA项目非常友好因为框图和代码一样需要维护、需要追溯历史版本。更重要的是Draw.io Integration插件把完整的画图编辑器嵌进了VSCode窗口。你新建一个.drawio文件VSCode直接变成画布不需要离开当前窗口就能画模块框图、状态机、时序示意。保存后就是一个XML文件和代码一起提交仓库里永远有一份和代码同步的架构图。Waveform Render插件解决的是波形查看的痛点。它让VSCode直接打开VCD、FST这类仿真波形文件不需要启动独立程序不用切窗口。它基于文本波形描述的思路尤其是对CSV格式的支持让我可以手动构造一些简单的测试波形甚至写脚本批量生成全部在编辑器里完成。这种“代码、波形、文档同窗口”的体验用过之后就回不去了。1.3 这套方案的边界在哪里先说清楚这套组合不是要替代Quartus或Vivado它们该干的综合布线、时序收敛、比特流生成VSCode一概干不了。我用VSCode做的是EDA工具之外的那些事设计前的架构图、模块接口定义、仿真后的波形分析、文档维护。它是整个开发流程里的“轻量工作台”负责让思路更快地变成图和波形让调试时的信息获取不再中断。尤其是做一些小规模IP验证、图像处理算法预研、接口协议调试这类工作代码量不大但迭代频繁每次打开厂商IDE等加载都要几分钟VSCode这套方案几乎是零等待。如果你也在做FPGA图像处理比如ISP去马赛克、MIPI采集、接口控制QSPI Flash读写、温控风扇PWM控制这套轻量流程大概率能帮你省下不少时间。2. 环境准备VSCode、Draw.io、Waveform Render的安装配置2.1 VSCode本体安装与基础设置如果你还没装VSCode去官网下载对应系统的安装包就行Windows下基本一路Next。装完第一件事我建议先换成中文界面不是必须但能降低初次上手的心理门槛。打开扩展商店搜索“Chinese (Simplified)”安装后按CtrlShiftP输入Configure Display Language选中文重启就生效。对FPGA开发来说有几个基础设置值得提前改掉。一是自动保存文件菜单里勾选Auto Save或者按CtrlShiftP搜“Auto Save”防止画图画到一半或改代码时忘记保存。二是开启缩略图Minimap在View菜单里打开长代码文件和大框图里定位会方便不少。还有一点容易被忽略把VSCode的搜索范围设置好。FPGA工程里综合生成的文件、IP核中间文件非常多动不动几千个文件全局搜索性能会被这些文件夹拖垮。建议在设置里搜“files.exclude”把build、output、ipcore这些目录加进去搜索时它们就会被自动忽略。2.2 安装Draw.io Integration扩展扩展商店里搜索“Draw.io Integration”认准作者hediet的那个安装量通常是最高的。装完后不需要任何额外配置直接新建一个以.drawio结尾的文件VSCode会自动弹出画图界面。如果你习惯命令行操作也可以直接运行code --install-extension hediet.vscode-drawio这个插件支持两种文件命名方式。一种是纯XML格式的demo.drawio体积小适合放在项目docs目录里。另一种是demo.drawio.svg它把XML模型内嵌到SVG文件里外部看是一张正常的矢量图任何浏览器、图片查看器、甚至GitHub网页端都能直接预览双击或右键又能在VSCode中重新编辑。这种“两种打开方式”的特性在做跨团队协作时非常实用——不懂FPGA的同事也能直接在GitHub网页上看懂你的框图而不需要装任何工具。插件安装后还有一个隐藏功能就是可以导出透明背景的PNG或SVG文件方便贴到文档、PPT里。在打开的.drawio文件里按CtrlShiftP输入Draw.io能看到Export相关的命令列表。2.3 安装Waveform Render扩展在扩展商店里搜索“Waveform Render”名字就叫这个安装量不算特别大但功能非常对口。它的核心能力是直接把VCD、FST、CSV和WaveJSON格式的波形文件渲染成可视化波形全程在VSCode内部完成不需要启动外部程序。安装后打开一个.vcd文件你会看到波形直接渲染在编辑器标签页里左侧是按层次结构排列的信号列表右侧是波形显示区。和GTKWave那种需要额外打开文件再手动添加信号的方式相比这个过程几乎是无感的。更让我惊讶的是它对CSV格式的支持。它支持一个非常简单的CSV约定大概形式如下Time, Signal, Value 0, clk, 0 5, clk, 1 10, clk, 0保存文件后波形视图会自动刷新。这意味着你可以用Python脚本甚至Excel直接生成测试波形对做协议分析或者造测试数据来说太方便了。Waveform Render不需要任何Python依赖或服务端组件装完即用这一点比有些同类插件省心得多。3. Draw.io实操系统框图、时序图和团队协作的正确打开方式3.1 用Draw.io画系统架构图与模块连接图新建一个top.drawio文件VSCode会打开Draw.io画布。第一次打开的同学可能会被左侧的形状库吓到但FPGA框图其实用不到多少花哨形状矩形模块、方括号端口、箭头连线、文字标注就这四样够了。模块连接图我习惯采用“左进右出”的规范。左侧放Avalon或AXI等总线输入、复位、时钟右侧放中断输出、用户逻辑接口、外部存储器接口。每个模块用一个矩形内部写上模块名端口直接在矩形边界上用文字标注。选中一个矩形后按CtrlD可以快速复制出同样样式的模块再用连线把它们连接起来。连线端点会自动吸附到矩形边界上拖动时能看到绿色吸附提示这是Draw.io做得比很多专业画图软件顺手的地方。画数据通路时我强烈建议把位宽和数据类型直接标注在连线上。比如定点数标注Q8.8还是Q1.15位宽是16bit还是32bit画在线上。这样后续写RTL代码时回头看图就能确定所有接口的信号定义不用再去翻代码找端口声明。图像处理项目里经常会有RGB565、YUV422这类数据流把每个阶段的格式标注清楚比自己对着代码猜靠谱太多。画完按CtrlS文件就是XML格式。这个文件可以提交到Git里团队其他人拉下来后用VSCode打开就是一张完整的可编辑框图。我再也不用发一份“请查看最新架构图v12_final2.png”这种邮件了。3.2 用Draw.io画时序图和状态机示意图模块连接图画的是“空间关系”时序图画的则是“时间关系”两者对FPGA开发同样重要。Draw.io左侧形状库里有个专门的“Timing Diagram”分类里面有时钟、高电平、低电平、上升沿、下降沿等常用形状。举个例子复位信号的设计在FPGA里经常被讨论异步复位、同步释放是基本做法但释放时刻如果离时钟上升沿太近就可能出现亚稳态。用Draw.io画一张“异步复位同步释放时序图”把rst_n释放的位置和clk上升沿的关系标注清楚这张图放到设计文档里比写一千字都直观。我做温控风扇项目时就画过类似的图PWM占空比更新时机、滤波窗口、ADC采样点全画在一个时间轴上后续调试时看一眼就知道哪里出问题了。状态机转移图也是FPGA设计文档的常客。Draw.io左侧形状库里有现成的“State Diagram”形状圆形表示状态箭头表示转移条件。画完之后配合文档里的状态编码表代码里case语句怎么写、哪些状态是非法状态需要进行安全处理都一目了然。这里有个小技巧把状态机的复位状态用不同颜色标出来把中断、异常跳转用虚线标注阅读体验会好很多。3.3 版本控制与团队协作里的隐藏福利前面提到.drawio.svg文件格式在团队协作里特别好用。因为GitHub网页端默认能渲染SVG文件所以只要仓库里保留了.drawio.svg同事在网页上就能直接看到最新版架构图连下载都不用。这对那些“看图只需要一眼不想装环境”的项目经理、硬件同事来说非常友好。关于合并冲突得说实话两个同事同时改同一个.drawio文件提交后大概率会有冲突因为底层是XMLGit不会自动合并得很干净。我的经验是两个办法。一是约定提交粒度框图文件和代码一起提交改图的频次本来就低冲突概率可控。二是真正需要频繁并行编辑时把不同模块拆成不同的.drawio文件比如top.drawio只画顶层连接ddr_ctrl.drawio画DDR控制器内部image_pipeline.drawio画图像流水线。拆开之后冲突基本就消失了。导出图片也是一个高频需求。在.drawio文件中按CtrlShiftP搜Draw.io可以看到Export As PNG、Export As SVG等命令。导出的SVG可以无损缩放贴到文档里没有清晰度问题PNG适合放PPT和微信群里快速讨论。导出时有个选项可以设置边框间距建议保持默认导出的图四周留白会更干净。4. Waveform Render实操用VCD文件在编辑器里看仿真波形4.1 波形文件从哪里来很多刚接触这套流程的人会问我没有用ModelSim或Questasim波形文件怎么生成答案是用开源仿真工具Icarus Verilog命令行编译、运行、生成VCD全部免费且超级轻量。安装方式很简单Windows用户可以下载安装包Ubuntu用户直接sudo apt install iverilog在Testbench里加两行代码就能生成VCD文件initial begin $dumpfile(tb_top.vcd); $dumpvars(0, tb_top); end然后命令行编译运行iverilog -o tb_top.vvp tb_top.v top_module.v vvp tb_top.vvp运行结束后就会生成tb_top.vcd文件。这里有一个细节$dumpvars的第一个参数0表示导出整个测试模块下的所有信号如果工程很大VCD文件会迅速膨胀到几百MB甚至上GB。这时候就要用层次化限定只导出你想关注的信号比如写成$dumpvars(0, tb_top.u_ddr_ctrl);只导出DDR控制器这个子模块的信号文件大小能缩小一个量级。这个技巧在做大工程调试时能救命。如果你用的是ModelSim或Questa也可以用vcd2wavedb之类的方式转换或者直接在仿真脚本里加一句vcd file生成VCD。核心思想是一样的VCD文件本身就是文本格式记录的是信号随时间变化的转储谁生成它不重要重要的是能用工具打开看。4.2 VSCode里打开VCD看波形VCD文件生成后直接在VSCode里打开它。这时候Waveform Render插件就会接管自动把文本转成可视化波形。左侧是分层次的信号树可以展开看到模块内部的各个信号右侧是波形显示区支持滚轮缩放、拖拽平移和GTKWave的操作习惯基本一致。我最常用的场景是改完代码跑一遍仿真然后在VSCode里打开VCD对着代码按CtrlTab快速切换一边看代码逻辑一边看波形是否符合预期。遇到状态机跳转不对的情况直接在信号树上找到state寄存器右键或拖拽选中它的波形变化立刻显示出来。整个过程不用离开编辑器不用切窗口调试节奏非常连贯。如果你没有仿真工具或者只是想快速验证一个简单的时序逻辑可以像前面提到的那样手动写CSV文件。格式就是三列时间、信号名、电平值。Waveform Render会把所有同名的信号画在一起。这个功能我用来做接口协议时序验证比如模拟一次SPI读写时序手动把clk、mosi、cs的翻转点列出来几秒钟就看懂时序关系对不对。4.3 和GTKWave比谁更适合日常用这不是一个“谁替代谁”的问题我两个工具都在用。GTKWave的优点是底子厚支持VCD、FST、LXT等多种格式波形搜索、信号分组、条件触发这些高级功能更完善。如果你在调一个复杂的DDR控制器或者PCIe IP动辄几百万个时间点的波形GTKWave仍然是更专业的选择。但日常写RTL、跑仿真、做小IP验证我几乎都用Waveform Render。理由很简单它和你的代码在同一个窗口里改一行代码跑一遍仿真马上就能看到波形变化这个反馈闭环的速度是GTKWave给不了的。更别说给你的波形截图标注时直接在VSCode里截图文档里的图和代码风格一致排版也统一。还有一个容易被忽略的点Waveform Render支持直接打开FST格式而FST文件比VCD小很多。如果你的工程用了Verilator或者开源仿真生态编译时顺手加上--trace-fst生成的FST文件用来调试完全够用。5. 常见问题与排查技巧实录5.1 我遇到过的几个典型问题用这套组合这一两年踩过不少坑挑几个有代表性的列在下面供参考。问题现象可能原因解决办法Draw.io画布中文乱码中文字体在特定系统下渲染异常在画布右侧文本样式里手动选一个系统中文字体比如微软雅黑打开.drawio.svg文件只看到SVG图片无法进入编辑模式文件关联被图片查看器抢走了在VSCode文件管理器中右键文件选择“用文本编辑器打开”或者按CtrlShiftP搜“Reopen Editor With”选Text EditorVCD文件几十MB打开后Waveform Render卡顿信号层级太多波形数据量大Testbench里用$dumpvars限定只导出子模块信号或改用FST格式保存.drawio文件后Git diff显示一大片乱码XML格式会压缩图形模型diff不友好不要频繁格式化drawio文件用drawio.svg格式至少GitHub网页能预览团队约定改图时提交信息写清楚Waveform Render打开CSV文件不生效格式不规范Signal字段重复过多确保第一行是Time,Signal,Value信号列不要有空值插件市场搜不到Waveform RenderVSCode插件源问题或版本过旧确认VSCode版本已更新用扩展市场网页端搜索后选择Install会自动唤起本地VSCode安装5.2 两个值得分享的避坑心得一个是Draw.io文件的分裂维护策略。我见过不少团队把整项目架构都画在一个architecture.drawio里刚开始还好到后期模块越来越多打开画布卡顿改一次图要小心翼翼怕动到别人的模块。我的建议是拆成多个文件top层一张每个核心IP一张文档里用Markdown把这些图组织起来。这样每个文件都很小编辑流畅Git冲突概率也直线下降。VSCode里多标签页打开这几个文件互相参考着看体验比单张巨型图好太多。另一个是波形文件的命名和归档习惯。仿真生成的VCD文件动辄几百MB长期堆在工程目录里会把磁盘占满很多人以为把文件删了就完了但调试到一半突然需要看昨天的波形那就傻眼了。我现在的做法是仿真脚本统一输出到sim/out目录文件名带时间戳例如tb_top_20250115_1430.vcd。项目阶段完成后把关键的波形文件用7zip压缩归档一个200MB的VCD能压到40MB左右再放进archive目录。日常调试时就用最新的那个波形文件满足99%的需求。6. 把工具串起来一套完整的FPGA轻量工作流与周边插件6.1 从想法到波形的完整闭环把前面所有内容串起来我现在做一个小型FPGA IP验证项目的标准流程是这样的第一步在项目docs目录下新建top.drawio花半小时把模块架构、接口位宽、数据流方向画出来。这一步重点是把定点数格式、复位策略、时钟域关系定下来。第二步根据框图写RTL代码和Testbench。这一步没什么神奇的就是正常的Verilog编码但代码里的模块名、端口名会和框图中完全一致减少后续对照的脑力消耗。第三步用iverilog跑仿真生成VCD文件。第四步在VSCode里打开VCD对着波形检查关键信号是否符合预期。如果发现状态机跳转不对、数据通路延迟不对直接在代码里修改然后重跑仿真。第五步代码稳定后回到Markdown文档把框图和关键波形截图贴进去再补充一些设计说明。因为图和代码在同一次提交里这个文档始终和代码保持同步。整个流程里我基本不需要打开厂商IDE。只有当需要做真正的综合、布局布线、时序分析时才把工程导入Vivado或Quartus。这时候因为代码已经经过仿真验证IDE环节出错的概率会低很多迭代也快。6.2 周边插件推荐进一步提升效率除了Draw.io Integration和Waveform Render我还装了这几个插件共同拼出一套比较顺手的FPGA开发环境。Verilog-HDL/SystemVerilog扩展提供Verilog和SystemVerilog的语法高亮、代码片段、错误诊断。它内置的Lint功能能在写代码阶段就发现未声明信号、位宽不匹配这类低级错误省掉很多仿真时的无谓等待。TerosHDL是另一个值得关注的选择它走的是All-in-One路线集成了语法检查、模块例化模板、状态机可视化甚至也集成了波形查看和Draw.io风格的框图编辑。如果你不想装太多零散插件TerosHDL一个就够。我个人习惯是轻量组合所以只用其中的Verilog部分主要工作还是交给独立的插件。C/C Extension Pack如果你在做SoC或软核相关的开发比如用C语言写裸机程序跑在软核上这个扩展包必然要用到调试功能很完善。还有路径补全工具Path Intellisense写相对路径引用波形文件、图片时不用手动输入。现在AI编程助手越做越好用VSCode生态里也有很多代码补全插件可选比如一些基于大模型的补全工具写Verilog时能自动生成模块框架对提升效率有明显帮助。不过代码补全只能处理机械重复的部分真正的电路设计思路还是得靠人自己理清楚。6.3 选工具的本质是让思路到波形之间的距离最短写了这么多最后想聊聊我对工具选型这件事的看法。很多工程师喜欢追求一步到位总想找到一套完美的、什么都能干的工具链结果花在配置工具上的时间比写代码还多。我反而觉得开发工具的终极目标是让“从想法到波形之间的距离”最短。当你想画一张图表示模块关系时立刻就能画出来不被工具折磨当你想看某个信号波形时一步就能看到不被格式转换打断当你想和同事分享设计思路时甩一个链接过去就能看懂。能做到这几点工具就应该让位给工程本身了。VSCode加Draw.io加Waveform Render这套组合恰恰是在轻量和够用之间找到了一个平衡点。它不炫技不拿功能多来压你但每一个功能都能真正用起来不会在关键时刻掉链子。最后分享一个小技巧。在项目docs目录下放一个templates文件夹里面放一个空白的top_template.drawio和一个testbench_tb_template.v固定好常用的端口命名风格和Testbench框架。每次开新项目直接复制模板画图、写代码、跑仿真一条龙下来能省不少重复劳动。这套流程我已经用了两个项目稳定性没问题建议你试试。