Vivado FPGA 后仿流程

FPGA的设计离不开仿真,我们最常用的是RTL的行为仿真,而对于FPGA设计而言,如果遇到了比较难以调试的Bug的时候,我们还需要进行后仿。所谓的后仿,其实就是布局布线之后的仿真,这个时候仿真会带有各种延时信息,也是最接近器件行为的仿真。虽说是仿真,可以看到各种信号,但是调试起来相当于前仿还是有很大区别的,这里就简单介绍一下后仿的基本流程。

仿真准备

后仿,其实就是一个带有各种时延信息的仿真,基本过程是把我们的设计经过综合,布局布线之后产生一个带有时延信息的Verilog文件,我们针对这个文件编写相应的测试激励(testbench),这个激励一般和前仿类似或者相同,然后我们把testbench和产生的Verilog放到一起用仿真工具进行仿真即可。

所以问题的关键是如何产生这个仿真Verilog文件,其实在Vivado中可以直接用两条命令产生,当然这个是在PR之后才能产生,因为我习惯使用batch模式,所以GUI下面怎么产生这个文件我还没怎么搞清楚,Batch下面倒是非常简单,直接下面两条命令就搞定了:

write_sdf -mode timesim -force -quiet post_sim.sdf
write_verilog -mode timesim -sdf_anno true -force post_sim.v

根据VIVADO命令手册,我们可以看到write_sdf用于输出时序仿真数据,默认模式是timesim,输出SDF文件,这个文件可以直接用于仿真。write_verilog用于生成仿真用的Verilog文件,这里的模式有多种选择,比如:

  • design选项会生成一个网表文件,包含布局布线等所有信息;
  • sta生成用于时序分析的文件
  • funcsim则会生成一个用于功能仿真的文件,这个文件不适合综合;
  • timesim会生成一个后仿用的文件,文件同样不适合综合
  • 其它的就参考手册好了。

-sdf_anno true表示添加SDF标注文件信息,这个时候就可以配合前一步生成的SDF文件就可以实现后仿了。

开始仿真

仿真首先要准备相应的Testbench,这个其实我们在前仿的时候一般都会有,基本也都不需要改动,因为前后的Design都是一样的。但是这里用的是HAPS系统,综合前后的系统会有所差异,所以也要根据实际情况进行修改。

首先是时钟的修改,在RTL设计中,时钟一般就是单端的,所以只有一个时钟输入,但是在后仿中,实际的时钟输入都是差分的,所以需要有两个时钟输入,两个输入时钟之间的关系是反向的。另外就是HAPS系统需要有一个100MHz的GCLK0的输入,这个也是差分输入的,需要给出一对差分的时钟,并且顶层直接是FPGA管脚的名字。

然后就是复位信号,这个信号在顶层接口的名字会发生变化,需要直接使用FPGA引脚的标号pin_BB30

最后要注意仿真的timescale设置,默认生成的文件是`timescale 1 ps / 1 ps,我们可以根据需要修改单位和精度,要注意的是这里单位和精度与仿真直接相关,时钟频率一定要和仿真单位相匹配,否则可能出现仿真完全没有结果的情况,我当时就是用了默认的1ps/1ps设置,结果时钟变成了100G,最终结果就是时钟压根进不去呀!

仿真元件库,系统进行后仿的时候,生成的Verilog文件里面全是一些LUT,DSP,BlockRAM等FPGA的单元,所以仿真的时候一定要包含这些FPGA库,这个仿真库一般就在Vivado的安装目录,比如/pkg/xilinx-vivado-/2018.03/x86_64-linux2.6-glibc2.12/Vivado/2018.3/data/verilog/src/unisims这样的目录,在VCS仿真的时候可以通过-y参数包含。

结果分析

好了,准备工作差不多了,如果顺利的话,这个时候应该可以得到一个仿真结果了,时序仿真因为包含时间信息,所以一般会慢一些。拿到仿真结果文件之后,进行分析的时候会发现分析还是复杂了不少的,因为经过综合之后,各种信号之间都会有优化,并且适配FPGA原件之后,很多总线都会分散开,所以信号找起来比较麻烦,尤其是总线很难去分析,只有顶层端口的信号还是可以认出总线的。总之分析起来难度还是有一些的,好处就是FPGA内部的所有信号都是可以看的。甚至包括HAPS的内建Debug都是可以直接看的。总之可以看成调试的一种辅助了。

相关文章

发表新评论