1. UltraEdit 写 Verilog 的真实痛点
UltraEdit 是一款老牌文本编辑器,启动快、大文件不卡、列编辑和正则替换都很顺手,很多做 FPGA、ASIC、数字 IC 验证的朋友习惯拿它当主力编辑器。但默认安装完打开.v文件,你会发现关键字全是黑的,module、endmodule、always、posedge和普通变量一个颜色,代码折叠也点不开,写几百行的状态机时上下翻找信号定义非常痛苦。
Verilog 语法高亮在 UltraEdit 里不是自动的,它依赖一个叫 wordfile 的语法定义文件。这个文件用纯文本描述关键字、注释符号、缩进规则、折叠规则,配置好之后 UltraEdit 才能正确识别 Verilog 结构。很多人卡在两步:一是不知道 wordfile 从哪来、放哪、怎么挂载;二是高亮配好了,但想让编辑器再带一点 AI 补全能力时,不知道 API Key 和配置文件骨架怎么搭。
这篇就按「先让高亮生效,再让 AI 通道连通」的顺序走。前半段交付可直接复制的 UltraEdit Verilog wordfile 片段和挂载步骤,后半段给出通过 TaoToken 统一 Key 接入 AI 补全的settings.json/config.toml骨架,并逐项验证高亮和 API 连通性。适合正在用 UltraEdit 写 Verilog、又想少折腾多套 Key 的开发者。
2. 准备 Verilog wordfile 与 TaoToken 通道
UltraEdit 的语法高亮核心是 wordfile。官方 extras 页面提供了一批现成的语法文件,Verilog 也在其中,下载后是一个.uew文件。你可以直接用它,也可以按自己的编码习惯改缩进和折叠规则。我建议先拿到官方版本,再在它基础上加自己的关键字,这样不容易漏掉系统函数和编译指令。
AI 补全这一侧,思路是让编辑器或外部补全工具通过一个统一的 OpenAI 兼容接口发请求。TaoToken 提供统一 Key 和 API 通道,把模型调用收敛到一个地址和一把 Key 上,省得每个工具单独配。官网入口在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基址是 https://taotoken.net/api ,注意 API 地址不带 UTM 参数。
你需要提前准备两样东西:一份 Verilog wordfile,一把 TaoToken API Key。Key 在控制台的 API Keys 页面创建,地址是 https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。创建后复制保存,后面配置文件里要用。模型对话调试页面在 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,可以先用它确认 Key 能正常出结果,再往编辑器里接。
3. 可复制的 UltraEdit Verilog 高亮配置
3.1 wordfile 关键片段
下面这段是 Verilog wordfile 的核心结构,/L开头定义语言编号和扩展名,/Indent Strings和/Unindent Strings控制自动缩进,/Open Fold Strings和/Close Fold Strings控制折叠。你可以把这段贴进自己的.uew文件,或对照官方文件补齐。
/L20"Verilog" Line Comment = // Block Comment On = /* Block Comment Off = */ Escape Char = \ /Indent Strings = "begin" "case" "fork" "specify" "table" "config" /Unindent Strings = "end" "endcase" "join" "endspecify" "endtable" "endconfig" /Open Fold Strings = "module" "task" "function" "generate" "primitive" "begin" "case" "fork" "specify" "table" "config" "`ifdef" /Close Fold Strings = "endmodule" "endtask" "endfunction" "endgenerate" "endprimitive" "end" "endcase" "join" "endspecify" "endtable" "endconfig" "`endif" /Function String = "%[a-zA-Z_]*("/L20里的 20 是语言编号,只要不和已有语言冲突即可,官方 Verilog 文件通常用固定编号,你改的时候留意别覆盖别的语言。Line Comment = //让//之后的整行变注释色,Block Comment On/Off处理/* */。缩进和反缩进成对出现,begin进一层、end退一层,写 always 块时按回车会自动对齐。
3.2 关键字与折叠补充
关键字列表用/C1到/C8分颜色组,下面给一组常用分组,你可以按需增删:
/C1"Keywords" module endmodule input output inout wire reg parameter localparam /C2"Control" always initial assign if else case endcase for while repeat forever /C3"Timing" posedge negedge timescale delay /C4"System" $display $monitor $finish $stop $time $random /C5"Directives" `define `include `ifdef `else `endif `timescale/C1是普通关键字,/C2是控制流,/C3是时序相关,/C4是系统任务,/C5是编译指令。分组之后不同类别颜色不同,读代码时一眼能分清结构关键字和系统函数。折叠规则里把module/endmodule、begin/end、case/endcase、`ifdef/`endif都配成对,长文件就能按模块和条件编译块折叠。
3.3 挂载到 UltraEdit
打开 UltraEdit,进入「高级」→「配置」→「编辑器显示」→「语法着色」,在「语法文件」里指定你的.uew文件路径。或者直接把.uew放到 UltraEdit 安装目录的wordfiles文件夹下,重启后在语法着色列表里选 Verilog。挂载后打开一个.v文件,如果关键字变色、行号区出现折叠三角,说明生效了。
4. TaoToken 统一 Key 接入的配置骨架
4.1 settings.json 骨架
很多 AI 补全插件或外部工具用settings.json存配置。下面这个骨架把 base_url 指向 TaoToken 的 API 地址,api_key 填你创建的那把 Key,model 按需替换:
{ "ai": { "provider": "openai-compatible", "base_url": "https://taotoken.net/api", "api_key": "sk-你的TaoTokenKey", "model": "claude-sonnet-4-20250514", "max_tokens": 2048, "temperature": 0.2, "timeout": 60 }, "editor": { "language": "verilog", "trigger": "manual", "context_lines": 80 } }base_url只写到/api,不要在后面拼/v1/chat/completions,具体路径由客户端补全。temperature设低一点,代码补全要的是稳定而不是发散。context_lines控制把光标前多少行作为上下文发给模型,Verilog 模块通常几十行,80 行够用。
4.2 config.toml 骨架
如果你的工具用 TOML,等价配置如下:
[ai] provider = "openai-compatible" base_url = "https://taotoken.net/api" api_key = "sk-你的TaoTokenKey" model = "claude-sonnet-4-20250514" max_tokens = 2048 temperature = 0.2 [editor] language = "verilog" trigger = "manual" context_lines = 80两种格式选一种即可,关键是base_url和api_key两处别写错。Key 不要提交到公开仓库,本地配置文件加进.gitignore。
4.3 长期编码场景
如果你打算把 AI 补全长期挂在编辑器里,每天写 RTL 都调用,可以看 Coding Plan,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。它更适合高频、持续的编码调用,比按次临时配更省心。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,参数细节以文档为准。
5. 验证高亮与 API 连通性
5.1 验证高亮生效
新建一个test.v,写入下面内容:
`timescale 1ns/1ps module counter ( input wire clk, input wire rst_n, output reg [7:0] cnt ); always @(posedge clk or negedge rst_n) begin if (!rst_n) cnt <= 8'd0; else cnt <= cnt + 1'b1; end endmodule打开后检查三点:module、always、posedge是否变色;//注释是否变注释色;module/endmodule和begin/end左侧是否出现折叠标记。三点都满足,高亮和折叠就配好了。
5.2 验证 API 连通
先用 curl 直接打一次接口,确认 Key 和地址没问题:
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的TaoTokenKey" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "用一行 Verilog 写一个 8 位计数器自增语句"}], "max_tokens": 128 }'返回 JSON 里choices[0].message.content有内容,说明通道通。如果返回 401,检查 Key 是否复制完整;返回 404,检查 base_url 是否多写或少写了路径。也可以直接在模型对话页面 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 里发一句,能出结果就说明 Key 有效。
5.3 编辑器内触发补全
在test.v里把光标放到always块内新起一行,触发补全(具体快捷键看你的插件设置)。如果返回的是 Verilog 语句而不是乱码或报错,说明编辑器已经通过 TaoToken 拿到补全结果。第一次触发可能稍慢,因为要建立连接,后续会快一些。
6. 本篇常见错排查
高亮不生效,先看.uew文件里的/L编号是否和已有语言冲突,冲突会导致新语言不加载。再看文件扩展名是否在/L20"Verilog"后面正确关联,UltraEdit 靠扩展名匹配语言。如果只有部分关键字变色,检查/C1到/C5分组里有没有漏词,或者词之间是不是用了中文空格。
折叠点不开,多半是/Open Fold Strings和/Close Fold Strings不成对。比如只写了module没写endmodule,或者`ifdef配了`endif但中间有嵌套没处理。逐对核对即可。
API 返回 401,九成是 Key 复制时带了空格或换行,重新复制一次。返回 404,检查base_url是不是写成了https://taotoken.net/api/带尾斜杠,或者多拼了/v1。返回超时,把timeout从 60 调大,或检查本地网络是否能访问该地址。模型名报错,说明model字段填了不存在的名字,去模型对话页面确认可用模型名再填。
配置改完不生效,记得重启编辑器或重新加载配置。有些工具会缓存配置,改完settings.json要完全退出再打开。Key 泄露到公开仓库的话,立刻去控制台吊销重建,地址还是 https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。
最后一个小经验:Verilog 的`define宏在补全时容易被模型当成普通文本,如果你发现补全结果里宏没展开,可以在context_lines里多带几行宏定义,或者把常用宏写进系统提示词。高亮和补全这两件事分开调,先保证高亮稳定,再调 API,出问题时更容易定位是哪一层的事。