为什么需要仿真?仿真有什么优势?
在进行FPGA工程开发中,我们免不了需要验证功能是否正确,如果功能不正确就还需要进行调试,有两种调试方式,一种是使用仿真软件进行电路仿真,一种是上板之后用内部逻辑分析仪(如安路的chipwatch工具)抓取进关键信号进行调试。
而相比于内部逻辑分析仪来说,仿真可以让设计者能够快速定位问题。因为对于像100K的器件如果你用到80%左右资源的工程,进行一次综合、布局布线、生成bit文件的时间超过个把小时很正常,而对于KK级的器件一个工程编译十几个小时都很常见。当你发现效果不对,又返回来打算用内部逻辑分析仪chipwatch插入寄存器查看怀疑对象时,那么问题来了,你打算用chipwatch查看多少个寄存器值呢?chipwatch是利用FPGA内部的RAM资源来存储数据达到捕捉的功能,加入过大的chipwatch会使得布局布线更为困难,时间会更久,也还可能影响时序。再者chipwatch存储量是有限的,不可能从时间0开始一直存储下去。存满了,下次再来就刷新了。因此,如果不仿真,单纯的用chipwatch进行捕捉,每综合一次消耗大量的时间,再者chipwatch能观察到的信号有限,以及功能单一。这样一个流程下来,也许一天也未必能找到问题的所在,更别说处理问题了。
如果换成仿真,你可以添加大量的观察信号,可以从时间0开始就得到数据,对于稍微复杂的工程,不用跑半个小时的仿真已经可以出很多数据了,足够开发者逐步分析了。而且仿真还可以只针对部分模块进行仿真,这样能更快地定位逻辑错误。
Modelsim直接仿真安路器件
请先自行安装Modelsim软件,我们这里使用Modelsim版本为Moelsim SE-64 10.7 。
仿真库的编译
本教程以 EG4 器件为例, TD 软件自带有仿真模型, 并可在 modelsim 进行编译, 步骤如下:
在 modelsim 的安装目录下, 新建文件夹, 如: anlogic
双击Moelsim SE-64 10.7 图标启动 modelsim, 选择 File → change directory 将路径转到anlogic 文件夹下
在 anlogic 文件夹下新建文件夹, src用来存放TD 的仿真模型源文件
并将TD 安装路径下的 C:\Anlogic\TD_5.6.4_Release_97.693\sim_release目录下的所有文件复制到刚新建的src目录中(其实只不需要copy所有目录,这里为了简单起见,也为了以后仿真安路其它器件一起弄过来编译)。
在 modelsim 的 File → new → library 下新建名为 eg4 的库
在弹出来的“Create a New Library”对话框中都填入EG4
在这步执行完之后可以看到anlogic目录下多了一个eg4目录,一个modelsim.ini文件,eg4目录用于存放编好的库,modelsim.ini是配置文件
在Library中会多出一行 EG4 (empty)
打开 Compile → Compile,
弹出 Compile Souce Files 对话框,先在下面第一个红框处选中eg4
然后双击进入src目录,然后再进入src下的eg目录
按CTRL+A全选eg下的所有文件,并且勾选 compile selected files together, 最后点击Compile执行编译命令
编译成功之后可以看到library中多出了很多EG4的原语模块
使用 modelsim 仿真验证
本教程在前一教程 demo 的基础上完成。
由于工程涉及的东西越来越多,先整理下之前的工程
- src目录用于存放我们的可综合源代码文件
- sim目录用于存放我们的仿真工程和仿真脚本
- const目录用于存放我们的物理约束.adc和时序约束文件.sdc
- al_ip目录是TD自动生的存放IP的目录,目前该目录为空
在 modelsim 中, 点击 file → new → project, 新建 project, 如:led_cnt_sim。
注意下面那个红色框表示从前一节的anlogic目录复制modelsim.ini,
然后点击 Create New File 添加设计文件, 也可点击 Create New File 创建新的设计文件, 并将其添加到工程。
- 文件名写tb (testbench的缩写)
- 文件类型选Verilog
可以看到这里多出一个tb.v
双击tb.v输入仿真代码, 然后CTRL+S保存代码
`timescale 1 ns/100ps
module tb;
reg sysclk;
wire [2:0] led;
test u_test(
.clk_ref(sysclk),
.led_r(led[0]),
.led_g(led[1]),
.led_b(led[2])
);
initial
begin
sysclk = 1'b0;
u_test.cnt = 0;
end
///////////////////////////////////////////////////////////////////
//
// Clock generation
//
always #50 sysclk = ~sysclk;
glbl glbl();
endmodule
tb中引用了test模块,这个模块就是我们的被仿真对象,即前一工程中的LED计数器测试模块,所以我们也要将该模块添加到仿真工程中。右键点击 Add to Project → Existing File
点击Compile → Compile All 进行编译, 编译成功后, 源文件的状态将会由“? ”变成“✔”
点击 simulate → start simulate,
在 work Library 中选择 tb文件进行仿真,
如果想仿真后, 在模块列表中查看各信号参数或波形的变化情况, 可将“Enableoptimization”前面的勾去掉,
否则, Modelsim 会将信号参数优化掉, 导致信号列表为空。但是modelsim10.7版本之后都不能再使⽤-novopt,所以只要不使⽤-novopt就不会报错。但不使用-novopt就会发现运行之后找不到tb里面的信号。那么如何在使⽤优化的情况下,看到信号看到波形?
在执行仿真命令时使用vsim -voptargs=+acc就可以了,但对于初学者不熟悉命令行操作,我们重新勾选“Enableoptimization”,然后点击 Optimization Options…
然后在弹出的对话框的Options 页面中添加参数 “+acc”, 点击OK保存设置
然后还需添加库,选择 libraries 点击 add, 在弹出的Select Library对话框中选择 eg4。
点击OK
再次确认在work中选中tb
最后点击OK就会开始仿真。
点击u_test ,在objects中就会显示u_test可观测的信号,选中需要观察的信号
然右击Add Wave, 把要观查的信号添加到波形窗口
设置单步仿真 100us,点击旁边的按钮运行仿真
只显示了一段没有看到led_r/g/b跳动,依次输入 v f 快捷键查看全局波形。
依然没有看到led_r/g/b跳动,直接点击Run-All
等个一分钟,点击旁边的Break按钮停下来,
再按下 v f 快捷键波形就出来了
基于 TD 设置仿真参数并仿真
仿真参数设置
TD 支持用户使用第三方工具( 如 Synopsys VCS、 Mentor Graphics Modelsim 等) 来进行功能验证和时序验证。 TD 提供仿真所需的功能和时序模型。在进行 TD 联合调试前, 请根据本教程前面内容完成仿真库的编译。
以下介绍在 TD 软件中生成供 Modelsim 仿真所需的流程。
在运行 HDL2Bit Flow 前, 先点击Process → properties设置相关参数。
在Optimize RTL页, 设置 rtl_sim_model为ON。
在Optimize Gate页, 设置 map_sim_modle 和 gate_sim_model为ON。
在Optimize Routing页, 设置 set phy_sim_model 为 ON。
在Timing Option页设置 sdf 为 ON。
设置 Modelsim 仿真相关参数
- lib 指定仿真的库文件 没有默认值, 需手动指定路径
- runtime 指定仿真运行的时间 1000 ns
- resolution 指定仿真的时间精度 1 ps
仿真文件 do 文件设置
1:运行 HDL2Bit Flow
对于向执行什么级别的仿真, 就执行对应的 HDL2Bit Flow
- 当 HDL2Bit Flow 运行至 Read Design 这一步时, 可执行 Behavioral Simulation;
- 当 HDL2Bit Flow 运行至 Optimize RTL 这一步时, 可执行 Post-RTL Simulation;
- 当 HDL2Bit Flow 运行至 Optimize Gate 这一步时, 可执行 Post-Gate Simulation;
- 当 HDL2Bit Flow 运行至 Optimize Routing 这一步时, 可执行 Post-Route Simulation。
我们一般只进行功能仿真,那么就选择Behavioral Simulation 仿真, 只要执行 Read Design 这一步,双击FPGA Flow → Read Design 如下图
2:定义 testbench 文件
如点击 tools->Simulation 则会弹出如下对话框, 可以添加一个已经存在的
testbench 文件可以新建一个 tb 或者添加一个已经编写好的 tb 仿真文件, 这里我们添加前面已经编写好的。
点击 OK 后, 将会在工程目录下生成test_Runs\syn_1\simulation生成 test_behavioral_sim.do
并在 TD 界面打开 test_behavioral_sim.do文件。
修改test_behavioral_sim.do, 确保所有的文件路径都正确设置,如下所示。
#
# Create work library
#
vlib work
#
# Compile sources
#
vlog C:/Users/icmaker/Downloads/test_with_sim/sim/tb.v
vlog C:/Users/icmaker/Downloads/test/test.v
#
# Call vsim to invoke simulator
#
vsim -L C:/modeltech64_10.7/anlogic/EG4 -gui -novopt work.tb
#
# Add waves
#
add wave *
#
# Run simulation
#
run 1000ns
#
# End
启动 modelsim 仿真
1:改变路径
如果上一节直接modelsim仿真没有关闭Modelsim要先切换到library选项页选择 File → change directory 将路径转到 simulation 路径
如果上一节的工程没有关闭,此时会弹出如下对话框,直接点击是关闭之前的工程
在下面的Transcript输出框可以看到路径切换成功
输入 ls 以查看路径下的文件,
输入 do fpga_prj_behavioral_sim.do
执行仿真
会出现跟前一切一样的错误,
# Errors: 0, Warnings: 0
# vsim -L C:/modeltech64_10.7/anlogic/EG4 -gui -novopt work.tb
# Start time: 15:51:06 on Apr 05,2024
# ** Error (suppressible): (vsim-12110) All optimizations are disabled because the -novopt option is in effect. This will cause your simulation to run very slowly. If you are using this switch to preserve visibility for Debug or PLI features, please see the User’s Manual section on Preserving Object Visibility with vopt. -novopt option is now deprecated and will be removed in future releases.
# Error loading design
因为开启了 -novopt
这个关闭所有优化的选项,前一节是在GUI中添加了别的参数,这一节我们直接在.do脚本中进行修改,用-voptargs=+acc
替换 -novopt
。
会打印如下日志,可以看到已成功执行仿真
最后同样成功打开了仿真界面
其它操作就跟前面一样了,添加要观测的信号到波形窗口。
本教程的工程在以下目录
总结
费这么大劲,还不如一上来就直接用Modelsim仿真,为什么介绍这一步呢,因为这一步里我们接触到.do文件,这个文件是脚本文件可以执行自动化仿真,当工程大文件多时这一步可以让我们节省很多时间,其实最终熟练之后我们可以进行手写脚本(可以自行在网上学习),完成全自动化仿真,整个仿真过程不需要打开TD。
对于仿真工具的选择
我个人不喜欢用Modelsim仿真,因为Modelsim仿真慢,波形显示卡,信号追踪功能弱,如果要添加新的信号进行波形查看,还得重新进行仿真,虽然也能生成fsdb运用debussy或者GTKWave查看,但是跟VCS+Verdi比起来仍然感觉不爽,用了VCS+Verdi仿真就不会再回到Modelsim了。如果对VCS感兴趣可以参考关于chipdebug.com网站上的资料,仿真这方面展开又是一大堆东西,我这里只是给大家指个方向,初学者先不要深入去整这些比较合适, Modelsim最容易入门,且网上资料众多。
更多
chipdebug.com网站上有很多modelsim参考资料,
大家自行参考!
没有回复内容