在使用ModelSim时,我们一般都是从界面UI进行操作的,这样也比较直观易学。但是在很多的调试时,发现很多操作都是重复的,修改一下代码就要再次进行相关操作,这样很没有效率。其实,ModelSim是可以进行TCL命令行操作的,在界面的每一次操作,在命令窗口都有相对应的命令。

一、do文件编写

在这里,我们是通过do文件来完成这个仿真过程。do文件中包括你所需要完成操作的命令,直接在命令窗口中运行该文件即可,省去了重复劳动。下面我们以实例讲一下do文件的编写。

1、编写好源文件。包括sram_controller.v和它的Testbench文件sram_controller_tb.v
2、编写.do文件(sram_controller.do),内容如下:
# Create the work library
vlib work

vmap work work

# Compile the verilog files

vlog  sram_controller.v

vlog  sram_controller_tb.v

# Run simulation

vsim  sram_controller_tb

#Add all the top signals

add  wave *

#The time of run

run 1us

3、打开ModelSim,修改工作路径到当前工程目录下。在命令窗口中输入do sram_controller.do,软件便开始自动运行进行仿真了。

下面是仿真结果:

4、如果对设计文件进行了修改,需要进行重新仿真。那么,只要在命令行重新输入do sram_controller.do回车即可完成仿真,非常方便,一劳永逸。

5、此外,还有一个更偷懒的方法,不打开ModelSim软件就可以完成自动化仿真。就是编写.bat的批处理文件,用于在Windows cmd下运行整个ModelSim仿真。

源码如下:
vsim -do sram_controller.do
保存文件为sram_controller.bat。在工程目录下直接点击sram_controller.bat运行即可。

6、add wave * 这条命令就将test bench顶层的所有信号加入到wave窗口中。对我们来说,在调试阶段,有很多底层信号都是想观测的,所以需要再手动修改一下命令。比如我们想将实例中的状态机信号加进去,可以在do文件中增加一条命令:add wave /sram_controller_tb/i1/state 。当然也可以通过软件操作完成此功能。

7、此外,有些命令可能我们不熟悉,这时候我们可以借助软件的UI操作来查看并记录这些命令。例如,为了区分仿真波形窗口中的各种信号线,需要信号波形作设置,如不同信号线的颜色、显示基数、显示方式等要有区别,这时就需要在仿真波形窗口单独对每一个信号线手动进行设置,这对于不断修改源代码然后再不断地进行仿真来说,非常麻烦。我们可以先进行一次仿真,然后对颜色等进行设置,最后保存波形格式为wave.do。

这时候建议将前面的sram_controller.do文件拆分为sim.do和wave.do,将波形添加和设置等操作放到wave.do中,分别运行这两个do 文件即可完成仿真,且如上图波形的颜色设置等不需要重复劳动。

总之,如果你对命令不熟悉,可以先进行UI操作,观察命令窗口中对应的命令,就能理解命令的操作。其他还有很多TCL命令,这里就不赘述了。

二、如何让状态机显示状态的名字

在使用Verilog编写有限状态机等逻辑的时候,状态机的各个状态通常以参数表示,但当使用ModelSim仿真的时候,状态机变量在wave窗口中以二进制编码的形式显示,如上面第一部分中6添加状态机的状态,这种显示形式不是很直观,但我们可以使用ModelSim提供的命令将状态机变量以“文本”形式的参数名显示,从而有利于调试。

1.首先使用ModelSim的virtual type命令定义一个新的枚举类型(FSM_TYPE):

virtual type {
{0x0 idle} {0x1 write_U9} {0x2 write_U6} {0x4 start_1} {0x8 rdU6_wrU5} {0x10 update_1} {0x20 read_end_1} {0x40 waiting_1}
{0x80 ARM_com_1} {0x100 start_2} {0x200 rdU5_wrU6} {0x400 update_2} {0x800 read_end_2} {0x1000 waiting_2} {0x2000 ARM_com_2}
} FSM_TYPE

注意:状态变量之间需要一个空格。

2.然后我们将需要显示的信号(/sram_controller_tb/i1/state,注意信号在wave窗口中的完整名字)进行类型转换,转换成一个新的信号(state_new)

virtual function {(FSM_TYPE)/sram_controller_tb/i1/state} state_new

3.最后我们将新的信号加入到wave窗口中。

add wave -color pink /sram_controller_tb/i1/state_new

4.仿真结果。

我们可以看到状态名字以参数的形式显示了,这样就直观多了,也方便我们调试。

ModelSim之TCL仿真的更多相关文章

  1. ModelSim之tcl自动化仿真

    摘要: ModelSim的tcl最大的优势就在于它可以让整个仿真自动运行,免除每次进行各种用户界面控制操作的麻烦.用tcl就可以自动完成建库.映射库到物理目录.编译源代码.启动仿真器.运行仿真等一系列 ...

  2. vivado与modelsim的联合仿真(二)

     最近在做Zynq的项目,曾经尝试使用ISE+PlanAhead+XPS+SDK组合和Vivado+SDK来搭建工程,使用中发现前者及其不方便后者有诸多不稳定.近期得闻Xilinx退出Vivado20 ...

  3. 通过文件读写方式实现Matlab和Modelsim的联合仿真

    虽然Modelsim的功能非常强大,仿真的波形可以以多种形式进行显示,但是当涉及到数字信号处理的算法的仿真验证的时候,则显得有点不足.而进行数字信号处理是Matlab的强项,不但有大量的关于数字信号处 ...

  4. vivado和modelsim联合调试仿真

    vivado和modelsim联合调试仿真 0赞 发表于 2017/5/10 19:10:59 阅读(881) 评论(0) 使用vivado和modelsim联合调试仿真时,在破解完modelsim后 ...

  5. Modelsim SE自动化仿真——如何将.do文件中自定义的库链接到testbench顶层模块

    我们用Modelsim SE进行仿真时,为了方便,一般会编写.do文件来启动当前仿真.关于.do文件的编写,一般网上都有成型的模板,我们只要稍微改几个参数,就可以符合我们的仿真需求了.但是如果仿真时需 ...

  6. 用Modelsim SE 直接仿真 Altera(Intel PSG) IP核 需要注意的问题

    如果我们直接用Modelsim SE仿真 Altera IP核,首先会进入Quartus II目录下找到IP核对应的仿真库源文件,然后在Modelsim SE中进行编译,添加到Modelsim SE的 ...

  7. Xilinx ISE如何调用Modelsim进行联合仿真

    图: 在对设计的芯片进行测试时,经常要用到FPGA,可是里面的仿真工具却不如Modelsim那么好用,且在规模比较大时,ISE在仿真时,软件经常会报告内存限制的问题,此时一般会切换到Modelsim软 ...

  8. 使用Modelsim进行简单仿真

    这里记载一下使用modelsim进行简单的仿真,方便以后使用的时候进行查看.所谓的简单的仿真,就是没有IP核.只用图形界面不用tcl脚本进行的仿真.简单的仿真步骤为: 1.改变路径到工作环境下的路径下 ...

  9. Vivado关联Modelsim进行联合仿真

    Vivado自带仿真工具,但是有点慢,关联Modelsim联合仿真是最好的,注意Modelsim必须是10.7以上版本. 1.安装并成功破解Modelsim 10.7. 2.打开Vivado,点击 T ...

随机推荐

  1. [容器]python搭建简易服务器+docker导入多个镜像shell脚本

    从其他机器导出来的docker镜像,集中地放在某台上,其他的机器执行 curl xxx:8000/load_images.sh 来导入镜像,简单方便 使用python简易web服务器. (在镜像目录下 ...

  2. Html打印需要内容块(Js实现)

    首先在head里面加入下面一段js代码: function preview(oper) { ) { bdhtml = window.document.body.innerHTML; //获取当前页的h ...

  3. eclipse 建立maven项目 显示红叉的解决方法

    1.建立好之后就会发现项目有红叉. 这时发现查查在main处,打开项目>属性>Java Build Path>source,发现里边有红叉(如下图),这是由于我们的src/main下 ...

  4. 关于Python的Object继承

    今天在Coding的使用,使用了python的单例模式,发现了一个很有趣的问题. class x(object): __se = None a = None def __new__(cls): if ...

  5. 12:Web及MySQL服务异常监测案例

    [root@db01 scripts]# cat db_check.sh #!/bin/bash db_num=$(mysql -h172. -P3306 -uroot -poldboy123 -e ...

  6. Struts1标签

    Struts1 标签库  说明 Struts提供了五个标签库,即:HTML.Bean.Logic.Template和Nested. HTML 标签 : 用来创建能够和Struts 框架和其他相应的HT ...

  7. 优先队列——二项队列(binominal queue)

    [0]README 0.1) 本文文字描述部分转自 数据结构与算法分析, 旨在理解 优先队列——二项队列(binominal queue) 的基础知识: 0.2) 本文核心的剖析思路均为原创(inse ...

  8. 通过ssh隧道访问mysql(转载)

    我的机器可以连接服务器A,A可以访问服务器B上的mysql,但是我的机器不能访问B,所以我需要建立一个我本地机器到服务器A的ssh隧道来访问服务器B上的mysql. 理一下思路: 1.我要ssh的服务 ...

  9. 扩展mysql - 手把手教你写udf

    1 MySQL简介 MySQL是最流行的开放源码SQL数据库管理系统,相对于Oracle,DB2等大型数据库系统,MySQL由于其开源性.易用性.稳定性等特点,受到个人使用者.中小型企业甚至一些大型企 ...

  10. boost::lockfree::stack

    #include <boost/thread/thread.hpp> #include <boost/lockfree/stack.hpp> #include <iost ...