1. 安路TangDynasty与Modelsim联合仿真入门指南第一次接触FPGA仿真的时候我完全被各种专业术语搞晕了。直到用上安路TangDynasty简称TD和Modelsim这对黄金组合才发现原来仿真可以这么简单。今天我就把自己踩过的坑和总结的经验用最直白的方式分享给大家。简单来说TD负责把我们的设计代码翻译成仿真模型Modelsim则是个专业的波形显示器。就像看电影需要先把胶片放进放映机一样我们需要先把TD生成的模型导入Modelsim才能看到电路运行的波形。这个过程听起来复杂其实跟着步骤操作半小时就能搞定第一个仿真。适合阅读本文的三种人刚接触安路FPGA的新手工程师正在学习数字电路仿真的在校学生需要快速上手TDModelsim工作流的项目组成员2. TD软件生成仿真模型全流程2.1 关键参数设置技巧在TD软件里打开工程后别急着点运行这几个参数设置错了会导致后续仿真全乱套。我去年有个项目就因为漏掉一个选项结果多花了三天查问题。找到Process → Properties菜单这里藏着仿真最重要的五个开关RTL仿真开关就像给代码拍照存档打开后会把RTL级代码保存为仿真模型rtl_sim_model ON门级仿真开关这个相当于把代码翻译成逻辑门电路gate_sim_model ON物理仿真开关考虑实际布线延迟的高级模式phy_sim_model ON时序标注开关相当于给电路加上时间标签set sdf ON库路径设置建议新建一个sim_lib文件夹专门存放仿真文件特别提醒每次修改参数后一定要点保存我有次忘记保存直接跑仿真结果用的是昨天的旧参数波形完全对不上。2.2 创建仿真测试文件测试文件就像是给电路设计的考卷我们需要用它来验证电路功能是否正确。在TD中创建测试文件的正确姿势在Hierarchy窗口右键 → New Source文件类型选择Verilog Test Bench命名建议用tb_模块名的格式比如tb_uart存放路径最好和设计文件分开我习惯建个testbench文件夹新手常犯的错误是把测试文件和设计文件混在一起后期维护时会非常头疼。建议从一开始就建立清晰的目录结构。2.3 生成仿真脚本文件点击Tools → Simulation后TD会自动生成几个关键文件.do文件Modelsim的菜谱告诉它怎么做仿真.v文件经过处理的仿真模型.sdf文件包含时序信息的说明书第一次操作时我被这些文件搞得晕头转向后来发现其实只需要关注两个地方生成的do文件路径一般在工程根目录仿真模型文件大小正常应该有几百KB如果只有几KB说明生成失败了3. Modelsim环境配置详解3.1 建立仿真库的注意事项Modelsim就像个图书馆我们需要先给安路的仿真模型准备专属书架。具体步骤在Modelsim安装目录下新建anlogic文件夹路径不要有中文里面再建个子文件夹存放模型文件比如TD_model_source从TD安装目录的sim_release文件夹复制对应器件型号的文件这里有个血泪教训不同型号FPGA的仿真模型不能混用EF2和EF3的模型文件差别很大一定要确认自己用的芯片型号。我有次不小心用了EF2的模型仿真EF3设计结果波形全是乱码。3.2 编译仿真模型实战打开Modelsim后跟着这些步骤操作File → New → Library 新建库建议命名TD_model_verCompile → Compile 选择刚建的库文件类型选All Files找到刚才复制的.v文件勾选Compile selected files together点击Compile按钮编译过程中最容易出现的两个问题文件权限不足建议关闭杀毒软件再试编码格式错误用Notepad检查文件是否是UTF-8编码4. 联合仿真与波形调试技巧4.1 新建仿真工程要点在Modelsim中新建工程时这几个选项要特别注意工程路径最好和TD工程在同一个盘符添加文件先加设计文件再加测试文件库映射要把之前编译的TD_model_ver库加进来我习惯用这样的文件加载顺序顶层设计文件如uart_top.v子模块文件如uart_tx.v测试文件tb_uart.v全局定义文件如果有4.2 运行仿真的正确姿势点击Simulate → Start Simulation后这几个选项决定成败在work库选择测试模块如tb_uart务必取消勾选Enable optimization在Libraries标签添加TD_model_ver库SDF标签下添加时序文件如果有第一次跑仿真建议先设个短时间比如100ns确认没问题再跑完整仿真。我有次直接设了1ms结果等到下班还没跑完。4.3 波形调试实用技巧看到波形窗口别急着关这几个功能超级实用测量工具右键点两个时钟边沿可以看频率分组显示把相关信号拖到一起更方便观察颜色设置给关键信号设醒目颜色如红色时钟保存格式用.wlf格式保存可以下次直接打开遇到信号显示XX怎么办通常是这些原因测试文件里没给输入信号赋初值模块例化时信号名接反了时钟复位信号没正确连接5. 常见错误排查手册5.1 编译错误解决方案问题现象编译时报glbl模块未定义解决方法在测试文件开头添加include glbl.v深层原因安路器件需要这个全局控制模块问题现象提示语法错误near initial检查要点测试文件的timescale是否正确定义是否漏写endmodule中文标点符号混入特别是引号和分号5.2 加载错误处理方案问题现象Load design error排查步骤检查所有模块是否都编译成功确认测试文件顶层模块名是否正确重新编译整个工程问题现象波形全红无变化可能原因时钟信号没接对复位信号一直有效测试文件激励没产生有个快速验证方法在测试文件里加个 $display 语句运行仿真时看Transcript窗口是否有输出。如果没有说明仿真根本没跑起来。6. 仿真效率提升秘籍6.1 自动化脚本编写手动点来点去太浪费时间我后来改用脚本一键仿真。新建一个run.do文件内容类似这样vlib work vlog ../src/*.v vlog ../testbench/tb_uart.v vsim -L TD_model_ver work.tb_uart add wave * run 1ms然后在Modelsim命令行执行do run.do就能自动完成全套流程。对于需要反复仿真的项目这个技巧能节省大量时间。6.2 波形保存与比较重要项目的波形一定要存档我推荐两种方式WLF格式完整保存所有波形数据可以用Modelsim直接打开图片格式用File → Export功能存为PNG方便写报告比较不同版本波形时可以用Tools → Waveform Compare功能。上周我就用这个功能发现了一个隐蔽的时序问题两个版本代码在1.2ms时输出出现了微妙差异。6.3 性能优化建议当仿真速度变慢时可以尝试这些方法减少打印信息比如注释掉 $display关闭波形记录add wave */level 只记录顶层信号使用更快的电脑仿真对单核性能敏感分模块仿真先单独验证关键模块记得有次仿真一个复杂设计原本要跑2小时。通过优化测试用例和关闭非关键信号记录最终只用了20分钟就完成了验证。