ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Sublime Text 4 + Icarus Verilog:打造轻量高效的Verilog开发与仿真环境

Sublime Text 4 + Icarus Verilog:打造轻量高效的Verilog开发与仿真环境 先说我自己的情况我以前也是老老实实在 Vivado 里写 Verilog后来项目多了之后实在受不了那个编辑器的反应速度正好身边有老工程师在推 Sublime Text 4 Icarus Verilog 这套轻量组合。我试了两周就彻底回不去了。这篇文章就直接把我踩过的坑、调好的配置、以及怎么让 Sublime Text 4 和 Icarus Verilog 在 Windows 10/11 上跑顺全部写出来。适合被 Vivado 自带编辑器折腾到头大的人也适合刚入门口FPGA、想用更轻量学 Verilog 的同学。1. 为什么我最后还是把 Vivado 自带编辑器“打入冷宫”很多做 FPGA 的人第一步就是装一个十几 GB 的 Vivado然后直接用里面带代码编辑器写 RTL。这个流程没错但用久了问题会很明显。1.1 Vivado 编辑器日常写代码到底卡在哪首先要承认Vivado 自带编辑器并不是不能用它跟工程结合紧密打开 IP 核、看约束文件都比较方便。但如果你一天要写几百行 RTL就会发现几个特别消耗耐心的点启动和打开文件的延迟感很重尤其是老电脑或者机械硬盘环境点开一个 .v 文件要等一两秒。代码提示很弱基本就是标识符补全对 Verilog 的关键字、模块例化、端口连接几乎没有智能联想。没有多光标编辑没有“全局搜索文件并直接改”的流畅体验批量改信号名属于灾难级操作。字体和主题定制能力有限默认看起来偏“工业软件”风格长时间盯代码容易累。Verilog 语法检查只在综合或仿真时做错误定位到行号之后跳转效率也一般。这些单看都不是致命问题但累加在一起写代码的体验就下降得很快。特别是改一个模块的端口定义要在例化处手动同步Vivado 编辑器帮不上什么忙。1.2 这套轻量组合适合谁、不适合谁Sublime Text 4 Icarus Verilog 这套组合核心是解决“写代码 快速仿真验证”这一环。它的优点是轻、快、可定制但它不是一个完整的 FPGA 开发工具链替代不了 Vivado 的综合、约束、布局布线和烧录。适合的使用者主要是下面几类在学 Verilog 语法、写数字电路作业、做 FPGA 入门小实验的人不想每次验证计数器、状态机都开一个沉重工程。做算法模块、IP 内部逻辑、无平台相关代码验证的工程师先用 Icarus 秒跑一遍发现问题再回 Vivado 做工程内验证。喜欢统一编辑器操作习惯的人想让 Verilog 代码编辑体验向日常开发工具靠拢。不适合的场景也很明确涉及 Xilinx 原语例化、IP 核仿真、约束文件编辑、时序分析的工作该上 Vivado 就上 Vivado不要硬凹。所以这套方案的正确打开方式是日常 80% 的代码编辑和普通功能仿真放在 Sublime Icarus剩下 20% 的工程级综合和时序相关任务交给 Vivado。2. Icarus Verilog 在 Windows 下的安装与目录细节Icarus Verilog 是这套环境里的仿真内核负责把 Verilog 代码编译成可执行的仿真程序然后运行并导出波形。它跟 Vivado 自带的 xsim 干的是同一类活但更轻量、更纯粹。2.1 安装包怎么选、装完之后到底装了什么Icarus Verilog 的 Windows 版本通过安装包提供去官方 GitHub 的 Release 页面下载对应版本即可。下载文件一般是类似iverilog-v12-20220611-x64_setup.exe这样带版本号的安装程序选最新的 x64 版本就好。安装时我建议安装路径保持默认通常是C:\iverilog避免后面配置环境变量时出岔子。安装过程中如果出现“是否安装 GTKWave”之类的选项一定要装上。GTKWave 是查看 VCD 波形的工具Icarus 负责仿真GTKWave 负责看结果两者配合使用。安装包默认会把C:\iverilog\bin和C:\iverilog\gtkwave\bin写入当前用户的环境变量装完后重启终端就生效。装完以后目录结构大概是这样C:\iverilog ├── bin // iverilog.exe、vvp.exe 在这里 ├── include // 内置的 Verilog 标准库头文件 ├── lib // 仿真运行库 ├── libivl ├── gtkwave // 波形查看工具目录 └── vvpbin 目录里两个最核心的可执行文件是iverilog.exe和vvp.exe。iverilog负责把 Verilog 源码“编译”成一种中间仿真文件vvp负责运行这个仿真文件。理解了这两个分工后面配置构建系统时就不容易糊涂。2.2 装完先验证三件事避免后面到处抓瞎安装完成后先把环境验证一遍省得后面配置 Sublime 时报错还要回溯。打开 CMD 或 PowerShell依次执行iverilog -V如果输出类似iverilog: Icarus Verilog version 12.0 (stable)的信息说明编译工具正常。再试vvp -V确认 vvp 也能运行。然后输入gtkwave --version或者直接搜索 GTKWave 快捷方式看看波形工具能不能启动。这三样都正常说明环境变量没问题。有些机器装了 Icarus 之后终端还是提示“不是内部或外部命令”多半是PATH没有生效可以手动去系统设置里检查环境变量。也可以直接把C:\iverilog\bin加到当前用户 PATH 里。2.3 为什么日常验证我用 Icarus 而不是 Vivado 自带 xsim简单对比一下两者的实际体验对比项Icarus Verilog vvpVivado xsim启动速度毫秒级随手可用需要加载工程环境几秒到十几秒License 依赖无需要 Vivado License 环境正常工程依赖无独立源码即可通常关联 Vivado 工程波形输出使用$dumpfile$dumpvars生成 VCD使用 xsim 的波形库配置略复杂SystemVerilog 支持覆盖基础子集高级语法支持有限对 Xilinx 器件原语、IP 模型支持更好使用成本学习成本低一个命令搞定需要熟悉仿真设置、波形库等我用 Icarus 的主要原因是它的“回路时间”极短。写完 testbench 后 CtrlB 一下编译仿真的结果立刻出来连波形都能顺手打开。而 xsim 更适合在 Vivado 工程内做带 IP 核、带约束的完整仿真。3. Sublime Text 4 侧从插件到一键构建的完整配置Sublime Text 4 本身对 Verilog 语法是有基础高亮的但默认状态离“好用”还有一段距离。需要装几个插件、配一套 Build System才能真正做到一个快捷键搞定编译和仿真。3.1 先装 Package Control再装这几个实用插件Sublime Text 4 安装完成后第一步是装 Package Control这是 Sublime 的插件管理器。按CtrlShiftP打开命令面板输入Install Package Control回车即可。装好后再按CtrlShiftP输入Package Control: Install Package依次安装这几个Verilog-Mode这是 Verilog 开发最常用的包提供模块例化模板、自动生成 testbench 骨架、端口扫描等功能。用了它之后写例化语句的效率提升非常明显。 SystemVerilog对 SV 语法高亮支持更全如果你会写 interface、class 之类的语法建议装上。 Alignment用于代码对齐按CtrlAltA可以把连续赋值的等号对齐RTL 代码看起来会更整齐。 SublimeLinter配合 Icarus 做语法检查不过这个需要额外配置后面单独说。需要注意Sublime Text 4 跟老插件的兼容性偶尔会出问题。如果安装 Verilog-Mode 后发现菜单里没有对应入口可以在命令面板里搜索Verilog关键词手动调用相关功能。3.2 手写 Build System让 CtrlB 直接从源码到仿真结果这一步是整套环境的核心。Sublime 的 Build System 可以自定义一个“编译 运行”的指令列表按下CtrlB就自动执行。在 Sublime 里点菜单栏Tools - Build System - New Build System...会打开一个新文件把默认内容替换成下面的配置然后保存为Verilog.sublime-build{ shell_cmd: iverilog -Wall -s \${file_base}\ -o \${file_path}/${file_base}.vvp\ \${file_path}/${file_base}.v\ vvp \${file_path}/${file_base}.vvp\, working_dir: ${file_path}, selector: source.verilog, variants: [ { name: Compile Only, shell_cmd: iverilog -Wall -o \${file_path}/${file_base}.vvp\ \${file_path}/${file_base}.v\ }, { name: Waveform, shell_cmd: iverilog -Wall -s \${file_base}\ -o \${file_path}/${file_base}.vvp\ \${file_path}/${file_base}.v\ vvp \${file_path}/${file_base}.vvp\ start gtkwave \${file_path}/${file_base}.vcd\, working_dir: ${file_path} } ] }这个配置做了三件事iverilog -Wall -s testbench模块名 -o 输出文件 源文件。-s指定仿真顶层模块这样如果当前 tb 文件里模块名和文件名不一致也能正确解析。由于日常使用中 tb 和 RTL 源码通常放同一目录这个配置实际会把“当前文件”作为源文件编译。vvp 生成的.vvp文件。执行编译后的仿真程序跑出波形文件和打印信息。Waveform变体在vvp执行完后自动调用gtkwave打开 VCD 波形。这个变体通过Tools - Build System - Verilog - Waveform或快捷键调出。保存完 build 文件后打开一个 testbench按CtrlB底部面板会直接显示iverilog和vvp的输出。如果出现编译错误Sublime 会把错误信息抓出来方便跳转。3.3 一键生成模板和自动例化写 testbench 的速度直接翻倍Verilog-Mode 提供了很多实用功能最典型的是自动生成 testbench 骨架。在 Sublime 里打开一个 RTL 模块然后通过命令面板搜索Verilog: Generate Testbench具体菜单名可能因版本而异插件会扫描当前模块的端口列表自动生成一个初始的 tb 文件省去手写端口连接的重复劳动。模块例化也很方便。写好模块后在当前文件的例化位置用插件的“模块实例化”功能可以自动把端口名和相关连线列出来。虽然有时生成结果需要手动调整信号名但比自己敲快很多。日常我还改了几个 Sublime 的编辑习惯在Preferences - Settings里加入{ tab_size: 4, translate_tabs_to_spaces: true, detect_indentation: false, auto_indent: true, draw_white_space: all, trim_trailing_white_space_on_save: true }这几项把缩进统一成 4 空格、保存时自动去掉行尾多余空格。RTL 代码对齐和整洁度对排查问题很有帮助尤其是多人协作时混用 Tab 和空格会让 diff 非常混乱。3.4 中文注释乱码从根源上统一编码网上很多朋友问“Vivado 中文注释乱码如何恢复”实际上问题常出在编码不一致。Vivado 在某些环境下默认用 GBK/GB2312 读取源码文件而 Sublime 保存文件默认是 UTF-8。两者混用就会在一边看到正常、一边看到乱码。我的做法是统一成 UTF-8Sublime 里文件的右下角编码显示是UTF-8如果不是就点击后选择Save with Encoding - UTF-8。Vivado 中在Settings - Text Editor里把 File Encoding 设置为 UTF-8或者按系统默认统一。已经乱码的文件用 Sublime 打开后选择File - Reopen with Encoding - GBK确认内容是中文后再Save with Encoding - UTF-8转一遍保存后重新给 Vivado 用。这种编码问题一出就是一片全乱早统一早安心。4. 日常开发流程实测以一个小计数器从 RTL 到波形走一遍Sublime 和 Icarus 都配好了下面用一个最简单的 8 位计数器完整跑一遍“写模块 - 写 testbench - 编译仿真 - 波形查看”的流程方便你对照验收自己的环境。4.1 从写一个模块到 testbench 的完整时序在工作目录建立counter8.v内容如下module counter8 ( input wire clk, input wire rst_n, output reg [7:0] cnt ); always (posedge clk or negedge rst_n) begin if (!rst_n) cnt 8d0; else cnt cnt 1b1; end endmodule再在同目录建立tb_counter8.vtimescale 1ns / 1ps module tb_counter8; reg clk 1b0; reg rst_n 1b0; wire [7:0] cnt; always #10 clk ~clk; initial begin $dumpfile(tb_counter8.vcd); $dumpvars(0, tb_counter8); #20 rst_n 1b1; #2000 $finish; end counter8 uut ( .clk (clk), .rst_n (rst_n), .cnt (cnt) ); endmodule这里有两个关键点$dumpfile(tb_counter8.vcd)和$dumpvars(0, tb_counter8)告诉 Icarus 把信号变化记录到 VCD 文件里。0表示记录该模块下所有层级信号。always #10 clk ~clk生成周期为 20ns 的时钟#20延迟后拉高复位然后仿真 2000ns 后结束。4.2 命令行手动走一遍理解工具在干什么在 Sublime 里按CtrlB之前先用 CMD 手动跑一次确认没有任何隐藏问题。切换到源码目录执行iverilog -Wall -s tb_counter8 -o tb_counter8.vvp tb_counter8.v counter8.v这里我把tb_counter8.v和counter8.v都列上了因为 testbench 例化了计数器模块编译时必须把两个文件一起交给 iverilog。如果想偷懒也可以写成iverilog -Wall -s tb_counter8 -o tb_counter8.vvp *.v但要注意目录里不要混入无关的.v文件。编译没有报错后继续执行vvp tb_counter8.vvp此时目录下会多出tb_counter8.vcd文件这就是波形文件。然后打开 GTKWavegtkwave tb_counter8.vcdGTKWave 启动后左侧能看到tb_counter8下的信号把clk、rst_n、cnt拖到右侧窗口就能看到波形了。4.3 构建系统里的常见报错和我的排查顺序实际用下来大家最容易在构建系统上卡住的几种情况我整理成了一张表报错现象常见原因解决方式提示 iverilog 不是内部或外部命令环境变量没配置检查 PATH 是否包含C:\iverilog\bin重启终端/编辑窗口编译时找不到某个引用模块当前文件和被例化模块不在一个目录且没有用-I指定搜索路径在 build 系统里加-I参数或统一把源码放同一目录vvp 运行后没有生成 VCD 文件testbench 里少了$dumpfile和$dumpvars在 tb 的 initial 块中补上这两句GTKWave 无法打开 VCD 文件VCD 文件被其他程序占用或路径含中文关闭占用程序保证工程路径无中文、无空格编译时出现大量关于 timescale 的警告各文件 timescale 设置不一致统一用timescale 1ns / 1ps我的排查顺序是先看 iverilog 编译输出编译过了再看 vvp 运行输出波形为空才回头检查 testbench 里的复位和时钟是否有效。不要一上来就怀疑工具链问题。4.4 写 testbench 时的几个“坏味道”和避坑经验Icarus 环境不像 Vivado 里有那么多图形化设置testbench 写得好不好直接影响调试效率。我踩过比较多的坑有这几个时钟生成用死循环而不是有限语句。如果always块里没有配合$finish仿真会一直跑下去看起来像卡死。正确姿势是用initial里的#10 clk ~clk;配合整个仿真的总时长控制。复位逻辑只在开头给一次中间没有释放或再次拉低导致后面信号状态不可控。推荐的写法是给足延迟比如#20 rst_n 1b1;让复位释放明确可见。忘记导波形。$dumpvars没写或者写错层级GTKWave 打开是空的实际上仿真已经跑完了。在 tb 里用阻塞赋值给被测模块的输入信号赋值导致时序出现意外。tb 里给信号提供激励一般也用避免和 DUT 时钟沿竞争。这些小问题在图形化 IDE 里不容易被察觉但在命令行和编辑器流里会直接变成“波形不对”的结果。经验是testbench 写得越干净后续排错越省力。5. 跟 Vivado 的工程级协作Sublime 写代码Vivado 管综合很多人担心用 Sublime 写代码后跟 Vivado 工程脱节怎么办。实际上两者完全可以共存各管一段。5.1 把 Vivado 工程源码目录直接拉进 Sublime 工作区Vivado 工程里的 RTL 文件路径一般是工程目录/工程名.srcs/sources_1/new/testbench 通常在sim_1/new/。在 Sublime 中直接用Project - Add Folder to Project把整个工程根目录拉进来就能在左侧边栏里浏览所有源码文件。这样做的好处是Sublime 的全局搜索CtrlShiftF可以跨整个工程搜索信号名和模块例化位置比 Vivado 自带搜索快很多。文件跳转靠CtrlP输入文件名即可不用在 Vivado 的层次窗口里一层层点进去。多标签页同时打开 RTL、约束文件和文档检查引脚分配时非常方便。在 Sublime 里改完代码后切到 Vivado 窗口它会自动检测文件变化刷新后再综合即可。如果开了 Vivado 的自动加载有时甚至会直接识别到改动但保险起见还是手动Refresh一下工程。5.2 保留一个调用 XSim 的备选构建系统有些场景必须在 Vivado 的仿真环境里验证比如设计中用到了 Xilinx 原语或 IP 核Icarus 无法直接解析。为了不来回切换窗口我另外配了一个调用 Vivado xsim 工具的 build system。在 Sublime 里新建一个VivadoXSim.sublime-build{ shell_cmd: xvlog -i \${file_path}\ \${file_path}\/*.v xelab -timescale 1ns/1ps -top tb_top -debug access -s tb_top xsim --runall tb_top, working_dir: ${file_path}, selector: source.verilog, variants: [ { name: Open Waveform, shell_cmd: xvlog -i \${file_path}\ \${file_path}\/*.v xelab -timescale 1ns/1ps -top tb_top -debug all -s tb_top xsim --runall tb_top -view \${file_path}/testbench_behav.wcfg\, working_dir: ${file_path} } ] }用这套的前提是系统 PATH 里能看到xvlog、xelab、xsim。最简单的方式是打开 Vivado 自带的 “Vivado 命令提示符”在里面测试命令如果要在 Sublime 里直接用需要把C:\Xilinx\Vivado\2024.2\bin加到 PATH按实际版本改路径。不过我自己的习惯是只有涉及 IP 核、原语这类 Icarus 搞不定的场景才用 xsim普通功能仿真一律 Icarus。因为 xsim 启动慢而且 xelab 的参数比 iverilog 复杂日常验证用它是杀鸡用牛刀。5.3 网上的常见 Vivado 问题如何避坑标题相关的热词里有很多关于 Vivado 安装、license、驱动和仿真的问题。结合我的体验有几个和本文主题关联度高的点值得说Vivado 安装时提示 winpcap 安装失败这个经常出现在网络组件安装阶段影响的是 Serial 和 Ethernet 调试相关的库但通常不影响编程下载。可以先忽略实际连接板卡有问题再单独装 WinPcap。Vivado license 相关的问题也很常见。如果第一次打开工程提示 license 失效检查环境变量里的XILINXD_LICENSE_FILE是否指向了正确的 license 文件或者直接确认 2035 过期问题是否影响当前版本。板卡驱动不识别时大多数情况是没装 Cable Drivers在 Vivado 安装目录的data/xicom/cable_drivers/nt64下以管理员身份运行install_drivers.exe。这些和 Sublime 方案不冲突但提前知道能省很多搜索时间。6. 这套环境的边界与优化我的真实体验和建议工具链用顺了以后效率确实高不少。但也有它明显的边界提前知道能避免以后卡在奇怪的地方。6.1 哪些场景不要硬用 Icarus 仿真Icarus 是开源工具对 Verilog 经典语法支持稳定但以下场景容易出问题SystemVerilog 的高级语法比如 interface、class、随机约束、断言Icarus 只有部分支持。写 UVM 或者复杂 SV 验证环境时基本还是要靠专门的仿真器。Xilinx 原语与器件级原语像 IBUFDS、BUFG、MMCM、PLLE2 这些Icarus 没有对应的器件模型。即使编译通过仿真行为也不可信。Vivado IP 核类似 Block Memory、FIFO、DDR Controller 等 IP导出仿真模型后要调用 Xilinx 的功能库Icarus 很难直接加载这些模型。综合后时序仿真Icarus 属于功能仿真层面不带 SDF 时序反标和布线延迟模型无法验证时序收敛。换句话说Icarus 适合验证“逻辑对不对”不适合验证“在 FPGA 里能不能跑通”。6.2 我实际项目里囤的实用配置和快捷键用久了之后我总结了一套相对顺手的工作流CtrlB默认跑“编译并仿真”其实是 Icarus 流程。按CtrlShiftB可以调出 Build System 变体菜单选择Verilog - Waveform直接跑仿真并打开 GTKWave。在 Sublime 里把 “Save All on Build” 开起来Preferences - Settings中加save_all_on_build: true这样 CtrlB 前会自动保存所有改动文件避免仿真跑的是旧代码。另外如果路径里有空格比如桌面路径C:\Users\My Documents\fpga\直接用写死的-s参数和${file_path}拼接也能工作只要 build 文件里所有路径都加引号即可。这也是我在配置里到处加引号的原因。6.3 给新手的学习路线建议如果你刚入门 FPGA我的建议是先别急着打开 Vivado。先装好 Sublime Text 4 和 Icarus Verilog用这套环境把 Verilog 语法、组合逻辑、时序逻辑、状态机、计数器、常见接口这些基础跑通每写完一个模块就随手用iverilog仿真看一下波形。这样学得轻、迭代快、对“代码到电路”的理解会更直观。等你要真正烧板子、调约束、看时序报告的时候再打开 Vivado把前面写的模块拿进去综合一下感受一下从功能验证到工程落地的完整链路。此时你对代码本身已经足够熟悉Vivado 里那些稍显笨重的操作反而不会干扰你理解重点。我自己现在写代码已经强烈依赖 Sublime 的多光标、全局搜索和快速跳转但这并不是说 Vivado 编辑器没用。它跟工程结合得好适合在工程内做细粒度检查和跳转。只是日常的大多数编辑动作我已经默认在 Sublime 里完成了。如果你决定尝试这套环境强烈建议一开始就把所有工程目录统一放在一个无中文、无空格的路径下比如D:\fpga_work所有的源码、tb、波形文件都按项目分目录存放。这样既能避免 Icarus 和 GTKWave 在某些特殊路径下的兼容问题后面接入 Vivado 工程时也能省掉大量莫名其妙的坑。最后分享一个小技巧在 Sublime 里写 Verilog 时可以多利用代码片段功能给自己预置常用模板比如 always 块、模块声明、testbench 骨架把高频样板代码的输入时间压到最低——这套组合的舒适度基本就是从这些小细节里攒出来的。
返回列表