ARTICLE DETAIL

资讯详情

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

Vivado之外搭建轻量Verilog编辑环境:Notepad++与NppExec实战

Vivado之外搭建轻量Verilog编辑环境:Notepad++与NppExec实战 1. 为什么要在Vivado之外再搭一套轻量编辑环境1.1 大体量IDE的日常痛点干FPGA这行的没人不知道Vivado。功能确实全从综合、实现到生成比特流一条龙但它的编辑器用起来是真的让人又爱又恨。我平时做项目Vivado工程动辄几十个Verilog文件每次双击打开一个文件那个加载速度就够泡一杯茶了。更别提它自带的代码补全和语法高亮跟现代编辑器比起来简直是上个时代的产物——关键字颜色区分不明显自动缩进经常乱掉搜索替换的交互也谈不上顺手。还有一个很现实的问题Vivado是个吃内存大户。我自己的开发机是32G内存开着Vivado跑综合的时候再开几个大文件编辑风扇就开始狂转。如果只是改几行RTL代码、调一下参数实在没必要把整个Vivado都拉起来。这就好比你就想拧一颗螺丝结果非得把整个工具箱搬出来。所以我的习惯是Vivado只用来做综合、实现、仿真和下载日常写代码、改代码、查代码全部交给Notepad。这套组合我用了好几年效率提升非常明显。Notepad启动几乎是秒开占用内存小语法高亮和代码折叠做得干净利落配合几个关键插件完全能胜任Verilog开发中90%的文本编辑工作。1.2 这套方案适合哪些人这套轻量级环境特别适合以下几类人一是在校学生电脑配置一般跑Vivado本身就吃力日常写Verilog作业用Notepad会流畅很多二是需要频繁查阅和修改RTL的工程师尤其是做IP集成、顶层连线、参数调整这类工作大部分时间其实花在阅读和微调代码上三是习惯多显示器工作流的人一个屏幕开Vivado跑综合另一个屏幕用Notepad看代码互不干扰。当然这套方案不是要替代Vivado而是和Vivado形成互补。Vivado负责它擅长的编译、综合、实现、仿真Notepad负责它擅长的快速编辑和代码浏览。两者配合才是效率最大化的做法。1.3 整体思路和工具链构成整套方案的核心工具链其实很简单Notepad作为主编辑器NppExec作为命令调用桥梁ModelSim或Vivado自带的xsim作为仿真后端。Notepad本身只是一个文本编辑器它不知道什么是Verilog也不知道怎么编译。但通过NppExec插件我们可以在Notepad里直接调用外部命令比如调用ModelSim的vlog和vsim来编译和仿真当前文件或者调用Vivado的xvlog来做语法检查。这样一来你就在Notepad里获得了一个编辑编译仿真的闭环。写代码不用切窗口按个快捷键就能看到编译结果和仿真波形。对于日常开发来说这种流畅感是Vivado自带编辑器给不了的。提示这套方案的核心价值在于快和轻它不会取代Vivado的工程管理能力。大型工程的综合、实现、时序分析还是得回到Vivado里做。2. Notepad的安装与Verilog环境配置2.1 Notepad下载与Windows 11安装注意事项Notepad的安装本身没什么难度但有几个细节值得说一下。首先是下载渠道建议直接去官网下载版本选择最新的稳定版即可。2024年目前的版本对Windows 11的兼容性已经做得很好安装过程基本一路下一步就行。安装的时候有一个选项需要注意Customize里的组件选择。默认情况下它会勾选一些你未必需要的组件比如某些语言包和右键菜单集成。我的建议是保留Context Menu里的Edit with Notepad这个在Windows 11里非常实用右键点一个.v文件就能直接打开编辑。其他的组件按需选择即可不用全勾。还有一个Windows 11特有的问题权限。如果你把Notepad安装在C盘的Program Files目录下后续配置NppExec调用外部命令时可能会遇到权限不足的问题导致命令执行失败。我的做法是安装在非系统盘比如D:\Tools\Notepad这样后续配置插件和调用外部工具都不会有权限障碍。安装完成后第一次启动建议先做两件事一是关闭自动更新检查设置里可以关避免工作时突然弹窗二是设置默认编码为UTF-8Verilog文件虽然大多是ASCII但注释里如果有中文编码不对就会乱码。2.2 Verilog语法高亮的配置方法Notepad默认的语言列表里没有Verilog但配置起来很简单。有两种方式一种是手动导入语法高亮配置文件另一种是使用User Defined LanguageUDL功能自己定义。我推荐第一种方式因为网上有现成的Verilog语法高亮配置文件直接导入就行。具体操作是打开Notepad点击语言菜单选择自定义语言-导入然后选择下载好的Verilog XML配置文件。导入后重启Notepad在语言菜单里就能看到Verilog选项了。导入之后你需要把.v文件关联到Verilog语言。方法是打开一个.v文件然后在语言菜单里选择Verilog之后Notepad会记住这个关联。如果想让所有.v文件都自动用Verilog高亮可以在设置-首选项-文件关联里把.v和.sv添加到Verilog语言下。语法高亮配置好之后关键字、注释、字符串、数字都会有不同的颜色代码可读性会大幅提升。如果你对默认配色不满意可以在设置-语言格式设置里调整每种token的颜色和字体样式。我个人的习惯是把关键字设成蓝色加粗注释设成绿色这样一眼就能区分代码和注释。2.3 代码折叠与自动缩进的调优Verilog代码里经常有大量的begin-end块、module-endmodule块代码折叠功能非常重要。Notepad的代码折叠默认是基于缩进的但Verilog的折叠需要基于语法结构才准确。导入Verilog语法高亮配置后折叠功能会自动适配Verilog的语法结构你可以折叠整个module、task、function或者always块。自动缩进方面Notepad默认的缩进可能不太符合Verilog的编码习惯。我建议在设置-首选项-编辑器里把制表符宽度设为4以空格代替制表符勾上。Verilog社区的主流风格是4空格缩进用空格而不是Tab这样在不同编辑器里打开代码格式都不会乱。另外自动完成功能也值得配置一下。在设置-首选项-自动完成里可以开启输入时自动提示并设置触发字符数。对于Verilog来说常用的关键字比如always、assign、module、endmodule等输入前几个字母就能提示出来能省不少打字时间。注意Notepad的自动完成是基于文档中已出现的单词不是基于Verilog语法库。所以它的补全能力有限但对于重复出现的信号名和模块名还是很有帮助的。3. NppExec插件把Notepad变成Verilog编译入口3.1 NppExec插件的安装与基本配置NppExec是Notepad的一个插件它的作用是在Notepad里执行外部命令并把命令的输出显示在Notepad的控制台窗口里。这个插件是整套方案的核心没有它Notepad就只是一个单纯的文本编辑器。安装NppExec有两种方式一是通过Notepad的插件-插件管理在线安装二是手动下载dll文件放到plugins目录下。在线安装最方便打开插件管理搜索NppExec勾选后点击安装Notepad会自动下载并安装重启后就能在插件菜单里看到NppExec。安装完成后建议先做几个基础配置。打开插件-NppExec-Execute你会看到一个命令输入框。这里可以输入任何命令行指令比如cmd /c echo hello点击OK后输出会显示在控制台里。控制台的字体和颜色可以在NppExec的设置里调整我习惯把控制台字体设成Consolas 10号背景设成深色这样看编译输出比较舒服。NppExec还有一个很重要的功能是变量。它支持一些内置变量比如$(FULL_CURRENT_PATH)表示当前文件的完整路径$(CURRENT_DIRECTORY)表示当前文件所在目录$(NAME_PART)表示当前文件名不含扩展名。这些变量在配置编译命令时非常有用。3.2 配置ModelSim编译与仿真命令假设你已经安装好了ModelSim并且把ModelSim的bin目录添加到了系统PATH环境变量里。如果没有添加PATH也可以在NppExec命令里写ModelSim的完整路径。一个典型的ModelSim编译命令是这样的cd $(CURRENT_DIRECTORY) vlib work vlog $(FILE_NAME) vsim -c -do run -all; quit $(NAME_PART)这段命令的意思是切换到当前文件所在目录创建一个work库编译当前文件然后以命令行模式启动仿真并运行所有测试。-c表示命令行模式不打开GUI-do表示仿真启动后执行的命令。如果你想要看波形可以把-c去掉改成GUI模式cd $(CURRENT_DIRECTORY) vlib work vlog $(FILE_NAME) vsim -do add wave -r /*; run -all $(NAME_PART)这样ModelSim会打开GUI窗口自动添加所有信号到波形窗口并运行仿真。对于调试来说这个命令非常方便。在NppExec里配置好命令后点击Save保存给它起个名字比如ModelSim Compile Sim。之后就可以在插件-NppExec-Saved Commands里直接调用或者给它分配一个快捷键。3.3 用NppExec调用Vivado做语法检查有时候你不想启动完整的ModelSim只想快速检查一下代码有没有语法错误。这时候可以用Vivado自带的xvlog工具。xvlog是Vivado的Verilog编译器可以独立运行速度比启动完整Vivado快得多。配置命令如下cd $(CURRENT_DIRECTORY) call xvlog $(FILE_NAME)如果你的Vivado没有添加到PATH需要写完整路径比如cd $(CURRENT_DIRECTORY) call D:\Xilinx\Vivado\2022.2\bin\xvlog.bat $(FILE_NAME)运行后如果代码有语法错误xvlog会在控制台里输出错误信息包括行号和错误描述。你可以在Notepad里直接定位到对应行修改。如果编译通过控制台会显示Compiling module ...之类的信息。这个语法检查的速度非常快通常一两秒就能出结果。对于日常写代码来说写完一个模块先跑一下xvlog确认没有语法错误再放到Vivado工程里综合能省很多时间。提示xvlog默认只编译当前文件如果模块之间有依赖关系需要把所有相关文件都加到命令里。可以用通配符比如xvlog *.v但要注意文件顺序被引用的模块要先编译。3.4 快捷键绑定与一键编译仿真NppExec的命令配置好之后建议给常用的命令分配快捷键。方法是在设置-快捷键-插件命令里找到NppExec的Execute或者Saved Commands相关项分配一个不冲突的快捷键。我个人的习惯是CtrlShiftC绑定到ModelSim Compile SimCtrlShiftV绑定到Vivado Syntax Check。这样写代码的时候随手按一下就能编译检查不用去菜单里找。还有一个技巧是配置NppExec的Save all files on execute选项。在NppExec的设置里勾上这个选项每次执行命令前会自动保存当前文件避免因为忘记保存导致编译的是旧版本代码。这个细节看似小但实际用起来能避免很多为什么改了代码没生效的困惑。4. 完整实操流程从写代码到看波形4.1 新建Verilog文件与模板配置在Notepad里新建一个文件另存为.v后缀比如counter.v。然后配置一个Verilog模板这样每次新建文件都能自动生成基本的module框架。模板配置的方法是在Notepad的安装目录下找到plugins\NppExec或者使用Notepad的宏功能。更简单的方式是使用设置-首选项-新建文档-默认语言设为Verilog然后在宏里录制一个新建模板的操作。我自己的做法是准备一个模板文件内容如下module module_name ( input wire clk, input wire rst_n, output reg [7:0] data_out ); // 信号定义 // 逻辑实现 endmodule每次新建文件后把这个模板粘贴进去改一下模块名和端口就行。虽然手动粘贴有点原始但比每次从头写module框架要快得多。4.2 编写一个滑动窗口滤波模块为了演示整个流程我们写一个简单的滑动窗口滤波模块。这个模块对输入数据做4点滑动平均输出滤波后的结果。module sliding_window_filter #( parameter DATA_WIDTH 8, parameter WINDOW_SIZE 4 )( input wire clk, input wire rst_n, input wire data_valid, input wire [DATA_WIDTH-1:0] data_in, output reg data_out_valid, output reg [DATA_WIDTH1:0] data_out ); reg [DATA_WIDTH-1:0] window [0:WINDOW_SIZE-1]; reg [1:0] wr_ptr; reg [DATA_WIDTH1:0] sum; integer i; always (posedge clk or negedge rst_n) begin if (!rst_n) begin wr_ptr 2d0; data_out_valid 1b0; data_out 0; for (i 0; i WINDOW_SIZE; i i 1) window[i] 0; end else if (data_valid) begin window[wr_ptr] data_in; wr_ptr wr_ptr 1b1; sum 0; for (i 0; i WINDOW_SIZE; i i 1) sum sum window[i]; data_out sum 2; data_out_valid 1b1; end else begin data_out_valid 1b0; end end endmodule这个模块虽然简单但包含了Verilog开发的几个核心要素参数化设计、时序逻辑、数组操作、位宽计算。写完之后用NppExec调用xvlog做语法检查确认没有错误。4.3 编写Testbench并运行ModelSim仿真接下来写一个简单的testbench来验证这个滤波器timescale 1ns/1ps module tb_sliding_window_filter; reg clk; reg rst_n; reg data_valid; reg [7:0] data_in; wire data_out_valid; wire [9:0] data_out; sliding_window_filter #( .DATA_WIDTH(8), .WINDOW_SIZE(4) ) u_filter ( .clk (clk), .rst_n (rst_n), .data_valid (data_valid), .data_in (data_in), .data_out_valid (data_out_valid), .data_out (data_out) ); initial begin clk 0; forever #5 clk ~clk; end initial begin rst_n 0; data_valid 0; data_in 0; #20 rst_n 1; repeat (10) begin (posedge clk); data_valid 1; data_in $random % 256; end (posedge clk); data_valid 0; #100 $stop; end endmodule在Notepad里打开这个testbench文件按CtrlShiftC运行ModelSim编译仿真命令。如果一切正常ModelSim会打开GUI窗口显示波形。你可以看到data_in和data_out的波形验证滤波效果。4.4 参数计算与位宽选择说明这里重点说一下位宽的计算。滑动窗口滤波的输出是4个8位数据的和再右移2位相当于除以4。4个8位数的和最大是4*2551020需要10位才能表示。所以sum的位宽设为DATA_WIDTH210位data_out也是10位。右移2位后结果范围是0到255实际上8位就够了。但为了保持精度和避免溢出输出位宽设为10位是合理的。如果你希望输出也是8位可以在最后做饱和截断但那样会损失精度。这个位宽计算的过程在写代码的时候就要想清楚。很多初学者容易犯的错误是位宽不够导致溢出仿真结果不对。我的习惯是在定义每个信号的时候都在注释里写清楚它的取值范围和位宽计算依据这样后面回头看代码的时候不会忘。注意Verilog里的位宽计算要养成习惯加法要考虑进位乘法要考虑位宽翻倍移位要考虑精度损失。这些细节在仿真阶段可能不明显但到了硬件上就是实打实的bug。5. 常见问题与排查技巧实录5.1 NppExec命令执行失败的排查思路NppExec命令执行失败是最常见的问题表现是控制台里报错或者没有任何输出。排查的时候按以下顺序检查第一检查PATH环境变量。如果命令里写的是vlog而不是完整路径需要确认ModelSim的bin目录在系统PATH里。可以在cmd里直接运行vlog -version测试如果cmd里能运行而NppExec里不行说明NppExec的环境变量和系统环境变量不一致。解决办法是在NppExec命令开头加上set PATH...或者直接用完整路径。第二检查工作目录。NppExec默认的工作目录可能不是当前文件所在目录。命令开头一定要加cd $(CURRENT_DIRECTORY)确保在正确的目录下执行。第三检查文件路径里的空格。如果文件路径里有空格比如C:\My Projects\test.v命令里的路径需要用引号括起来否则会被截断。可以用$(FULL_CURRENT_PATH)的形式。第四检查权限。如果Notepad安装在Program Files下且没有以管理员身份运行某些命令可能会因为权限不足而失败。解决办法是把Notepad安装在非系统盘或者以管理员身份运行。5.2 ModelSim仿真波形红线的常见原因ModelSim仿真波形出现红线通常表示信号处于不定态X态。这是Verilog仿真里最常见的问题之一原因可能有以下几种现象可能原因排查方法所有信号都是红线时钟或复位没有正确初始化检查testbench里clk和rst_n的初始值部分信号红线信号未初始化就被使用检查reg变量是否有初值或复位逻辑输出信号红线组合逻辑环路或未驱动检查assign和always块是否覆盖所有分支仿真开始后短暂红线复位释放前的正常不定态确认复位释放后信号是否恢复正常我遇到最多的情况是reg变量没有复位。在Verilog里reg变量如果没有在复位分支里赋值仿真开始时就是X态。如果这个X态参与了后续运算就会传播到整个设计。解决办法是在always块的复位分支里把所有reg变量都赋初值。另一个常见原因是模块端口连接错误。比如testbench里例化模块时端口名拼写错误或者位宽不匹配导致信号没有正确连接。这种问题在编译时可能不报错但仿真时信号就是X态。排查方法是仔细核对例化时的端口连接。5.3 Vivado综合报错DRC RTSTAT-2的处理DRC RTSTAT-2是Vivado实现阶段常见的报错通常和时序约束有关。这个报错的全称是RTSTAT-2: No valid clock specified意思是设计中没有找到有效的时钟定义。出现这个报错的原因通常是顶层模块的时钟端口没有被正确的时序约束覆盖。Vivado需要知道哪个端口是时钟才能做时序分析。如果约束文件里没有create_clock命令或者时钟端口名写错了就会报这个错。解决办法是在XDC约束文件里添加时钟约束create_clock -period 10.000 -name sys_clk [get_ports clk]这行命令的意思是在clk端口上创建一个周期为10ns100MHz的时钟名字叫sys_clk。周期值根据你的实际时钟频率来定比如50MHz就是20ns。如果时钟是经过PLL或MMCM生成的还需要对生成的时钟做约束。Vivado通常会自动推导生成的时钟但有时候需要手动指定。另外如果设计里有多个时钟域每个时钟都要单独约束。提示DRC报错不要慌Vivado的报错信息通常很详细会告诉你具体是哪个端口、哪个时钟出了问题。仔细读报错信息大部分问题都能定位到。5.4 Notepad插件兼容性与JSON Viewer安装Notepad的插件生态很丰富但插件兼容性是个需要注意的问题。特别是Notepad升级到新版本后旧版插件可能不兼容导致Notepad启动时报错或者插件无法加载。JSON Viewer是一个常用的插件用于格式化和查看JSON文件。安装方法和NppExec类似通过插件管理在线安装即可。如果在线安装失败可以手动下载对应版本的dll文件放到Notepad的plugins目录下重启即可。需要注意的是32位和64位的插件不通用。你的Notepad是64位版本就必须下载64位的插件dll。如果装错了版本Notepad启动时会提示插件加载失败。查看Notepad位数的方法是帮助-关于里面会显示是32-bit还是64-bit。如果插件导致Notepad无法启动可以进入Notepad的安装目录把plugins目录下对应的插件文件夹删掉或者把整个plugins目录改名Notepad就能以无插件模式启动。然后再逐个排查是哪个插件的问题。6. 效率提升的进阶技巧与个人心得6.1 多文件工程的管理策略Notepad本身没有工程管理功能但可以通过会话功能来管理多文件工程。方法是打开工程相关的所有文件然后点击文件-保存会话给会话起个名字比如my_fpga_project。下次打开Notepad时通过文件-加载会话就能一次性打开所有相关文件。对于大型工程我建议按功能模块分组保存多个会话。比如顶层与约束一个会话数据通路模块一个会话测试平台一个会话。这样切换工作内容的时候不会一下子打开几十个文件导致混乱。另外Notepad的文件夹作为工作区功能也很实用。在文件-打开文件夹作为工作区里选择一个文件夹Notepad会在左侧显示文件夹树双击就能打开文件。这个功能类似于轻量级的工程浏览器对于浏览整个工程的目录结构很有帮助。6.2 正则表达式在Verilog重构中的应用Notepad的正则表达式搜索替换功能非常强大在Verilog代码重构时能省大量时间。比如你要把所有wire [7:0]改成wire [15:0]可以用正则表达式精确匹配。一个常用的场景是批量修改信号名。比如你把一个模块的端口名从data_in改成了din需要在整个工程里同步修改。用正则表达式\bdata_in\b匹配整个单词替换为din就能避免误改到data_internal这样的信号名。另一个场景是提取模块端口列表。用正则表达式^\s*(input|output|inout)\s.*可以匹配所有端口声明行然后复制出来整理成例化模板。这个技巧在集成IP的时候特别有用能快速生成例化代码。正则表达式在Notepad里的语法是标准的PCRE支持捕获组、前后查找等高级功能。花点时间学一下正则表达式在代码重构和批量修改时能省下大量手工操作的时间。6.3 个人使用这套方案的几点体会这套方案我用了好几年最大的体会是工具要服务于工作流而不是反过来。Vivado功能强大但它的编辑器不适合快速编辑Notepad轻量快速但不懂Verilog语法。两者结合各取所长才是效率最高的做法。有几个细节是我踩过坑之后才注意到的。第一NppExec的命令一定要加cd $(CURRENT_DIRECTORY)否则工作目录不对编译的文件可能不是你以为的那个。第二ModelSim的work库要定期清理有时候改了代码但仿真结果没变就是因为work库里的旧编译结果没更新。第三Notepad的自动保存功能要慎用它可能会在你不想保存的时候自动保存导致代码处于中间状态。我习惯手动CtrlS心里有数。还有一个建议是不要把Notepad配置得太复杂。插件装多了启动会变慢快捷键设多了容易冲突。保持精简只装真正需要的插件只设真正常用的快捷键。这套方案的核心价值就是轻配置太重就失去意义了。最后说一个实际场景我在做DDR3读写控制的时候状态机代码有几百行用Vivado打开要等好几秒用Notepad秒开。改完代码用NppExec跑一下xvlog语法检查确认没问题再切回Vivado综合。整个流程非常顺畅比全程在Vivado里操作快得多。这种流畅感是用过之后回不去的。
返回列表