首页 理论教育Modelsim基础教程

Modelsim基础教程

【摘要】:图5.23 编译图5.24 编译完成3.启动仿真工具当设计文件“traffic_lights_state_machine.v”和测试文件“testbench.v”编译通过之后,启动仿真工具。图5.27中,弹出时默认选中第一个“No design object visibility”,需要改选为第二个“Apply full visibility to all modules”选项,第二个选项可以使模块内部及模块连接间的信号都能被观察到,能够帮助我们更好地进行调试,而其他选项只能看到部分信号。

1.库文件的映射

Modelsim的基本使用需要3种文件,分别是软件配置文件、设计文件和库文件。软件配置文件就是5.3.1节中提到的modelsim.ini,里面有相应的配置信息,是在安装Modelsim时生成的,默认只读,但在关联时需要用到,前文已述;设计文件是工程师们的.v文件和testbench.v文件(测试文件),testbench.v是仿真设计.v文件用的测试代码,也是.v文件,在testbench.v中,不仅要对功能.v文件需要的时钟和复位等信号进行初始化,并且还要产生激励信号,作为我们设计文件的输入,以验证设计文件功能的正确性;库文件是存储已编译的设计单元的目录,包括两种库文件,一种是工作库,其库名默认为work,用于存放当前工程下所有已编译的设计文件,未编译的设计文件在work库中不存在,在建立工程之初就需要建work库,且每个工程只有一个work库,另一种是资源库,用于存放work库中已编译的设计文件所需要的资源,资源库不只一个,用户也可以自建资源库。如图5.18所示。

图5.18中最底部有3个选项:Library、Memory List和Project。Library一栏中列出该工程用到的库文件,第一个库文件就是work库,work库下面包含了一个设计文件(.v文件),work库后面的是资源库,图中资源库是在建立工程时默认建立的基本资源库,对于一些用户自己需要的特殊资源库,可以通过新建资源库将其加载。Memory List中会列出用户在仿真时建立的所有memory,通过命令实现memory的建立,在5.3.3节中“文件的写入和导出”部分会有memory的举例,这里不再赘述。Project一栏中会列出所有的.v文件,包括设计文件和测试文件。

2.设计的编译

新建工程:在图5.16工具栏中选择“File”,在“File”的下拉列表中选择“New”,然后选择“Project”,弹出如图5.19所示的对话框。

978-7-111-55094-5-Chapter05-32.jpg

图5.18 Library示例

978-7-111-55094-5-Chapter05-33.jpg

图5.19 新建工程

在图5.19中,第一行“Project Name”栏输入新建工程的名称,第二行“Pro-ject Location”默认指定到Modelsim安装目录下的examples文件夹,用户可以根据自己的需求重新指定新的路径,第三行默认的“Default Library Name”是“work”,即在前文“库文件的映射”中提到的work库,在这里用户可以更名,“Copy Settings From”中设定配置文件,即安装目录下的modelsim.ini文件,并选择“Copy Library Mappings”,单击“OK”按钮,会弹出如图5.20所示的对话框。

在图5.20中,加载文件,选择“Create New File”,新建.v文件,在这个文件中开始撰写代码,并保存在自己设定的路径下。在这里,以前文中交通灯状态机为例,说明工程的建立与编译。过程中,除了建立功能模块的.v文件以外,还需要建立测试.v文件,即testbench.v文件,用来产生测试激励,向功能模块提供输入信号,用户通过观测输出信号来验证模块功能的正确性。testbench.v是没有输入输出端口列表的module,在测试文件testbench.v中对设计模块进行例化调用,并初始化相关信号,然后用always等语句产生测试激励,测试文件的结构如图5.21所示。

978-7-111-55094-5-Chapter05-34.jpg

图5.20 添加文件

978-7-111-55094-5-Chapter05-35.jpg

图5.21 testbench.v结构图

交通灯状态机的testbench.v如例5.6所示,交通灯状态机的状态图和代码在5.2.1节中“状态机”部分。

例5.6 交通灯状态机的testbench.v

978-7-111-55094-5-Chapter05-36.jpg

978-7-111-55094-5-Chapter05-37.jpg

978-7-111-55094-5-Chapter05-38.jpg

有了设计文件和测试文件,就可以开始仿真,工程界面如图5.22所示。

978-7-111-55094-5-Chapter05-39.jpg

图5.22 工程界面

在图5.22中,选中左侧中下部的“Project”,在该栏中,有两个文件:功能模块“traffic_lights_state_machine.v”文件和“testbench.v”测试文件,并且两个文件上都打了问号,这是由于还没有编译,编译的过程会检查语法错误,可以根据报出的error进行针对性的修改,选中其中一个文件,右键单击,弹出图5.23所示选项,单击Compile→Compile Selected,即编译选项,如图5.23所示。

“Compile Selected”表示编译当前选中的文件“traffic_lights_state_machine.v”,“Compile All”表示编译当前工作框“Project”里的所有.v文件,编译后如图5.24所示。

图5.24中,在“traffic_lights_state_machine.v”上出现了对勾,表示编译成功。用相同的方法将所有用到的文件编译成功后,可以启动仿真工具,查看仿真波形。

978-7-111-55094-5-Chapter05-40.jpg

图5.23 编译

978-7-111-55094-5-Chapter05-41.jpg

图5.24 编译完成

3.启动仿真工具

当设计文件“traffic_lights_state_machine.v”和测试文件“testbench.v”编译通过之后,启动仿真工具。单击工具栏中仿真按钮,如图5.25所示。

978-7-111-55094-5-Chapter05-42.jpg

图5.25 启动仿真按钮

在图5.25中,所圈为启动仿真按钮,第一个是编译当前选中.v文件,第二个是编译所有的.v文件,第四个是停止仿真按钮。单击仿真按钮,会弹出图5.26所示的对话框。

在图5.26中,先单击右下角“Optimization Options…”按钮,弹出图5.27所示的对话框。

图5.27中,弹出时默认选中第一个“No design object visibility”,需要改选为第二个“Apply full visibility to all modules(full debug mode)”选项,第二个选项可以使模块内部及模块连接间的信号都能被观察到,能够帮助我们更好地进行调试,而其他选项只能看到部分信号。配置完成后,单击“OK”按钮,会回到图5.26所示对话框,此时要选中“work”库下面所列的当前testbench.v文件,在图5.26中即“traffic_lights_state_mahine_tb”,单击“OK”按钮,启动仿真。

启动仿真后,在工程界面左边“Project”栏中会增加“sim”一列,如图5.28所示。

图5.28中,“sim”栏会列出当前的testbench.v文件和设计文件,选中相应的文件,在旁边“Objects”栏中会显示出该文件的所有信号,例如图5.28中,选中的是testbench.v文件,“Objects”一栏中列出了testbench.v文件中的所有信号。如果界面中没有“Objects”一栏,可以在工具栏中点中“View”,然后勾选“Ob-jects”将其调出。

978-7-111-55094-5-Chapter05-43.jpg

图5.26 启动仿真配置示图

978-7-111-55094-5-Chapter05-44.jpg

图5.27 优化选项

选中设计文件“DUT_traffic_lights_state_machine”,由于在testbench.v中例化设计文件时,在其名字前增加“DUT_”前缀,所以“DUT_traffic_lights_state_ma-chine”与“traffic_lights_state_machine”是同一个模块。右键单击选择Add to→Wave→All items in resgion,将设计文件中的所有信号添加到观察波形中,在原来.v文件编辑窗口会增加“Wave”窗口,如图5.29所示。

978-7-111-55094-5-Chapter05-45.jpg

图5.28 启动仿真后示图

978-7-111-55094-5-Chapter05-46.jpg

图5.29 Wave窗口

在图5.29中的Wave窗口,将要观测的信号添加进来。单击开始仿真按钮,仿真开始,如图5.30所示。

978-7-111-55094-5-Chapter05-47.jpg

图5.30 仿真启动选项

在图5.30中,最左侧的按钮表示重新开始“Restart”,在调试中会用到;白框中填写仿真时间,虽然单位是100ms,但并不是生活中用到的时间衡量方式,它只是一个仿真时间,通常500ms就能跑一个通宵,可以说是非常大的仿真了;紧跟白框后面的第一个按钮是仿真开始按钮“Run”,到100ms时就会停止,该按钮与白框里的时间是相关联的,白框里设定的仿真时间就是“Run”的时间;白框后第二按钮是“ContinueRun”按钮,仿真过程中被中止,单击该按钮继续,前面跑出来的波形会保存,然后继续跑;白框后第三个按钮是“Run-All”按钮,单击该按钮后,仿真会一直进行,直到用户单击最后一个按钮“Break”来中止。当然,跑的时间越长,波形中能看到的数据越多,波形文件就越大,有时候波形文件在工程中就能占好几个G,甚至几十个G,不需要时可以将波形文件删除,它们就是工程目录下后缀名为.wlf的文件。

4.调试

调试主要是通过波形查看信号的各个状态,去验证代码功能的正确与否。调试的手段主要是观测波形、查看输出文件等方式。下面是观测波形会用到的基本工具,如图5.31所示。

图5.31中所列是查看波形常用工具。其中第一个图标是以图形界面中轴线为中心放大图形,第二个图标是缩小图形,第三个图标是将所有图形缩放到当前屏幕(图形很密集,但能看见当前仿真时间段内的所有波形),第四个图标是以所选轴线为中心放大波形,这个工具能够将用户想看的那部分波形进行放大,相对于第一个来说选择性更强,目标明确有针对性。

当波形文件较大,波形较密集时,需要用一些便捷工具帮助用户迅速定位想查看的点,比如图5.32中这组工具。

978-7-111-55094-5-Chapter05-48.jpg

图5.31 观测波形的基本工具按钮

978-7-111-55094-5-Chapter05-49.jpg

图5.32 便捷工具按钮

在图5.32中,第一个图标用来增加一个cursor(图形标),方便用两个cursor测距(测量时间差),第二个图标用来删去当前选中的cursor,第三个是寻找前一个变化的值,在图形界面中选中一个信号,以该信号为准,找其前面离图形标最近的一个变化值,第四个与第三个功能类似,只是向后寻找,寻找方向不同,第5个和第6个图标用以找所选信号的下降沿,前者向前找,后者向后找,第7个和第8个图标用来找所选信号的上升沿,前者向前找,后者向后找。

对于本文中交通灯状态机这个例子,其仿真波形如图5.33所示。

图5.33的波形图中,竖着的黄线即前文所述图形标,用户移动该标志来查看所需查看的波形,绿灯、黄灯、红灯依次亮起(图5.33中“green_light”、“yellow_light”和“red_light”信号依次被拉高),并维持各自所要求的时间,状态机“CurrentState”指示当前状态,与信号灯输出同步,按照设计文件依次跳转,工作正常,完成设计功能。

978-7-111-55094-5-Chapter05-50.jpg

图5.33 交通灯仿真示图

另外,如果觉得波形在调试界面中太小,不方便查看,可以单击波形界面右上角的第二个按钮将波形界面弹出,单独作为一个窗口,如图5.34中间的那个图标。

978-7-111-55094-5-Chapter05-51.jpg

图5.34 弹出窗口按钮

在图5.34中,第一个图标可以将当前查看波形的框图“Wave”放大到Modelsim界面中间的全屏,或者缩小到默认值;第二个图标即弹出窗口;第三个图标是关闭当前波形。

还可以查看某个信号的数据流,通过选择Objects→选中查看信号→Add Data-flow查看,如图5.35和图5.36所示。

在图5.35中,右键单击选中的信号“green_light”弹出右侧选项列表,选中“Add Dataflow”,在右边会弹出图5.36所示的界面。

978-7-111-55094-5-Chapter05-52.jpg

图5.35 选择Dataflow

图5.36中,显示了产生信号“green_light”的代码块,此时可以选中图中某个信号,双击,会出现信号的连接关系。在工程很大、信号比较多的时候会查看Data-flow,便于用户查看信号走向,追溯信号来源,不用在代码中一一对应,通过图形界面直观便捷地找到信号走过的路径。

在调试的过程中难免需要修改代码,重启仿真,修改完代码后,在左侧“Pro-ject”栏中对应的.v文件又会从对勾变成问号,需要重新编译修改的代码,然后再重新启动仿真。选择工具栏中的Simulate→Restart,弹出图5.37所示的对话框。

978-7-111-55094-5-Chapter05-53.jpg

图5.36 查看结果界面

图5.37对话框中默认全选,单击“OK”按钮,可以看见“sim”栏和“Ob-jects”栏中的信号会被重新加载,“Wave”界面中的波形也被清除,单击“Run”按钮,开始新一轮的仿真,再重复前面的调试过程。“Restart”对应的快捷键如图5.38所示。

978-7-111-55094-5-Chapter05-54.jpg

图5.37 Restart对话框

978-7-111-55094-5-Chapter05-55.jpg

图5.38 Restart快捷键

图5.38所示“Restart”快捷键在界面上方的工具栏中,单击图5.38所示图标同样会弹出图5.37所示的对话框。