1. ModelSim 装完之后为什么你的第一个 Verilog 仿真跑不起来很多人装完 ModelSim 的第一反应是打开图形界面新建工程写个and门点编译然后卡在vsim报错上。问题往往不在代码而在环境没配好库没建、LM_LICENSE_FILE没指对、工作目录里没有work库、testbench 里timescale和initial块写反了顺序。这篇就按「装完 ModelSim 之后怎么把 Verilog 仿真真正跑通」来写面向 FPGA/IC 初学者也顺带把 AI 辅助写 testbench 时统一 Key 的接入方式讲清楚。ModelSim 是 Mentor现 Siemens EDA的 HDL 仿真器能对 Verilog/VHDL 做编译、 elaboration、仿真和波形查看。它适合谁适合刚学数字电路、要交实验报告、要验证自己写的计数器/状态机/FSM 的人。你不需要先懂 UVM也不需要先买开发板只要能把vlog、vsim、add wave、run这几条命令串起来就能看到波形。我试过在 Windows 上把 ModelSim 装到非默认盘结果vsim找不到 license折腾半小时才发现是环境变量只加在了用户变量里、系统变量没同步。下面把安装后的基础配置、工程库映射、TaoToken 统一 Key 的settings.json骨架、以及编译—仿真—波形验证的完整动作拆开讲。2. TaoToken 前置统一 Key 在 AI 辅助写 testbench 里的位置写 Verilog 的 testbench 最烦的是重复劳动时钟生成、复位序列、激励向量、$monitor打印。现在可以用 AI 辅助生成骨架但如果你同时用多个模型/工具Key 管理会乱。TaoToken 的做法是给一个统一 Key在兼容 OpenAI 风格的客户端里填base_url和api_key就能调模型对话。官网入口在这里https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 这个不加 UTM。注意TaoToken 是模型调用入口不是编辑器替代品ModelSim 该装还得装它只负责帮你生成/补全 testbench 文本。你需要先拿到 Key。进控制台创建https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 然后在 API Keys 页面生成https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。生成后复制那串sk-开头的字符串后面写进settings.json。如果你只是想让 AI 帮你解释一段 Verilog 或生成一个简单 testbench用模型对话页就够https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。如果你长期做编码、要接 Agent 或 Coding Plan走这个https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。接入文档在https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。注意Key 只存在你本地配置文件里不要贴到公开仓库。ModelSim 的 license 和 TaoToken 的 Key 是两回事前者管仿真器授权后者管模型调用。3. 可复制配置ModelSim 环境变量与工程库映射3.1 环境变量配置装完 ModelSim 后先确认安装目录假设是C:\modeltech64_10.7\win64。右键「此电脑」→ 属性 → 高级系统设置 → 环境变量。新建用户变量和系统变量各一份变量名变量值作用LM_LICENSE_FILEC:\modeltech64_10.7\win64\license.dat指向 license 文件PATH追加 C:\modeltech64_10.7\win64让命令行能直接调 vlog/vsim配置完开一个新的 cmd 窗口输入vlog -version vsim -version能打印版本号就说明 PATH 生效。如果提示「不是内部或外部命令」说明 PATH 没加对或者你开的是旧窗口。3.2 工程库映射ModelSim 默认有一个work库但工程大了要分库。在工程根目录建一个modelsim.ini或者直接用命令行建库vlib work vmap work workvlib建物理目录vmap把逻辑库名映射到物理目录。如果你有多个模块要分库比如rtl和tbvlib rtl_lib vlib tb_lib vmap rtl_lib rtl_lib vmap tb_lib tb_lib编译时指定库vlog -work rtl_lib ./rtl/counter.v vlog -work tb_lib ./tb/counter_tb.v这样仿真时vsim tb_lib.counter_tb就能找到顶层。3.3 TaoToken 统一 Key 的 settings.json 骨架如果你用支持 OpenAI 兼容接口的客户端或插件来辅助写 testbench配置文件骨架如下。把sk-你的Key换成 API Keys 页面生成的那串{ provider: openai-compatible, base_url: https://taotoken.net/api, api_key: sk-你的Key, model: 你选用的模型名, temperature: 0.2, max_tokens: 2048, timeout: 60 }temperature设低一点生成 Verilog 时更稳定不容易出现语法漂移。max_tokens按 testbench 长度调一般 2048 够一个模块级 tb。这个文件放在你的工程目录或客户端配置目录不要提交到 git。4. 验证请求编译—仿真—波形验证的具体动作4.1 写一个最小可仿真模块新建counter.vmodule counter ( input wire clk, input wire rst_n, output reg [3:0] cnt ); always (posedge clk or negedge rst_n) begin if (!rst_n) cnt 4d0; else cnt cnt 1b1; end endmodule4.2 写 testbench新建counter_tb.vtimescale 1ns/1ps module counter_tb; reg clk; reg rst_n; wire [3:0] cnt; counter u_counter ( .clk (clk), .rst_n (rst_n), .cnt (cnt) ); initial begin clk 1b0; rst_n 1b0; #20 rst_n 1b1; #200 $stop; end always #5 clk ~clk; initial begin $monitor(time%0t cnt%d, $time, cnt); end endmoduletimescale必须在最前面initial和always的顺序不影响但$stop要留够时间。4.3 命令行编译与仿真在工程目录开 cmdvlib work vmap work work vlog counter.v vlog counter_tb.v vsim -c -do run -all; quit work.counter_tb-c是命令行模式-do里执行run -all跑完所有激励。你会看到$monitor打印的 cnt 从 0 递增到 15 再回绕。如果要看波形用图形模式vsim work.counter_tb然后在 ModelSim 的 transcript 里输入add wave -r /* run 200ns波形窗口会显示 clk、rst_n、cnt。add wave -r /*是递归加所有信号初学阶段最省事。4.4 用 TaoToken 辅助生成 testbench 的验证把counter.v的模块声明贴到模型对话里让它生成一个带$monitor和$stop的 tb。生成后你手动检查三点timescale有没有、端口名有没有拼错、$stop时间够不够。确认后保存成counter_tb.v再走上面的vlog/vsim流程。这样 AI 负责骨架你负责语法和时序正确性。5. 本篇常见错排查5.1 vlog 报 Module xxx not found原因通常是编译顺序不对或者库映射错了。先vlog counter.v再vlog counter_tb.v因为 tb 例化了 counter。如果你用了-work分库确认vsim时顶层库名写对。5.2 vsim 报 License error检查LM_LICENSE_FILE是否指向正确的 license 文件用户变量和系统变量都要有。改完环境变量必须重开 cmd。如果 license 文件路径有空格用引号包起来。5.3 波形里 cnt 一直是 xrst_n没给初值或者initial块里复位释放太早。把#20 rst_n 1b1;改成#50试试。另外确认clk的always #5有没有写没有时钟计数器不会动。5.4 $monitor 不打印$monitor只在信号变化时触发一次如果所有信号一开始就是稳定值可能只打印一行。加$display在initial里手动打印或者用$monitor配合$timeformat。5.5 TaoToken 请求返回 401Key 复制错了或者base_url写成了带 UTM 的地址。API 地址就是https://taotoken.net/api不要加多余路径。如果还不行去 API Keys 页面重新生成一个旧的可能被删了。6. 把仿真跑通之后下一步怎么接ModelSim 的基础动作就这几条vlib、vmap、vlog、vsim、add wave、run。你把这套跑顺了后面学 FSM、FIFO、SPI 都是同样的流程。AI 辅助写 tb 能省时间但别让它替你检查时序波形要自己看。如果你在接入 TaoToken 时遇到settings.json格式问题或者vsim报库找不到先去接入文档对一遍参数https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。需要生成新 Key 就去 API Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。长期做编码和 Agent 的Coding Plan 在https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。最后留一个实用习惯每次新建工程先写一个run.do脚本把vlib、vlog、vsim、add wave、run全写进去下次直接vsim -do run.do省得重复敲命令。
