加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Modelsim与debussy在FPGA仿真和debug中的应用

(2012-05-08 06:11:01)
标签:

杂谈

仿真是FPGA设计中的一个非常重要的环节,但很多朋友在做FPGA设计的过程中,却并没有意识到仿真的作用,也没有一个好的仿真流程来保证仿真验证的效果。我们做仿真的目的是要通过仿真找到设计中潜在的问题并解决之,这就需要一个debug的过程。在这篇文章中,会讨论一下我对FPGA设计中仿真验证和debug的看法,也介绍一下modelsim+Debussy在仿真和debug中的应用流程。

记得在学校的时候,搭硬件系统要用到FPGA。那时候没有任何FPGA设计的经验,也没有好的设计流程可以参考。在做设计的时候,基本上是很随意的去写代码,很少顾及到甚至很基本的设计原则。代码写好后,尽管有验证代码正确性的意识,但并没有成熟可靠的方法可以使用,基本上就是画一些简单的波形作为激励信号,通过开发软件自带的仿真工具,大概看一下输出的波形是不是正确。这样做存在很多问题。首先测试覆盖率非常的低,激励信号不可能做的很复杂,不可能涵盖所有需要验证的设计环节;再者就是要看被测设计的输出波形来检验设计是否正确,这样就需要大量的时间,效率很低。在发现设计有问题的时候,检查设计代码,也用很原始的手段,一行一行的去查看,没有意识到或者说根本就不知道有工具软件可以来做trace。更通常的验证方法就是在FPGA程序写好以后,综合出来,烧录到实际的系统中,在系统上直接验证。但这种做法,效率低下且有问题的话,很难debug。另外比较糟糕的是很难发现一些比较特殊的问题。

后来在公司的时候,做IC设计,公司有比较成熟和完善的设计流程。主要用NC来做仿真,用debussy来做debug。成熟和完善的设计流程带来的就是比较高的仿真的效率和比较高的覆盖率,我们在debug的时候,基于比较好的流程和方法,效率也比较高。数年工作下来,让我建立起了一个基本的仿真验证的概念,这个时候,再回头看当初做FPGA设计的时候所遇到的问题,感触颇深。

仿真的覆盖率是一个比较重要,做起来也比较复杂的问题,也有很多关于仿真验证的方法学之类的书可以参考,我们这里不做讨论,这里只讨论FPGA仿真的流程问题。做IC设计,一般都倾向于在unix/linux的系统环境下做,大多数的软件也都是基于unix/linux系统的。虽然主要的FPGA厂家的设计工具都有unix/linux的版本,但大多FPGA的设计,特别是初学者在做FPGA的时候,往往会基于windows系统。因为这个文章是针对初学者的,所以我们也在windows系统下讨论这些问题,也尽量用GUI的模式而不使用命令行。

可以用来做FPGA仿真的工具有很多,最基本的比如说FPGA厂家提供的工具,Altera的quartusII,Xilinx的ISE等。而第三方厂家,特别是一些IC EDA工具的提供商,随着FPGA的发展,也都有各自的FPGA的解决方案。比如说Mentor,Synopsys,Cadence等等。但在windows环境下,大家用的比较多的还是Mentor的Modelsim;在debug工具的选择上,大家用的相对较少,从我的角度看,debussy的window版本,是比较好用的debug工具。所以我就讨论一下windows环境下modelsim+Debussy的仿真验证和debug的流程。下面的讨论,是基于Altera的FPGA的,但从根本上讲所叙述的方法,是可以适用于任何FPGA的设计的。

用modelsim做FPGA仿真的基本流程可以用下面的图来表示:

http://s14/middle/72c14a3d4bf79899785ed&690

首先就是要创建一个working library。创建working library的目的是为了编译并存放源代码。可以说,仿真都是基于这个working library的。

第二步是编译设计文件。这里的设计文件,不仅仅包含了设计本身,也包含了测试向量和monitor等。

第三步是链接resource libraries。在我们的设计中,大多会用到一些IP或者第三方提供的资源。这些IP或者第三方的资源的信息在设计文件中是不存在的,那么要正确执行仿真的话,就必须以库的形式将这些信息添加进去,所以就用到了resource library。最常见的,比如说ALTERA FPGA中的PLL和SRAM,以及FPGA的基本逻辑单元等。

第四步就是执行仿真。

最后一步就是做debug,对仿真结果进行分析。

如果在debug的时候,发现设计存在问题,那么就需要更改设计,并从第二步重新开始循环执行。

一, 获取ALTERA resource library

在安装modelsim的时候,软件会自动安装一些resource libraries。不过这里边并没有包含ALTERA的resource library。如果我们要做ALTERA FPGA的仿真,就必须要先获取ALTERA的resource library。可以通过下面的方法获取。

首先我们要安装quartusII软件。在quartusII的安装目录(./quartus/eda/sim_lib/)下,有为该公司FPGA仿真准备的可综合的库文件。其中扩展名为.v的文件是verilog格式的,如果要进行verilog的仿真,则需要这些文件。而扩展名为.vhd的文件时VHDL格式的,如果要进行VHDL的仿真,则需要这些文件。在这些库文件中,部分是通用的标准单元的库文件,而另外的部分则是跟FPGA器件类型相关的,不同系列的器件有不同的库文件。从文件的命名上即可区分开。

下图是该目录下的部分verilog格式的文件。可以看到,像220model.v,altera_mf.v,altera_primitives.v等这些,是通用的,但像cycloneii_atoms.v则是cycloneii 系列专用的。

http://s7/middle/72c14a3d0798c27630866&690

Modelsim并不能直接使用这些verilog/VHDL格式的文件,所以我们要先把这些文件综合成modelsim可以识别的resource library。步骤如下:

1,在modelsim软件的安装目录下创建一个新的文件夹—比如altera—用来存放ALTERA的库文件。在该目录下,创建一个新的名为src的子目录,并把上述的quartus的sim_lib中的库文件copy到src子目录下。这里要说明的是,altera通用的库文件要全部copy过来,但与器件类型相关的库文件,只需要copy你使用的器件类型就可以了。

2,打开modelsim软件。在file菜单选change directory命令,将当前目录改变到前面建立的altera目录。

http://s2/middle/72c14a3d4bf7989f30901&690

3, 还是在file菜单,选择new -> library,创建新的库。库的名字就设定为altera。

http://s12/middle/72c14a3d0798c27678a2b&690

4,在compile菜单选compile命令,Library中选altera,查找范围选之前建立的src目录,然后选中该目录下面所有的文件,最后单击compile命令。这个时候,modelsim就会把altera相关的库文件编译到名字为altera的resource library中。

http://s8/middle/72c14a3d4bf798a4113f7&690

5,当resource library生成后就可以在modelsim中使用了。不过如果在每个项目中都要使用altera的库的话,最好是在modelsim启动的时候,自动将这个库加载到项目中。可以通过更改modelsim的配置文件modelsim.ini来实现。Modelsim.ini是在modelsim的安装目录下的。打开该文件,找到[Library],然后加上下面红色的一条命令:

[Library]

std = $MODEL_TECH/../std

ieee = $MODEL_TECH/../ieee

vital2000 = $MODEL_TECH/../vital2000

altera = $MODEL_TECH/../altera/altera

这样,在modelsim启动的时候,就会自动加载altera这个库。

二, 在modelsim中创建新的仿真项目

1. 打开modelsim,将当前路径改到要创建项目的目录。

2. 用下面命令创建新项目File -> new -> project,会打开如下图所示的对话框。 在project name中输入要创建的新项目的名字,这个一般以top module的名字命名为好。 Project location会自动默认为当前目录的路径。在创建新项目的时候,会创建一个名字为work的default library。最后一项copy settings from选默认值即可。最后点OK

http://s4/middle/72c14a3d4bf798a77f503&690

3. 这个时候会弹出add item to the project的对话框,有四个选项,如果已经准备好要仿真的文件的话,就选择 Add Existing File。因为要仿真的文件已经准备好了,所以这里我们就选择该选项。

http://s2/middle/72c14a3d4bf798a90a7d1&690

4. 此时会弹出add file to project的对话框,我们把需要添加的文件都添加进去,需要注意的是,一次可以添加多个文件,即可以把仿真所需要的所有文件都添加进去。然后点确定。

http://s11/middle/72c14a3d4bf798aaf998a&690

5. 此时看项目窗口,会给出所有添加文件的列表:

http://s1/middle/72c14a3d4bf798ad9c020&690

6. 此时就可以选择compile->compile all的命令,编译所有的文件。Modelsim的编译还是比较智能化的,它会根据设计的层次,自动链接所有的模块,按顺序编译整个设计。如果编译的时候没有遇到错误,则下一步就可以进行仿真了。

7. 选择simulation -> Start simulation命令,则系统会打开start simulation的对话框。在design->name中,work库层次下,选择要仿真的模块,这里我们要对整个设计做仿真,所以选择top module。 去掉Enable optimization。

http://s8/middle/72c14a3d4bf798aff9b27&690

8. 因为这个设计是基于ALTERA的FPGA的,所以在仿真文件里,有用到ALTERA的一些IP,比如PLL,FIFO等,所以在这里,我们要在仿真中加入与ALTERA相关的resource library。在Libraries选项卡中,添加altera的库到search Libraries中(altera的库即为之前我们生成的)。

http://s1/middle/72c14a3d4bf798b25f4e0&690

9.这个时候点OK就可以进行仿真了。仿真的时间和方式,可以手动输入,也可以在testbench中设定,也可以通过simulate -> run -> *命令来选择。比如说我们要跑1ms的仿真,就可以在命令行里输入: run 1ms的命令,也可以在testbench中,加入仿真结束的时间。

三, 在modelsim中使用debussy的api函数dump波形

Debussy是一个非常好用的debug工具。在debussy中加载所有设计文件后,Debussy可以自动识别出设计的层次文件,然后可以在其窗口中很方便的trace出一个信号的driver和load。另外就是可以和波形文件结合起来,直接通过debussy trace的方式查看信号的实际波形,确定故障点。

不过debussy支持的波形文件的格式是fsdb,而modelsim是没有办法直接生成该格式的波形文件的,我们需要使用modelsim的api接口,调用debussy的函数来生成fsdb文件,具体的原理我们不做介绍,只是给出调用方法。

1. 安装debussy软件,将 */share/PLI/modelsim_pli/WINNT/novas.dll文件(*为debussy的安装目录)复制到*/win32目录下(*为modelsim的安装目录)。

2. 在modelsim.ini中找到Veriuser,并将其改为:

Veriuser=*/win32/novas.dll (*为modelsim的安装目录)。

3. 在testbench中加入下面的initial 语句:

initial begin

$fsdbDumpfile ("test.fsdb");

$fsdbDumpvars (2, “fpga_top_vlg_tst”);

$fsdbDumpvars (0, “fsdb_top_vlg_tst.i1);

end

这里做一些解释:

a. test.fsdb是所要dump波形文件的名字,可以任意命名,但扩展名必须为fsdb。

b. $fsdbDumpvars 2 (“fpga_top_vlg_tst”);这个语句中,$fsdbDumpvars 是dump波形的命令;2是dump的层次,也就是要记录多少层的信号;“fpga_top_vlg_tst是设计的模块层次的名称,必须以最顶层的模块开始写,比如说后面的fsdb_top_vlg_tst.i1。 dump的层次就是从这个模块的层次开始,向下记录两层。如果dump层次写为0的话,则是要记录该模块下所有信号(包括该模块中例化的所有子模块)。

c. $fsdbDumpvars 这个命令可以使用多次,每次可以指定不同的设计层次。

d. 实际上这些命令都是基于tcl的,还有更多的选项可以使用,有兴趣的话,大家可以去查一查相关的手册。

当加上debussy相关的内容以后,再去根据上述modelsim的仿真流程,做完仿真,则就可以在项目目录下生成名为test.fsdb的波形文件。

四, Debussy的使用。

1. 打开debussy软件后,可以通过file->import design -> from File来选择需要加载的设计文件。方便期间,可以创建一个扩展名为.f的文件,将所有设计文件都列在里边,那么我们直接加载这个.f的文件就可以了。如下图所示。

http://s12/middle/72c14a3d4bf798b3552ab&690

2. 加载文件以后,我们就可以在debussy的工作窗口做debug了。在debussy中,我们可以很方面的找出来某个信号的driver和load。

http://s16/middle/72c14a3d4bf798b80b01f&690

3. Debussy一个很方便的功能就是可以把波形文件和设计代码之间方便的结合一起来做debug。用tools->new waveform可以加载新的波形文件。Debussy的强大在于我们可以将trace窗口里的信号直接拖拽到波形文件里,也可以将波形文件中的信号直接拖拽到trace窗口里。使用起来非常方便。另外在波形文件里,可以对信号进行任意的分组,组合,排列,也可以改变信号的颜色等等。如果有多次仿真得到的不同的波形文件,可以多次加载不同的波形文件,然后对波形文件进行对比。功能相对非常强大。这里不做具体的介绍,大家可以自己动手去试一试。

http://s2/middle/72c14a3d0798c278ef4d1&690

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有