FPGA如何利用tcl脚本语言进行脚本化仿真

写在前面

       我自己使用Questasim仿真的时候,每次修改源代码都需要重新退出Questasim,然后再仿真,才能仿出来。

而脚本化仿真是不需要这么麻烦的,修改源代码或者仿真后只需要按上键,引出do sim.do,然后enter运行就可以了,非常方便快捷,不需要每次打开都重新进入vivado然后从里面打开Questasim。

       在编写逻辑代码的过程中,我们常常会面对繁琐的验证,这个过程需要我们不断回到代码,进行修改,然后重新仿真……

       如果面对的是非常复杂的IP,面对几十上百条信号,比如说GTX,MIG,PCIE等,信号数量庞大。

       这就导致,每次验证,我们都需要从非常多,而且可能是命名不规范的信号中寻找几条有用的信号,将它添加到波形框中。

       尤其是命名不规范,这个非常折磨,自己写的代码,往往过些时候就忘记了,如果不看注释根本不知道这个信号有什么用。

       而且,每次重新验证添加信号的过程太麻烦了,太花时间了。

                                ​​​​​​​        ​​​​​​​        

       想想看,自己看到一个信号出现了问题,回到代码将verilog错误改正后,然后run simulation——等待——添加波形——restart——修改运行时间­——等待……

       等波形出来,中饭都吃完了,结果发现问题还在,忙了半天白忙活。

       所以验证其实是一个比较折磨的过程。

       接下来我会讲述如何利用Questasim进行脚本化仿真。

       (本文可以从邪道仿真开始看)

常用的tcl语言介绍

       Tcl语言还挺复杂的,有兴趣的可以看看B站上西南交大坻志雄老师的课程,有一个初步的了解,这里只介绍本文中用到的语法。

  1. vlog

vlog语法可以用来编译用verilog的代码文件,对于QuestaSim,vlog还能编译system verilog文件

vlog +initreg+0 +initwire+0 +initmem+0 -f ./dut.f

比如说这段代码,我们首先定义了起始信号(比如说复位信号)为0,然后进入“dut.f”文件,这个文件中的内容如下。、

#源文件

D:/PRO/light/src/light.v

#仿真文件

D:/PRO/light/sim/tb_light.v

#glbl文件

D:/PRO/light/light.sim/sim_1/behav/xsim/glbl.v

这个文件中必须包括所有的源文件、仿真文件和“glbl”文件地址,如果存在简单IP核的的话,需要将IP核对应的“netlist.v”文件地址也添加进来。

注意这里的简单ip核指的是。

RAM,PLL,FIFO等一些功能简单的IP核。

如果工程中含有MIG这些IP,那就是另一套玩法,可以直接看邪道仿真的部分。

  1. vsim

  我也没搞懂这个语法是什么意思,我只知道它可以直接跟仿真器联系,加载一些仿真需要的设计文件,但是具体怎么用我是真的不知道,非常抱歉。

  有兴趣的朋友可以自行查阅相当文档。

  这里提供一种通用的用法,我认为可以涵盖所有的需求了。

            #加载需要用的编译库,这个库就是使用Vivado的时候,

                     #绑定第三方仿真器时系统加载的编译库,

                     #这一块儿地方直接复制粘贴就好

vsim -t ps -l vsim.log -novopt +notimingchecks    \

-L secureip -L simprims_ver -L unifast -L unifast_ver \

-L unimacro -L unimacro_ver -L unisim -L unisims_ver -L xilinx_vip -L xpm \

#分割线

work.tb_light work.glbl

这个“work.”是什么意思我也不太懂,但是没关系,只需要注意的是,“work.tb_light”后缀需要改成你自己的仿真文件名称。

  1. view

可以显示数据和波形,我只会这么多……哦不是,是只能说这么多了。

  1. add

紧接着view,我们需要添加一些波形,通常情况下,我们会把波形添加到一个名为wave.do的文件中,然后我们执行do wave.do。

之所以要怎么做,是因为不同工程需要观察的信号波形是不一样的,与其在头文件中修改,不如单独在wave.do文件中进行简单修正。

这里其实可以提一嘴,波形的添加其实是非常复杂的,比如说我想添加我在工程中例化的FIFO的stream接口的tdata信号,那么我需要这样添加。

add wave -position insertpoint  \

sim:/sim_tb_top/u_ip_top/m_axis_tdata

根本看不懂这个关键词在干什么0.o。

之所以这样去写,其实是因为我不希望你去手敲这个wave信号,我们有简单的方法这个之后再提。

文件分类和创建

在进行本次尝试之前,本人的建议是,在自己的工程文件夹下面创建一个文件夹tcl。

tcl文件夹至少应该有如下文件。

  1. dut.f

里面放着的是所需文件的地址,就是这个工程用到的所有源文件,仿真文件,IP核的“netlist.v”文件,此处不再详述。

  1. sim.do

vlib work

#编译所有需要的文件

vlog +initreg+0 +initwire+0 +initmem+0 -f ./dut.f

#加载我们需要的所有的编译库

vsim -t ps -l vsim.log -novopt +notimingchecks    \

-L secureip -L simprims_ver -L unifast -L unifast_ver \

-L unimacro -L unimacro_ver -L unisim -L unisims_ver -L xilinx_vip -L xpm \

work.tb_fifo work.glbl

#打开波形框图

view wave signals

#将所有信号的进制改为16进制

radix Hexadecimal

#记录执行日志,这个可以不要

log -r/*

#执行波形文件,往波形框中添加自己想要的波形文件

do wave.do

#执行仿真,跑5ms,这里跑多少可以自己设置

run 5ms 

3.wave.do

该文件中存放着你需要的信号,如下所示。

这里建议直接add wave *,一键查看所有波形……

好吧开玩笑的。

这里介绍一种实用而且简单的办法来添加波形。

首先自己使用Questasim把文件仿真一遍。

然后,我们在Questasim上把需要的波形添加到wave框中。

这里添加的波形信号是sys_rst_n。

这时候回到Transcript。

重点来了,我们按键盘上的“上指示键”,就是4399双人游戏中第二个角色使用的方向键的上键,接着就会出现如下内容。

我们复制内容粘贴到wave.do文件中即可。

像这样粘贴几次。

4.glbl.v、modelsim.ini和testbench.v文件

       对于这三个文件,glbl.v和modelsim.ini文件的存放路径如图所示。

      

这个文件存放在经过一次仿真产生的Questasim仿真文件夹下。直接复制粘贴就好了。

其中,modelsim.ini也可以在自己自己的仿真library下找到。

而testbench.v文件则是你自己的仿真文件,直接复制粘贴就好了。

当然,你也可以不把他们放在这里,在dut.f文件中,添加上这两个文件的路径即可。,

实际操作

在Questasim中,我们首先打开Transcript。

 接着我们查看sim.do文件的位置。

 我们可以右键点击属性查看,如图所示。

所以,我们在Transcript框中,输入如下代码

cd D:\PRO\fifo\tcl

然后,运行文件。

       do sim.do

接着Questasim就会自动执行,你想要的波形会呈现在wave框中。

好吧,开玩笑的,其实根本运行不起来。

如果你按照上面的步骤进行的话,Questasim会报错,报错内容是

这是Questasim非常反常的地方,你不能

cd D:\PRO\fifo\tcl

而应该

cd D:/PRO/fifo/tcl

没错,就是正斜杠与反斜杠的区别。什么?你问我为什么会这样?

我也不知道啊,这是我试了很多次蒙出来的错误,如果有兴趣的话可以去查官方的资料,我反正没有在中文互联网上找到这个问题的答案。

说回正题,你就简单地理解为,Questasim无法识别这个“\”。

它只能识别两种斜杠,一个是“/”,另一个是“\\”。

在dut.f文件中,所有的地址必须使用这两种斜杠去表示,如图所示

(这个图缺少一个fifo的netlist文件,仿真的时候是要添加上的)

如果你改正了这个错误,并且cd成功了。

Transcript框中会出现如下提示。

它会自动识别你的modelsim.ini库

接着,进行do sim.do操作

然后你就能看到波形了

到这里所有的操作就已经结束了

之后你只需要每次都按上键,接着enter就能重置仿真。

邪道仿真

其实……我有一句很重要的话要说,那就是……

本文可以直接从这里开始看

这是我结合魏老师的方法,琢磨出来的,比较邪道。

首先我们用Questasim仿一遍。

之后来到这个文件夹下面。

这个就是我们使用Questasim后,由Questasim产生的一些tcl类型的文件。

我们将所有文件全部复制,粘贴到自己创立的tcl文件夹下面,如果不懂,点这里

Tcl文件夹里面什么也不放,上面的文件已经足够了。

然后,修改sim_tb_top_simulate.do为sim.do

在sim.do最上面添加(一定是最上面最上面!!!前面不能有任何有效执行文件)

do sim_tb_top_compile.do

do sim_tb_top_elaborate.do

使用modelsim的朋友没有sim_tb_top_elaborate.do这个文件。

可以自己创建一个出来,里面写上这些东西。

E:\\ques\\win64\\vopt -64 +acc=npr -L fifo_generator_v13_2_3 -L xil_defaultlib -L unisims_ver -L unimacro_ver -L secureip -L xpm -work xil_defaultlib xil_defaultlib.sim_tb_top xil_defaultlib.glbl -o sim_tb_top_opt

第一个地址可能是modelsim的安装文件,因人而异。

如果这样还不行的话,那……

那你就安装Questasim吧。

说回正题。

接着删去sim_tb_top_compile.do和sim_tb_top_elaborate.do里面最后一行的quit –force

接着,打开sim_tb_top_compile.do文件。

大家可以看到,这个文件所有的地址全是省略了前面的内容。

添加上。

这个过程大概要5~10分钟,一般。

然后就是修改wave文件的内容,方法和前面的一样,可以去看看wave.do

然后,接下来就跟实际操作的部分一样了。

我没有试过,这个方法适用于复杂ip的仿真,但是我觉得应该也适用所有的仿真吧。

写在最后

其实tcl是很好用的东西,如果能好好使用的话,你甚至可以在这个基础上考虑真正意义上的一步到位。

比如说进一步省去修改信号名称前缀的时间,省去按crtl+G的时间等。

这篇文章写的其实不是很好,我也有很多不太懂的地方,如果给你造成了困扰,十分抱歉。

最后特别感谢一下我的指导老师魏老师,他的脚本仿真给了我很多启发。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值