ARTICLE DETAIL

资讯详情

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

高云FPGA与ModelSim联合仿真完整教程:从环境搭建到时序仿真

高云FPGA与ModelSim联合仿真完整教程:从环境搭建到时序仿真 做FPGA的人应该都有体会仿真环境搭好了项目进度就顺了一半。高云FPGA这几年在国产化替代里用得越来越多但很多从Xilinx或Intel切过来的工程师第一次碰GowinSUN软件时最头疼的不是写代码而是怎么把手头的Modelsim跟它无缝配合起来。网上关于高云的教程本来就不多联合仿真这一块更是零散要么只讲了功能仿真要么时序仿真压根没提。这篇就把我实际搭环境的完整过程拆开揉碎讲一遍从软件选型到库编译从功能仿真到门级时序仿真再到各种报错的排查思路争取让新手少走弯路。先明确一个概念高云云源软件GowinSUN本身不带独立的仿真器它依赖第三方仿真工具做验证Modelsim就是最常用的选择之一。联合仿真的本质就是把高云综合出来的网表文件、仿真库模型交给Modelsim去跑。理解了这一点后面所有配置都不会糊涂。1. 联合仿真的整体思路与方案选型1.1 为什么偏偏要用Modelsim很多刚开始接触高云FPGA的人会问GowinSUN里不是有仿真按钮吗直接点不行吗答案是能点但它调用的其实是外部仿真器的接口。默认情况下GowinSUN支持的仿真器有Modelsim、QuestaSim、Veriect等其中Modelsim因为普及率高、破解资源丰富、上手门槛低成了绝大多数团队的首选。我自己试过QuestaSim功能上没问题但公司里同事的电脑上基本都是Modelsim SE或DE版本统一工具链能省掉很多协作上的麻烦。而且高云官方文档里的教程和脚本大部分默认就是针对Modelsim写的你跟着走最不容易踩坑。如果你们公司已经买了Verdi或VCS的license那也可以用但配置复杂度会高一些不适合作为通用的入门方案。1.2 联合仿真的两种模式功能仿真与时序仿真这里必须先把概念分清楚因为后面每一步操作都和它相关。功能仿真也叫行为仿真或RTL仿真只验证逻辑功能对不对不考虑门延迟和布线延迟。它跑的是你写的Verilog或VHDL源代码速度快适合调试算法和状态机。时序仿真则是把设计综合、布局布线之后产生的网表和延迟信息拿回来仿真这时候信号的变化会带上真实的延迟参数能发现竞争冒险、时序违例这类功能仿真看不到的问题。高云在生成时序仿真模型时会输出一个带SDFStandard Delay Format标注的网表文件Modelsim需要把这个SDF文件反标注进去才能模拟真实时序。两者的环境配置差别很大后面我会分别讲清楚。很多教程只讲功能仿真这是不够的因为FPGA项目里真正让人头疼的问题往往要到时序仿真阶段才暴露出来。1.3 软件版本的匹配问题别在这上面浪费时间高云的GowinSUN不同版本对Modelsim版本的支持是有差异的。官方手册里会列出兼容性表格但实际操作中我发现没必要卡得那么死。我一直在用的是GowinSUN 1.9.8或1.9.9版本搭配Modelsim SE 10.6d或2020.4跑了好几个项目都没出过兼容性问题。比较坑的一点是高云的低版本软件比如1.9.7以前的在编译仿真库时对Modelsim 2020.4的一些新特性支持不好编译VHDL库的时候可能报奇怪的语法错误。如果你用的是老版本软件建议装Modelsim SE 10.6d这个组合最成熟。反过来说如果你非要用最新的Modelsim 2022.2那最好把GowinSUN也升到最新版否则仿真库编译极易出问题。一句话总结版本匹配的优先级是GowinSUN老版本优先配Modelsim 10.6GowinSUN新版本可以尝试Modelsim 2020.4以上。别一味追求新版。2. 环境准备与软件安装的细节坑2.1 高云GowinSUN安装时的关键选项GowinSUN的安装本身比较简单Windows版一路Next就行Linux版需要注意权限问题和依赖库。但有一个选项很多人会忽略在安装过程中软件会询问是否安装仿真库和编程器驱动。这里的仿真库一定不能跳过它就是联合仿真时Modelsim需要的基础库来源。安装完成后建议先打开GowinSUN随便建一个空工程确认软件能正常启动、License能被识别。高云的License有两种一种是USB加密狗的一种是License文件的前者插上就能用后者需要在环境变量里配置。具体配置方式在软件安装目录的doc文件夹下有说明找到对应版本的License使用指南照着把环境变量设置好就行。这里有个容易踩的坑如果你之前装过其他FPGA厂商的软件环境变量里可能残留相关路径偶尔会影响GowinSUN的工具链识别尤其是PATH变量里的内容太乱时。建议安装前把不必要的FPGA相关的PATH路径清理干净。2.2 Modelsim安装的注意事项与License问题Modelsim的安装有个大前提安装路径不要有中文和空格。这不是强迫症是真实教训。ModelSim对中文路径的支持一直是老毛病仿真库编译时路径里一旦出现中文各种莫名其妙的报错就会冒出来而且报错信息往往和真正的原因对不上排查起来极其浪费时间。安装完成后License配置是另一个大坑。现在用的比较多的Modelsim版本License机制有FlexLM的也有直接本地License文件的。不管哪种核心就两点环境变量里要指定License文件位置软件启动时要能找到对应的服务或者文件。配置好之后打开Modelsim在Help菜单下看About确认License状态是Available这一步别省确认不了就坚决不进入下一步。同样Modelsim安装目录也建议保持默认或者纯英文路径。我见过有人把Modelsim装在D盘的“工具软件”目录下仿真跑起来一会报错一会崩溃最后把软件挪到D:/modelsim目录后问题全部消失就这一个改动救了他整整一天。2.3 Linux环境下的安装差异如果你的开发环境是LinuxGowinSUN和ModelsimLinux版的安装会比Windows稍微麻烦一些。首先是Modelsim Linux版的License一般通过指定license.dat文件路径来激活还需要确认系统里有lsb_release命令否则安装脚本会中途报错。GowinSUN Linux版还需要安装一些依赖库比如libncurses5、libxft2等具体依赖列表在软件目录的README文件里。另外Linux下用Modelsim跑仿真建议直接在终端里调用vsim、vlog、vlib这些命令配合do脚本执行效率比开GUI高很多。GUI模式下字体渲染容易出问题看起来字体很模糊这不是系统bug是X11字体配置的问题不影响功能但影响心情。3. 仿真库编译联合仿真的核心步骤3.1 高云仿真库的结构与原理高云FPGA的GowinSUN在安装目录下会自带一个名为simlib的文件夹里面就是联合仿真所需的库文件。打开这个文件夹你会看到按芯片型号分类的子目录比如gw1n、gw1nsr、gw2a等每个目录下又分成了primitive基本单元、ipIP核模型等更细的分类。这些库文件是怎么用的呢我们可以类比一下你要在Modelsim里编译一个设计但这个设计里的门电路、寄存器、PLL这些基本元件并不是你写的而是高云芯片内部真实存在的物理结构。要仿真它们的行为Modelsim就必须认识这些元件所以要把高云提供的元件模型编译成Modelsim能识别的库格式。这就好比你跟一个外国人说中文他听不懂你先把中文翻译成英语后面沟通就顺畅了。3.2 Windows下仿真库编译的具体操作高云GowinSUN提供了一键编译的脚本不用自己手动敲命令这是比较省心的地方。在软件安装目录下找到simlib文件夹里面会有一个批处理文件或者说明文档指导你如何调用GowinSUN自带的gwsim_dll或者Modelsim编译命令来生成仿真库。实际操作用GUI方式更直观打开Modelsim在菜单栏选择File Change Directory切到simlib目录下。然后在Transcript窗口里执行vlib命令创建库再用vlog或vcom把高云提供的源文件编译进库里。这里必须强调一个细节高云的仿真库文件里Verilog文件用vlog编译VHDL文件用vcom编译千万别混。我见过有人直接vlog编译所有文件结果VHDL的库文件报了一堆错还以为是库本身有问题其实是编译器选错了。编译完成后你会得到一个名为work的库或者根据脚本命名为gowin_sim的库。这个库就是后面仿真工程的“地基”。3.3 Linux下仿真库编译的脚本方式Linux环境下高云通常会提供一个shell脚本完成库编译比如simlib文件夹下可能有一个名为compile_simlib.sh的脚本。编辑这个脚本把Modelsim的安装路径、仿真库输出目录改成你本机的实际路径然后直接运行。脚本跑完后去输出目录检查一下确保生成了相应的库文件夹。如果脚本报错优先检查路径中有没有中文或空格其次是检查你指定的Modelsim版本号是否和脚本里写的一致。版本号不匹配是最常见的报错原因脚本里写的是10.6你装的是2020.4编译命令的参数就可能对不上。这里再提醒一下如果用的是VHDL设计编译库时务必确认高云库里VHDL文件里有没有用到一些老的VHDL语法Modelsim新版本有时候会把这些语法当成错误处理这时候要么降低Modelsim版本要么在编译时加兼容性参数。3.4 库编译完成后怎么验证库编译完不能直接开干先花两分钟验证一下库能不能正常使用。最简单的验证方式在Modelsim里新建一个空工程把之前编译出来的库添加进去然后随便写一个极其简单的测试模块比如一个与门逻辑实例化高云的一个基本门单元跑一下仿真看看能不能出正确的波形。如果这一步能顺利出波形说明库没问题后面就可以放心用了。如果这一步都过不了趁早排查别等到整个工程编译完再回头查库。4. 功能仿真完整实操流程4.1 在GowinSUN中设置仿真工具打开GowinSUN加载你需要仿真的工程然后在菜单栏找到仿真相关的设置项。一般路径是Tools Options EDA Tools或者Project Configuration在其中找到Simulation Tool的下拉框选择Modelsim并指定Modelsim的安装路径指到Modelsim的根目录比如D:/modelsim。有些版本还会要求指定Modelsim的bin目录路径这个也一并填上。设置完成后GowinSUN才能在你点击仿真按钮时自动调用Modelsim的可执行程序。这一步做完之后还需要在工程设置里指定仿真顶层模块和仿真时间。仿真时间可以先用默认值比如1000ns不够再改。顶层模块则要选你的测试文件testbench所在的模块不是你的设计顶层很多人第一次容易选反导致GowinSUN报“找不到仿真顶层”之类的错误。4.2 编写testbench的注意事项测试文件的编写是整个功能仿真里最有技术含量的环节。虽然功能仿真的testbench写法跟其他FPGA平台大同小异但高云有几个需要特别关注的地方。第一时钟初始化和复位信号的设计要符合高云器件的上电时序要求。高云FPGA上电后有一个配置时间你的testbench里复位信号的拉高时间最好模拟这个配置时间而不是上电瞬间就释放复位。虽然功能仿真中不模拟这个时序也能跑但真实项目中如果复位释放太早可能出现寄存器初始状态不确定的问题。第二仿真时间尺度定义不要拍脑袋写。timescale 1ns/1ps这种写法比较常用精度设置得越高仿真速度越慢但波形精度更高。如果只是验证功能用1ns/1ns就够了跑长仿真时速度优势很明显。第三testbench里尽量少用阻塞赋值。虽然testbench是为了仿真写的代码风格不如RTL那么严格但初始化和时钟产生这两个块规范写法依然建议用非阻塞赋值或者initial块里用#延迟搭配赋值避免仿真出现意外竞争。4.3 从GowinSUN一键启动Modelsim仿真设置都完成后在GowinSUN的工具栏找到仿真图标一般是个绿色三角形点击后GowinSUN会自动生成一个仿真脚本并调用Modelsim打开工程。这个过程里Modelsim会自动编译设计文件和testbench并加载仿真库。如果你前面库编译配置正确点完按钮后应该能在Modelsim的Transcript窗口看到编译成功的提示然后自动弹出仿真波形窗口。此时在波形窗口里添加你需要观察的信号点运行按钮就能看到功能仿真波形。这个流程看起来简单但有个核心细节值得注意GowinSUN一键启动时默认会在工程目录下创建一个仿真相关的临时文件夹里面放着自动生成的do脚本和编译列表。如果后续你手动改了设计文件需要重新点仿真按钮或者手动在Modelsim里执行重新编译两者不要混淆。4.4 功能仿真与RTL代码调试的配合技巧功能仿真最大的价值是可以快速定位RTL逻辑错误。我习惯在testbench里把关键状态机的状态编码用$display打印到Transcript窗口每一步状态跳变都输出一行日志。这样做虽然仿真速度会慢一点但排查问题的时候直接看日志比盯着波形猜效率高得多。另外建议在testbench里加上简单的自检断言用$error或者$fatal在关键逻辑出错时立刻停止仿真并报错。比如你写了一个FIFO可以在testbench里监控读指针和写指针的差值一旦差值越界立刻报错这样仿真跑到哪一步出的问题一目了然不用手动拉着波形找。5. 时序仿真真正贴近真实硬件的一步5.1 高云布局布线后的仿真文件生成功能仿真通过后接下来就是时序仿真。在GowinSUN里完整的流程是综合 → 布局布线 → 生成仿真模型。点击布局布线完成后在软件菜单里找到生成仿真模型或者Generating Simulation Model的选项GowinSUN会自动输出两个关键文件一个是网表文件通常是.v或.vhd格式另一个是SDF时序标注文件.sdf格式。这两个文件的位置一般在工程目录下的impl或impl目录下的某个子文件夹里。不同版本路径有差异建议生成完之后用文件夹搜索功能找一下“.sdf”后缀的文件确认是否生成成功。这里要特别注意一定要在布局布线全部跑完后再生成仿真模型。如果只是综合完就生成网表里没有布局布线的延迟信息那得到的仍然是功能仿真级别的东西。5.2 在Modelsim中做门级时序仿真的步骤拿到网表文件和SDF文件后回到Modelsim。这时你不能直接用之前的testbench跑因为网表文件的接口定义和RTL顶层是一样的但内部结构完全不同之前的RTL库不再需要要改成加载高云的仿真库。具体操作先新建一个仿真库把网表文件编译进去再编译testbench。然后打开Simulate界面在加载设计时SDF选项里添加刚才生成的SDF文件指定它作用到网表顶层实例上。这一步很关键如果SDF没加载成功时序仿真就退化成功能仿真延迟信息完全没有。加载完成后运行仿真你会看到波形里信号的变化明显比功能仿真“毛糙”很多信号边沿有延迟信号之间有先后错动这是正常现象。如果此时看到信号出现短暂的毛刺或竞争冒险现象恭喜你时序仿真的价值体现出来了这往往是电路在某些边界条件下可能出现的问题点。5.3 时序仿真不通过的常见原因时序仿真结果和功能仿真不一样它更严格。最常见的失败现象是仿真跑着跑着信号变成X态或Z态。出现这种情况首先检查testbench里对异步复位的处理时序仿真中异步复位的释放时间如果和时钟沿太接近系统会进入亚稳态表现出来就是X态。还有一种常见情况是SDF文件版本和网表不匹配。高云生成的SDF文件里有版本标识如果你的时序仿真环境里Modelsim解析SDF时报告版本不兼容多半是使用了不是高云生成的SDF文件或者是文件路径引用错误。解决办法很简单重新在GowinSUN里生成一次仿真模型确保使用最新的SDF。我自己测试时还遇到过一个问题仿真速度特别慢。原因是网表文件非常大包含了成千上万个基本门单元而testbench里又定义了一个特别长的仿真时间。解决方法是把仿真时间缩短到刚好覆盖关键信号的翻转或者把无关信号的波形显示关掉只保留需要观察的信号。5.4 高云IP核的仿真注意事项如果你的设计里用到了高云的IP核比如PLL、RAM、FIFO这些功能仿真和时序仿真的配置会有些不同。功能仿真阶段IP核跑的是高云提供的行为模型这些模型已经包含在仿真库中只要库编译正确就能直接仿真。但时序仿真阶段IP核会展开成底层的门级网表SDF文件也会包含这些IP核的延迟信息。此时有一个容易漏掉的操作在Modelsim里添加SDF文件时要确保它作用到的实例路径覆盖到IP核对应的实例层级。最简单的方法是加载SDF时指定到网表顶层然后使用SDF的region语法或者直接参照高云生成的do脚本中的方法。如果SDF加载不完整IP核部分没有反标注时序仿真结果会严重失真你会在波形上看到PLL输出频率看起来毫无规律——这就是延迟信息缺失带来的错觉。6. 常见报错与排查技巧实录6.1 License相关的报错联合仿真环境里License是遇到最多问题的环节。Modelsim启动时报“License check failure”或“Unable to checkout a license”先别急着重新装软件按下面顺序排查环境变量里的LM_LICENSE_FILE或MGLS_LICENSE_FILE是否指向了正确的license文件。路径是绝对路径吗文件名对不对License文件里的hostname和MAC地址是否跟本机一致如果是浮动License服务器能不能ping通27000端口是否正常监听。这里提醒一句不少人用的是破解版License破解文件里的hostname和MAC往往是固定写法如果你的网卡是两个比如有线加无线Modelsim可能会选到那个不被License认可的网卡导致明明License文件没问题却一直报错。解决方法是暂时禁用其他网卡或者用License文件里推荐的指定网卡方式。高云GowinSUN自带的License也有类似情况。如果GowinSUN可以正常打开但Modelsim调不起来先确认GowinSUN的License和小Modesim的License是不是两套独立的东西不要混用。6.2 编译错误乱码、找不到模块、库文件冲突编译阶段报错大多集中在三种情况。第一种是编译源文件时提示“cannot open ...”这种基本都是路径问题路径里有中文或空格或者文件名写错了。解决方法是把整个工程路径全部改成英文小写不要用大写开头的目录名尽量避免大小写敏感的文件系统带来的额外坑。第二种是“module not found”这通常是库文件没有添加完整或者编译顺序不对。Modelsim在编译时是按你添加文件的顺序依次编译的如果顶层模块在底层模块之前编译就会找不到底层模块。解决方法是先编译底层模块再编译顶层模块。如果嫌手动调整顺序麻烦可以用高云生成的do脚本它已经排好了顺序。第三种是库文件冲突常见于一个工程里同时添加了多个版本的仿真库比如把高云不同系列的库全加进去。解决办法是只添加你当前芯片型号对应的库其他系列的先移除需要时再加。6.3 运行仿真时的波形异常仿真能启动但波形上看不到信号或者信号全是红色/高阻态这是仿真中非常经典的报错现象。红线或者无波形意思是信号没有被驱动。排查思路先检查testbench里是否把信号接到了设计模块的端口上连接名是否完全一致大小写是否匹配Modelsim对端口名是大小写敏感的。其次检查仿真时是否把testbench设为顶层如果顶层选成了设计模块testbench里的激励就根本没被执行。还有一种情形是库编译不完整设计模块内部实例化高云基本门单元时Modelsim找不到对应的门单元模型它会默默把信号置为未驱动状态。这算是最阴间的一种故障因为编译不报错仿真也能跑但波形就是不对。碰到这种情况回仿真库编译那一步检查库文件里是否包含了所有primitive文件。6.4 时序仿真中的SDF反标注问题时序仿真里SDF反标注失败会出现两种情况一是在Transcript窗口里看到“Failed to annotate SDF”这类报错二是没有任何报错但结果看起来像功能仿真毫无延迟信息。第一种情况检查SDF文件路径是否正确SDF文件是工程当前版本生成的是否在布局布线后又重新生成了仿真模型。另外检查加载SDF时指定的实例路径是否正确这个路径应该跟你在Modelsim里看到的顶层实例名一致通常格式是tb_name/dut_name这样的层级路径。第二种情况Silently的失败最坑。我遇到过一次后来发现原因是SDF文件里使用的延时单位和仿真时间精度设置不符Modelsim默认不报错直接忽略。解决方法是把该精度设置的延时精度改高比如用timescale 1ps/1ps保证SDF里最小延时单位能被表示出来。6.5 仿真速度过慢的优化方案时序仿真一跑就是几十分钟很常见但不代表没有优化空间。几个经验第一仿真的时间范围控制在关键事务发生的区间不要让仿真器空跑大段时间。第二在Modelsim里把不需要观察的信号从波形窗口删除信号的记录会占用大量内存和CPU资源。第三如果设计中有比较大的存储块比如RAM仿真初始化时可以用高云提供的内存初始化文件避免逐周期写入初始数据。第四在Testbench中减少使用$display这样的事务级打印每条打印都会拖慢仿真速度。如果以上都优化完还是慢得离谱检查一下设计里是否还有不必要的层次被仿真了。如果只是验证某一块逻辑可以单独把这一块逻辑提取出来挂上最简单的时钟复位激励仿真不跑完整芯片的网表。7. 自动化仿真脚本的进阶玩法7.1 用do脚本替代GUI操作当环境稳定下来之后每次打开Modelsim再手动点编译、仿真、加波形这一套操作其实挺浪费时间的。更高效的做法是写一个do脚本把整个流程固化下来。一个典型的do脚本结构包括创建一个新的仿真库映射库名到物理路径编译设计文件和testbench启动仿真加载SDF如果是时序仿真然后添加需要观察的信号最后运行指定时间。写成do脚本的好处一是可复现性强换台电脑也能用同一个脚本跑出一样的结果二是方便集成到版本管理里代码评审时同事能看到仿真环境的变化三是方便在命令行模式下批量跑回归。7.2 do脚本模板与注释我贴一个我常用的功能仿真脚本模板基本注释都写在里面了# 清除旧的仿真库 if {[file exists work]} { vdel -all } # 新建work库映射到当前目录下的work文件夹 vlib work vmap work work # 编译高云仿真库路径要根据实际情况改 # vlib gowin_sim # vmap gowin_sim D:/gowin/simlib/gw1n # vlog -work gowin_sim D:/gowin/simlib/gw1n/*.v # 编译设计文件 vlog -work work ../rtl/led_ctrl.v # 编译testbench vlog -work work ../tb/tb_led_ctrl.v # 启动仿真指定顶层 vsim -voptargsacc work.tb_led_ctrl # 添加需要观察的信号 add wave -hex /tb_led_ctrl/dut/* add wave -hex /tb_led_ctrl/clk add wave -hex /tb_led_ctrl/rst_n # 运行仿真时长 run 100us使用时把路径改成你本机实际的相对路径或绝对路径在Modelsim的Transcript里执行do sim.do就能一键跑完整个流程。注意脚本里的路径尽量用相对路径这样工程拷给别人时不用改脚本也能用。7.3 回归测试的批量启动方式项目做大了不可能只跑一个仿真用例。这时候可以把多个testbench放在同一个工程下写一个批处理脚本循环调用Modelsim的批处理模式逐个跑完并收集结果。在Windows下可以是bat脚本在Linux下是sh脚本核心思路都是对每个testbench执行一遍“编译 仿真 检查结果”的流程。Modelsim批处理模式启动仿真的命令是vsim -c -do run -all; quit-c表示命令行模式不启动GUI速度更快。在跑回归时遇到仿真失败的情况脚本里可以判断仿真日志里有没有“Error”关键字有则记录失败用例名称最后汇总输出。这套方案我已经用在实际项目中几十个用例跑下来基本不用人盯着出问题直接看结果汇总就行。8. 实战经验与避坑总结联合仿真环境从零搭到跑通对于第一次接触高云FPGA的人来说往往不是卡在某一个点上而是被一连串小问题折磨得失去耐心。这里把我在多个项目里沉淀下来的经验集中说几条。第一安装软件之前把电脑上已有的FPGA工具链先理一遍。路径冲突、环境变量冲突、License端口冲突这些都是潜在的暗雷。尤其是Licensed环境的端口设置如果之前装过Modesim又装过其他厂商的EDA工具很占端口号冲突到时候启动一个新工具把另一个挤掉排查起来非常痛苦。第二仿真库编译一旦成功最好备份一下编译好的库文件夹不要每次都重新编译。因为库编译时间不长但每次编译都可能引入新的意外。我习惯在仿真库编译完后整个文件夹压缩存档下次新电脑搭环境时直接解压到对应位置改一下路径就能用。第三testbench的设计同样需要规范。写testbench的时候把时钟周期定义为parameter比如parameter CLK_PERIOD 20;运行时修改或者生成多相时钟时会方便得多。时钟生成用always #(CLK_PERIOD/2) clk ~clk;这种写法不要在testbench里出现#10;这种裸延迟到处飞的情况改一次时钟周期全工程几十处延迟都要改效率极低而且容易漏改。第四遇到仿真结果和硬件实测不一致时先别急着怀疑仿真环境有问题。先检查约束文件里的IO标准、时钟频率约束是否正确然后再看仿真到底有没有覆盖到真实场景。很多所谓的“仿真不对”实际是激励没给对不是工具链的问题。第五高云的GowinSUN版本更新比较频繁每次更新后最好把工程用新版本重新走一遍“综合 → 布局布线 → 生成仿真模型”的流程再看时序仿真结果有没有变化。不同版本的综合和布线算法会调整时序结果可能跟旧版本不一样要是直接就开干后面发现问题再倒查版本原因就很被动了。9. 从环境搭建到团队协作的效率提升环境搭好只是第一步真正让联合仿真发挥价值是把这套环境固化到团队研发流程里去。比较推荐的做法是把仿真环境相关的文件全部纳入版本管理仿真脚本do文件、编译脚本、Modelsim初始化脚本、仿真库的编译说明文档、测试文件这些都放到仓库的sim目录下。新同事入职时不用从头摸索怎么配环境直接拉代码运行一个setup脚本就能把整套仿真环境拉起来。脚本里把每一步要做的事都注释清楚尤其是高云库的编译、Modelsim版本的兼容性说明、SDF加载方式这些容易出错的地方。我见过太多团队环境是靠老员工口头传授的人一走环境就断档新人只能自己踩坑。另外建议把仿真报告也自动归档。比如在批处理脚本里加一段每次跑完回归自动把日志文件按日期重命名存起来。后期定位“这个bug是哪个版本引入”之类的问题时历史仿真日志能帮大忙。我个人的习惯还有一条每个工程里在仿真目录下放一个README文档把这个工程特有的仿真注意事项、用到的芯片型号对应的高云库版本、Modelsim版本、SDF生成方式都记下来。几个月后回头看真的能省下大量回忆的时间。最后再分享一个我自己常用的小技巧联合仿真环境里Modelsim的初始化脚本modelsim.ini是很重要的东风。编译仿真库时高云的脚本通常会自动更新modelsim.ini把仿真库的映射关系写进去。如果后面你发现某个库找不到多半是modelsim.ini里的映射丢了或者被其他工具覆盖了。此时不用重新编译库手动在modelsim.ini里加上对应的映射行就能恢复。高云FPGA的联合仿真环境一套走通之后你会发现它和你在其他FPGA平台上的仿真flow本质上没有差别。难点在于第一次配置时的各种细枝末节。希望这篇把该提的坑都提了能帮你少走点弯路把时间花在真正的逻辑调试上而不是反复折腾环境。
返回列表