• ModelSim之TCL仿真


    在使用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,软件便开始自动运行进行仿真了。

    下面是仿真结果:

    wave

    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。

    wave2

    这时候建议将前面的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.仿真结果。

    图片1

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

  • 相关阅读:
    linux安装python3.6以后报错处理
    cent07设置服务开机自启
    python进程和线程中的两个锁
    针对Material主题怎么修改 phpstorm 代码编辑器的样式
    CentOS中zip工具的基本使用
    Anaconda退出Base环境
    微擎用户自动回复对应的链接、控制器、模板
    微擎应用模块中的参数设置对应的前端页面
    微擎设置借用权限
    微擎分配不同的用户具有不同应用的操作权限
  • 原文地址:https://www.cnblogs.com/aikimi7/p/3354637.html
Copyright © 2020-2023  润新知