在紫光同创FPGA开发过程中,仿真环节的重要性怎么强调都不为过。很多刚接触FPGA的朋友可能会问:为什么不能直接用Modelsim仿真?为什么非要折腾这些仿真库?这个问题要从FPGA设计的特殊性说起。
FPGA厂商提供的器件本身并不是"空白"的,它们内部包含了大量预置的硬件资源,比如时钟管理单元(PLL)、存储器块(Block RAM)、DSP模块等。这些硬件资源在仿真时需要对应的模型来描述它们的行为特性。紫光同创提供的仿真库,本质上就是对这些硬件资源行为特性的软件描述。
我刚开始用紫光同创FPGA时就踩过这个坑。当时直接拿着自己写的Verilog代码去Modelsim仿真,结果一堆报错,最典型的就是"找不到模块定义"。后来才明白,原来我的设计中用到了PLL,但仿真时没有对应的PLL模型库,Modelsim当然就"不认识"这个模块了。
这是最省事的方法,适合刚入门的新手。紫光同创的Pango Design Suite(PDS)已经内置了仿真库编译功能。具体操作步骤如下:
这个方法最大的优点就是简单,基本是"一键式"操作。但我在实际使用中发现一个问题:当同时使用多个版本的PDS时,容易搞混库文件。建议每次编译都新建一个目录,并在目录名中注明PDS版本号,比如"PDS_2021.4_Libraries"。
如果你需要更灵活的控制,或者需要自动化编译过程,TCL脚本是个不错的选择。下面我分享一个经过实战检验的脚本:
tcl复制# 设置工作目录
set WORK_DIR "D:/fpga_proj/sim_lib"
file mkdir $WORK_DIR
cd $WORK_DIR
# 定义库名称和路径
vlib pango
vmap pango ./pango
# 设置紫光同创仿真文件路径
set pango_file_dir "D:/pango/PDS_2021.4/arch/vendor/pango/verilog/simulation"
# 编译所有Verilog文件
vlog -incr $pango_file_dir/*.v -work pango
# 编译特定IP核(以PLL为例)
vlog -incr $pango_file_dir/../ip/pll/pll_sim.v -work pango
使用这个脚本时,需要注意几个要点:
在Modelsim中运行脚本的命令是:
bash复制source C:/path/to/your/script.tcl
这种方法适合团队协作的场景。假设你们公司已经有同事编译好了仿真库,你只需要:
ini复制[pango]
directory = D:/modelsim_10.7/pango_lib
这种方法最快捷,但要注意版本匹配问题。我有次用了同事给的库文件,结果仿真时出现时序不匹配,后来发现他用的PDS版本比我用的新。所以建议在接收预编译库时,一定要确认以下信息:
现在我们来个实战演练,以最常见的PLL IP核为例,演示从库配置到波形验证的完整流程。
首先在PDS中创建一个PLL IP:
这里有个小技巧:在生成对话框里,记得勾选"Generate Example Design"。这样PDS会自动生成测试激励文件,省得我们自己写了。
把生成的文件整理好,通常包括:
在Modelsim中新建工程,添加这些文件。重点来了:在Compile之前,一定要确保:
编译通过后,开始仿真。几个关键操作:
在波形窗口,我们可以:
如果发现频率不对,比如不是预期的200MHz,首先检查:
在实际项目中,我遇到过各种奇怪的仿真问题。这里分享几个典型案例和解决方法。
现象:编译过程中报错,提示找不到文件。
可能原因:
解决方案:
现象:仿真时提示"Module 'PLL' is not defined"。
可能原因:
解决方案:
现象:时钟信号看起来不像时钟,更像随机信号。
可能原因:
解决方案:
经过多个项目的实践,我总结出几个提升仿真效率的技巧:
不要一上来就跑长时间仿真。建议分三步走:
在Modelsim的仿真设置中,有个仿真精度选项。对于大多数数字电路设计,使用默认的1ps就够了。但如果你设计中包含模拟模块(比如PLL),可能需要提高到0.1ps。不过要注意,精度越高,仿真速度越慢。
当需要反复运行相同仿真时,可以编写do文件实现自动化。例如:
tcl复制# 仿真脚本示例
vsim -t ps work.pll_tb
add wave *
run 1us
然后在Modelsim中执行:
bash复制do sim_script.do
仿真库的版本管理很容易被忽视,但非常重要。我的经验是:
这样当半年后需要重新仿真时,就不会因为找不到匹配的库文件而抓狂了。