Modelsim/QuestaSim教程——DO文件篇

如果你对Modelsim/QuestaSim还不是很熟悉,玩熟再来,点击转至《基础篇》。

你也可以在优酷看到演示的视频

下面介绍使用DO文件实现自动仿真的功能。

先给个参考的文件/目录路径,建议大家按照这样的路径来放置文件。

源代码在最后面,先介绍如何配置它。

一、设置好testbench文件名

不需要写后缀名,但必须是.v,.vt,.vhd,.vht文件(注意大小写)。

二、设置仿真时长。

三、自动编译文件或者使用文件列表。

当auto_add_file为1时,sim.do就会自动添加工程目录下的所有源文件,如果不希望它自动处理,可以把auto_add_file设为0,这样,sim.do会创建hdl_design_file_list.tcl文件(每一行前面加#号,代表不添加此文件)用于存放所有的源文件路径,然后还要使用af命令才能生效。

生成的文件列表,会跟工程目录下的一样(已经添加到工程的文件,前面没有#;未添加的,前面有#)。

四、设置备份工程的路径。

如果不需要备份工程的话,可以不管它。

五、设置显示器的分辨率,用于把wave窗口最大化。

六、设置源文件目录的路径。

请把你的源文件都放在工程目录下,do文件会自动找到工程目录下以及子目录下的所有.v,.vt,.vhd,.vht文件。注意这里的路径分隔符,是/,不是\。而且,一定要保留路径最后的/。

七、设置选择仿真库和仿真库的路径。

选择仿真库,这里可以选altera或者lattice。

设置仿真库路径:注意这里的路径分隔符,是/,不是\。路径最后不要加/。

八、选择工程所需的仿真库。

每一条lappend指令都对应着一个库,不需要该库可以注释掉(在前面加#号)。下图所示的是verilog仿真库。

下图所示的是vhdl仿真库。

九、介绍一些命令的别名。

ne新建工程,es加密源文件,ab添加仿真库,af添加文件,cf创建文件列表,cc编译修改过的源文件,cr清空控制台所有信息,ra执行仿真,df显示工程信息,dh显示帮助信息。所有命令的别名均只需左手就能输入了。

十、在wave窗口下,信号的进制、颜色等配置是可以复用的。

只需要在File->Save Format下,保存为wave.do文件(保存的路径要跟sim.do在同一目录下),这样sim.do就会优先读取wave.do文件的配置信号,再进行仿真。

wave.do必须在工程目录下(子目录无效),否则会读不了。

十一、默认的wave颜色和进制。

就算有了wave.do,但是信号太多的时候,第一次还要一个个设置是比较麻烦的,所以提供了默认的wave颜色和进制。

请注意:使用了默认颜色之后,Modelsim/QuestaSim原先的颜色无效了。这时,可以在Msgs下看到信号的状态

这里,rst对应橙色orange,而rst是正则表达式的关键词,也就是说,你把复位信号写成n_rst或者RST也能配对为橙色,不分大小写,其它关键词原理一样。这里提供了七种默认的关键词和颜色:

do文件的颜色可以设置为RGB形式(如"#F0F0F0"),也支持 X window的标准颜色名。

在set default_color命令下面,都是标准颜色名,以逗号分隔,使用时替换默认颜色(default_color)即可。

如果要修改关键词和进制(注释部分已提供进制的选项),可以在wave_style_set函数内部修改。

十二、显示工程相关信息。

使用df命令就可以显示工程相关的信息了。

十三、保存、载入vcd文件。

首先要用ra仿真,然后在控制台下输入sw,就直接把仿真后的波形保存为vcd文件(退出仿真之后才真正保存到波形),因为vcd相对于其它两种波形文件格式来说,更为通用些,所以只做这个功能,但是不建议使用do文件来保存,而是在testbench下使用系统函数来保存。

保存的vcd文件,如下图所示。

而aw后面加上vcd文件名,就可以载入vcd文件了(不需要写后缀.vcd)。

load_wave的功能有问题,请不要使用它。

十四、清空控制台的信息。

cr命令就可以清空了。

十五、加密源代码。

你可以使用es命令,把工程目录下所有的.v .vt .vhd .vht文件,都加密,并放在工程目录下的encrypt_src目录里面。

这样的话,就可以把一些IP加密了,但是最顶层的tb不要加密,不然没法看到波形了。

所以说,你把所有的已经加密好的其它文件,和不加密的tb文件都添加到工程,再用cc编译,ra运行仿真,就能看到波形了。

这样一来,你可以把你的源文件发到网上,让别人仿真,又不怕ip被偷了。加密后的文件,如下图所示。

注意,在使用加密命令之前得先把源代码编译通过。

十六、新建工程。

首先在前面设置好要新建的工程名和工程目录。

然后在控制台下面,使用ne命令后面跟着你要新建的工程名,即可以新建工程,并打开这个新工程,在新工程的路径下创建了src目录,和copy好sim.do文件。

效果如下图所示。

你还可以在以下命令下,修改新建工程的路径,但是必须使用do sim.do才能生效。

十七、输出报告。

如下图所示,使用wr命令,即可在工程目录下的report目录(自动创建)生成report.txt和instance.txt。

其中report.txt是生成的报告,里面有工程相关的信息,而instance.txt里面有仿真实例名。

使用show命令可以显示实例相关的信息,在instance.txt已经添加好show命令,只要copy一行到控制台里面运行就能看到结果了。

十八、备份工程。

如下图所示,br命令,后面要跟着你要添加的备注,一定要加双引号。

在备份目录下,就会备份当前的工程,以及增加一个README文件,这个文件里面的就是备注信息了。

十九、源代码。

请保存为sim.do文件,然后放在工程目录下。

######## this is a .do file running for modelsim or questasim ########
# you can copy the command as below to run it :


#           do sim.do


# testbench name without .v , .vt , .vhd , .vht
set testbench_name DDS_tb
# simulation time ; ns/us/ms/min
set sim_time 1us

# auto add files when $auto_add_file==1; add file list when $auto_add_file==0
quietly set auto_add_file 1

# project path
set prj_path D:/Projects/ProQuestaSim/DDS_sim/
# backup path
set bkp_path D:/Projects/ProQuestaSim/backup

# you can select "altera" or "lattice" device
quietly set device "altera"

# default wave color :         rst     clk      en    cnt    data     flag   default
quietly set default_color { "orange" "silver" "pink" "gold" "olive" "purple" "green" }
#################### standard X Window color name ####################
# alice blue, antique white, aqua, aquamarine, azure,
# beige, bisque, black, blanched almond, blue, blue violet, brown, burlywood,
# cadet blue, chartreuse, chocolate, coral, cornflower, cornsilk, crimson, cyan,
# dark blue, dark cyan, dark goldenrod, dark gray, dark green, dark khaki,
# dark magenta, dark olive green, dark orange, dark orchid, dark red,
# dark salmon, dark sea green, dark slate blue, dark slate gray, dark turquoise,
# dark violet, deep pink, deep sky blue, dim gray, dodger blue,
# firebrick, floral white, forest green, fuchsia,
# gainsboro, ghost white, gold, goldenrod, gray, green, green yellow,
# honeydew, hot pink, indian red, indigo, ivory, khaki,
# lavender, lavender blush, lawn green, lemon chiffon, light blue, light coral,
# light cyan, light goldenrod, light gray, light green,
# light pink, light salmon, light sea green, light sky blue, light slate gray,
# light steel blue, light yellow, lime, lime green, linen,
# magenta, maroon, medium aquamarine, medium blue, medium orchid, medium purple,
# medium sea green, medium slate blue, medium spring green, medium turquoise,
# medium violet red, midnight blue, mint cream, misty rose, moccasin
# navajo white, navy blue, old lace, olive, olive drab, orange, orange red, orchid,
# pale goldenrod, pale green, pale turquoise, pale violet red, papaya whip,
# peach puff, peru, pink, plum, powder blue, purple,
# rebecca purple, red, rosy brown, royal blue,
# saddle brown, salmon, sandy brown, sea green, seashell, sienna, silver,
# sky blue, slate blue, slate gray, snow, spring green, steel blue,
# tan, teal, thistle, tomato, turquoise, violet,
# wheat, white, white smoke, yellow, yellow green,
#######################################################################

# monitor resolution ratio , for example : 1920 x 1080
quietly set m_width 1920
quietly set m_height 1080

# altera simulation library path
quietly set altera_lib_path D:/altera/13.0sp1/quartus/eda/sim_lib
# lattice simulation library path
quietly set lattice_lib_path C:/lscc/diamond/1.4/cae_library/simulation

# add altera quartus simulation library
namespace eval lib_ns {
    proc lattice_lib_list {} {
        set lib_name {}
        # lappend lib_name ec
        # lappend lib_name ecp
        # lappend lib_name ecp2
        # lappend lib_name ecp3
        # lappend lib_name ecp5u
        # lappend lib_name lptm
        # lappend lib_name lptm2
        # lappend lib_name machxo
        lappend lib_name machxo2
        # lappend lib_name machxo3l
        # lappend lib_name pmi
        # lappend lib_name sc
        # lappend lib_name scm
        # lappend lib_name xp
        # lappend lib_name xp2
        return $lib_name
    }

    proc altera_verilog_lib_list {} {
        set lib_name {}
        ##################### verilog libraries ####################
        lappend lib_name 220model
        lappend lib_name altera_mf
        # lappend lib_name altera_primitives
        # lappend lib_name altera_primitives_quasar
        # lappend lib_name sgate
        # lappend lib_name arriagx_atoms
        # lappend lib_name arriagx_hssi_atoms
        # lappend lib_name arriaiigz_atoms
        # lappend lib_name arriaiigz_hssi_atoms
        # lappend lib_name arriaiigz_pcie_hip_atoms
        # lappend lib_name arriaii_atoms
        # lappend lib_name arriaii_hssi_atoms
        # lappend lib_name arriaii_pcie_hip_atoms
        # lappend lib_name arriavgz_atoms
        # lappend lib_name arriavgz_hssi_atoms
        # lappend lib_name arriavgz_pcie_hip_atoms
        # lappend lib_name arriav_atoms
        # lappend lib_name arriav_hssi_atoms
        # lappend lib_name arriav_pcie_hip_atoms
        # lappend lib_name cycloneiiils_atoms
        # lappend lib_name cycloneiii_atoms
        # lappend lib_name cycloneii_atoms
        # lappend lib_name cycloneive_atoms
        # lappend lib_name cycloneiv_atoms
        # lappend lib_name cycloneiv_hssi_atoms
        # lappend lib_name cycloneiv_pcie_hip_atoms
        # lappend lib_name cyclonev_atoms
        # lappend lib_name cyclonev_hssi_atoms
        # lappend lib_name cyclonev_pcie_hip_atoms
        # lappend lib_name cyclone_atoms
        # lappend lib_name hardcopyiii_atoms
        # lappend lib_name hardcopyii_atoms
        # lappend lib_name hardcopyiv_atoms
        # lappend lib_name hardcopyiv_hssi_atoms
        # lappend lib_name hardcopyiv_pcie_hip_atoms
        # lappend lib_name maxii_atoms
        # lappend lib_name maxv_atoms
        # lappend lib_name max_atoms
        # lappend lib_name stratixgx_atoms
        # lappend lib_name stratixgx_hssi_atoms
        # lappend lib_name stratixgx_mf
        # lappend lib_name stratixiigx_atoms
        # lappend lib_name stratixiigx_hssi_atoms
        # lappend lib_name stratixiii_atoms
        # lappend lib_name stratixii_atoms
        # lappend lib_name stratixiv_atoms
        # lappend lib_name stratixiv_hssi_atoms
        # lappend lib_name stratixiv_pcie_hip_atoms
        # lappend lib_name stratixv_atoms
        # lappend lib_name stratixv_hssi_atoms
        # lappend lib_name stratixv_pcie_hip_atoms
        # lappend lib_name stratix_atoms
        return $lib_name
    }

    proc altera_vhdl_lib_list {} {
        set lib_name {}
        ##################### vhdl libraries ####################
        # lappend lib_name 220pack
        # lappend lib_name 220model
        # lappend lib_name altera_europa_support_lib
        # lappend lib_name altera_lnsim_components
        # lappend lib_name altera_mf
        # lappend lib_name altera_mf_components
        # lappend lib_name altera_primitives
        # lappend lib_name altera_primitives_components
        # lappend lib_name altera_standard_functions
        # lappend lib_name altera_syn_attributes
        # lappend lib_name alt_dspbuilder_package
        # lappend lib_name arriagx_atoms
        # lappend lib_name arriagx_components
        # lappend lib_name arriagx_hssi_atoms
        # lappend lib_name arriagx_hssi_components
        # lappend lib_name arriaiigz_atoms
        # lappend lib_name arriaiigz_components
        # lappend lib_name arriaiigz_hssi_atoms
        # lappend lib_name arriaiigz_hssi_components
        # lappend lib_name arriaiigz_pcie_hip_atoms
        # lappend lib_name arriaiigz_pcie_hip_components
        # lappend lib_name arriaii_atoms
        # lappend lib_name arriaii_components
        # lappend lib_name arriaii_hssi_atoms
        # lappend lib_name arriaii_hssi_components
        # lappend lib_name arriaii_pcie_hip_atoms
        # lappend lib_name arriaii_pcie_hip_components
        # lappend lib_name arriavgz_atoms
        # lappend lib_name arriavgz_components
        # lappend lib_name arriavgz_hssi_atoms
        # lappend lib_name arriavgz_hssi_components
        # lappend lib_name arriavgz_pcie_hip_atoms
        # lappend lib_name arriavgz_pcie_hip_components
        # lappend lib_name arriav_atoms
        # lappend lib_name arriav_components
        # lappend lib_name arriav_hssi_atoms
        # lappend lib_name arriav_hssi_components
        # lappend lib_name cycloneiiils_atoms
        # lappend lib_name cycloneiiils_components
        # lappend lib_name cycloneiii_atoms
        # lappend lib_name cycloneiii_components
        # lappend lib_name cycloneii_atoms
        # lappend lib_name cycloneii_components
        # lappend lib_name cycloneive_atoms
        # lappend lib_name cycloneive_components
        # lappend lib_name cycloneiv_atoms
        # lappend lib_name cycloneiv_components
        # lappend lib_name cycloneiv_hssi_atoms
        # lappend lib_name cycloneiv_hssi_components
        # lappend lib_name cycloneiv_pcie_hip_atoms
        # lappend lib_name cycloneiv_pcie_hip_components
        # lappend lib_name cyclonev_atoms
        # lappend lib_name cyclonev_components
        # lappend lib_name cyclone_atoms
        # lappend lib_name cyclone_components
        # lappend lib_name hardcopyiii_atoms
        # lappend lib_name hardcopyiii_components
        # lappend lib_name hardcopyii_atoms
        # lappend lib_name hardcopyii_components
        # lappend lib_name hardcopyiv_atoms
        # lappend lib_name hardcopyiv_components
        # lappend lib_name hardcopyiv_hssi_atoms
        # lappend lib_name hardcopyiv_hssi_components
        # lappend lib_name hardcopyiv_pcie_hip_atoms
        # lappend lib_name hardcopyiv_pcie_hip_components
        # lappend lib_name maxii_atoms
        # lappend lib_name maxii_components
        # lappend lib_name maxv_atoms
        # lappend lib_name maxv_components
        # lappend lib_name max_atoms
        # lappend lib_name max_components
        # lappend lib_name sgate
        # lappend lib_name sgate_pack
        # lappend lib_name stratixgx_atoms
        # lappend lib_name stratixgx_components
        # lappend lib_name stratixgx_hssi_atoms
        # lappend lib_name stratixgx_hssi_components
        # lappend lib_name stratixgx_mf
        # lappend lib_name stratixgx_mf_components
        # lappend lib_name stratixiigx_atoms
        # lappend lib_name stratixiigx_components
        # lappend lib_name stratixiigx_hssi_atoms
        # lappend lib_name stratixiigx_hssi_components
        # lappend lib_name stratixiii_atoms
        # lappend lib_name stratixiii_components
        # lappend lib_name stratixii_atoms
        # lappend lib_name stratixii_components
        # lappend lib_name stratixiv_atoms
        # lappend lib_name stratixiv_components
        # lappend lib_name stratixiv_hssi_atoms
        # lappend lib_name stratixiv_hssi_components
        # lappend lib_name stratixiv_pcie_hip_atoms
        # lappend lib_name stratixiv_pcie_hip_components
        # lappend lib_name stratixv_atoms
        # lappend lib_name stratixv_components
        # lappend lib_name stratixv_hssi_atoms
        # lappend lib_name stratixv_hssi_components
        # lappend lib_name stratixv_pcie_hip_atoms
        # lappend lib_name stratixv_pcie_hip_components
        # lappend lib_name stratix_atoms
        # lappend lib_name stratix_components
        return $lib_name
    }
}

proc new_prj {new_prj_name} {
    global prj_path
    set new_prj_path D:/Projects/ProQuestaSim/$new_prj_name/

    quit -sim
    project close
    if { [file exists $new_prj_path]==0 } {
        file mkdir $new_prj_path
    }
    project new $new_prj_path $new_prj_name work
    if { [file exists $new_prj_path/src]==0 } {
        file mkdir $new_prj_path/src
    }
    file copy -force -- $prj_path/sim.do $new_prj_path
    puts "create new project successfully!"
    puts "current project path : "
    pwd
}

proc encrypt_src {} {
    global prj_path
    set encrypt_path $prj_path/encrypt_src/
    file mkdir $encrypt_path
    set paths {}
    set paths [glob -nocomplain -directory $paths */]
    lappend paths $prj_path
    foreach one_path $paths {
        set vfiles [glob -nocomplain -directory $one_path *.v *.vt]
        foreach one_file $vfiles {
            set one_file_path $prj_path
            vencrypt [append one_file_path $one_file] -d $encrypt_path -e v -quiet
        }
    }
    foreach one_path $paths {
        set vhdfiles [glob -nocomplain -directory $one_path *.vhd *.vht]
        foreach one_file $vhdfiles {
            set one_file_path $prj_path
            vhencrypt [append one_file_path $one_file] -d $encrypt_path -e vhd -quiet
        }
    }
    puts "encrypt HDL design file(s) successfully!"
}

proc add_lib {} {
    global altera_lib_path lattice_lib_path device
    vlib verilog_lib
    vmap verilog_lib verilog_lib
    if {$device == "altera"} {
        foreach lib_name [lib_ns::altera_verilog_lib_list] {
            vlog -work verilog_lib $altera_lib_path/$lib_name.v
        }
    } else {
        foreach lib_path [lib_ns::lattice_lib_list] {
            set vfiles [glob -nocomplain -directory $lattice_lib_path/verilog/$lib_path *.v]
            foreach one_file $vfiles {
                vlog -work verilog_lib $one_file
            }
        }
    }
    
    vlib vhdl_lib
    vmap vhdl_lib vhdl_lib
    if {$device == "altera"} {
        foreach lib_name [lib_ns::altera_vhdl_lib_list] {
            vcom -work vhdl_lib $altera_lib_path/$lib_name.vhd
        }
    } else {
        # vcom -work vhdl_lib $lattice_lib_path/vhdl/MACH_Components.vhd
        foreach lib_path [lib_ns::lattice_lib_list] {
            set vhdfiles [glob -nocomplain -directory $lattice_lib_path/vhdl/$lib_path *.vhd]
            foreach one_file $vhdfiles {
                # their something wrong with diamond vhdl library
                # vcom -work vhdl_lib $one_file
            }
        }
    }
    puts -nonewline "add "
    puts -nonewline $device
    puts " libraries successfully!"
}

proc create_file_list {} {
    global prj_path
    set prj_files [project filenames]

    set paths {}
    set paths [glob -nocomplain -directory $paths */]
    lappend paths $prj_path

    set fd [open $prj_path/hdl_design_file_list.tcl w+]
    foreach one_path $paths {
        set vfiles [glob -nocomplain -directory $one_path *.v *.vt *.vhd *.vht]
        foreach one_file $vfiles {
            set exists_num 0
            set one_file_path {}
            append one_file_path $prj_path
            append one_file_path $one_file
            foreach one_prj_file $prj_files {
                if {$one_file_path == $one_prj_file} {
                    incr exists_num
                }
            }
            if {$exists_num == 0} {
                puts -nonewline $fd "# "
            }
            puts $fd $one_file_path
        }
    }
    close $fd
    puts "create file list successfully!"
}

proc add_file {} {
    global prj_path auto_add_file
    set add_count 0
    set del_count 0
    set prj_files [project filenames]

    if {$auto_add_file == 1} {
        set paths [glob -nocomplain -directory $prj_path */]
        lappend paths $prj_path
        foreach one_path $paths {
            set vfiles [glob -nocomplain -directory $one_path *.v *.vt *.vhd *.vht]
            foreach one_file $vfiles {
                set exists_num 0
                foreach one_prj_file $prj_files {
                    if {$one_file == $one_prj_file} {
                        incr exists_num
                    }
                }
                if {$exists_num == 0} {
                    project addfile $one_file
                    incr add_count
                }
            }
        }
    } elseif {$auto_add_file == 0} {
        if {[file exists $prj_path/hdl_design_file_list.tcl] == 0 || \
            [file size $prj_path/hdl_design_file_list.tcl] <= 1} {
                create_file_list
        }
        set fd [open $prj_path/hdl_design_file_list.tcl r]
        set old_content [read -nonewline $fd]
        close $fd
        regsub -all " " $old_content {} new_content
        regsub -all \t+ $new_content {} new_content
        foreach one_file [split $new_content \n] {
            if {[regexp ^# $one_file] == 0 && $one_file != "\n"} {
                set exists_num 0
                foreach one_prj_file $prj_files {
                    if {$one_file == $one_prj_file} {
                        incr exists_num
                    }
                }
                if {$exists_num == 0} {
                    project addfile $one_file
                    incr add_count
                }
            } elseif {[regexp ^# $one_file] == 1 && $one_file != "\n"} {
                set one_file [string trim $one_file "#"]
                foreach one_prj_file $prj_files {
                    if { $one_file == $one_prj_file} {
                        project removefile $one_file
                        incr del_count
                    }
                }
            }
        }
    }
    puts -nonewline "add "
    puts -nonewline $add_count
    puts " file(s) successfully!"
    puts -nonewline "remove "
    puts -nonewline $del_count
    puts " file(s) successfully!"
}

proc compile_changed {} {
    project compileoutofdate
    puts "compile changed file(s) successfully!"
}

# radix types : binary, ascii, unsigned, decimal, octal, hex, symbolic, time, and default
proc wave_style_set {} {
    global testbench_name default_color
    foreach sig [find signals $testbench_name/*] {
        switch -regexp -nocase -- $sig {
            /*/*rst+     {add wave -radix binary     -color [lindex $default_color 0] $sig}
            /*/*clk+     {add wave -radix binary     -color [lindex $default_color 1] $sig}
            /*/*en+      {add wave -radix binary     -color [lindex $default_color 2] $sig}
            /*/*cnt+     {add wave -radix decimal    -color [lindex $default_color 3] $sig}
            /*/*data+    {add wave -radix hex        -color [lindex $default_color 4] $sig}
            /*/*flag+    {add wave -radix binary     -color [lindex $default_color 5] $sig}
            default      {add wave -radix hex        -color [lindex $default_color 6] $sig}
        }
    }
}

proc run_all {} {
    global testbench_name sim_time m_height m_width prj_path
    compile_changed
    quit -sim
    vsim -novopt -L verilog_lib -L vhdl_lib -l sim_log.log \
         +transport_int_delays +transport_path_delays work.$testbench_name
    if {[file exists $prj_path/wave.do] == 1} {
        do $prj_path/wave.do
    } else {
        wave_style_set
    }
    run $sim_time
    view -undock wave -x 0 -y 0 -width $m_width -height $m_height
    wave zoom full
}

proc backup_prj {msg} {
    global testbench_name bkp_path prj_path  
    set time [clock seconds]
    set bkp_name $testbench_name
    append bkp_name [clock format $time -format "_%Y-%m-%d-%H-%M-%S"]
    if { [file isdirectory $bkp_path] == 0 } {
        file mkdir $bkp_path
    }
    file mkdir $bkp_path/$bkp_name
    file copy -force $prj_path $bkp_path/$bkp_name
    append bkp_name "_README.txt"
    set fd [open $bkp_path/$bkp_name w+]
    puts $fd $msg
    close $fd
    puts "backup current project successfully!"
}

proc save_wave {} {
    global sim_time
    set time [clock seconds]
    set filename "sim_wave_"
    append filename [clock format $time -format "%Y-%m-%d-%H-%M-%S"]
    vcd add -dumpports -r -optcells -file $filename.vcd -internal -ports *
    run $sim_time
    vcd flush $filename.vcd
    vcd off $filename.vcd
}

proc load_wave {vcd_file} {
    append vcd_file ".vcd"
    wave import $vcd_file
}

proc write_report {} {
    global prj_path
    set report_path [append prj_path report]
    if {[file exists $report_path] == 0} {
        file mkdir $report_path
    }
    set txt_file "report.txt"
    write report -l $report_path/$txt_file

    set filename "instances"
    set fd [open $report_path/$filename.txt w+]
    puts $fd "instances :"
    puts $fd "\tshow -all"
    set linstances [find instances -r -nodu /*]
    foreach instance $linstances {
        puts -nonewline $fd \t
        puts -nonewline $fd "show "
        puts $fd $instance
    }
    close $fd
    puts "write report successfully!"
}

proc display_info {} {
    global testbench_name sim_time prj_path m_width m_height default_color device
    puts "========= infomation of current project ========="

    puts -nonewline "monitor resolution ratio : "
    puts -nonewline $m_width
    puts -nonewline "x"
    puts $m_height

    puts "\npreset signals color style"
    puts -nonewline "rst     signals color : "
    puts [lindex $default_color 0]
    puts -nonewline "clk     signals color : "
    puts [lindex $default_color 1]
    puts -nonewline "en      signals color : "
    puts [lindex $default_color 2]
    puts -nonewline "cnt     signals color : "
    puts [lindex $default_color 3]
    puts -nonewline "data    signals color : "
    puts [lindex $default_color 4]
    puts -nonewline "flag    signals color : "
    puts [lindex $default_color 5]
    puts -nonewline "default signals color : "
    puts [lindex $default_color 6]

    puts "\nHDL design files of project path : "
    set paths [glob -nocomplain -directory $prj_path */]
    lappend paths $prj_path
    foreach one_path $paths {
        set vfiles [glob -nocomplain -directory $one_path *.v *.vt *.vhd *.vht]
        foreach one_file $vfiles {
            puts $one_file
        }
    }

    puts -nonewline "\nloaded "
    puts -nonewline $device
    puts " simulation library list : "
    if {$device == "altera"} {
        foreach lib_name [lib_ns::altera_verilog_lib_list] {
            puts $lib_name.v
        }
        foreach lib_name [lib_ns::altera_vhdl_lib_list] {
            puts $lib_name.v
        }
    } else {
        foreach lib_name [lib_ns::lattice_lib_list] {
            puts $lib_name
        }
    }
    
    puts -nonewline "\ntestbench name : "
    puts $testbench_name

    puts -nonewline "\nsimulation time : "
    puts $sim_time
    puts "============= end of infomation ============="
}

proc do_help {} {
    echo "============ display help infomation ============"
    echo "alias ne = new_prj          : new a project"
    echo "alias es = encrypt_src      : encrypt all HDL design file(s)"
    echo "alias ab = add_lib          : add altera simulation library"
    echo "alias af = add_file         : add source files"
    echo "alias bc = backup_prj       : backup current project"
    echo "alias cf = create_file_list : create hdl design file list"
    echo "alias cc = compile_changed  : compile changed files including *.v , *.vt , *.vhd , *.vht"
    echo "alias cr = .main clear      : clear the tcl console"
    echo "alias ra = run_all          : compile_changed and simulate"
    echo "alias rr = run              : run"
    echo "alias sw = save_wave        : save simulation wave in a VCD file"
    echo "alias aw = load_wave        : load simulation wave from a VCD file"
    echo "alias wr = write_report     : write a report to a .txt file"
    echo "alias df = display_info     : echo information of current project"
    echo "alias dh = do_help          : echo help information of this do file"
    echo "============= end of help infomation ============="
}

################# TCL commands alias ##################
alias ne "new_prj"
alias es "encrypt_src"
alias ab "add_lib"
alias af "add_file"
alias br "backup_prj"
alias cf "create_file_list"
alias cc "compile_changed"
alias cr ".main clear"
alias rr "run"
alias ra "run_all"
alias sw "save_wave"
alias aw "load_wave"
alias wr "write_report"
alias df "display_info"
alias dh "do_help"
#######################################################

 

  • 17
    点赞
  • 176
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: ModelSimQuestasim都是Verilog和VHDL仿真工具,但是它们有一些区别: 1. Questasim是Mentor Graphics公司的产品,而ModelSim是Mentor Graphics公司的竞争对手Mentor Graphics公司的产品。 2. Questasim支持SystemVerilog,而ModelSim只支持Verilog和VHDL。 3. Questasim具有更好的性能和更高的仿真速度,因为它使用了更先进的仿真技术。 4. Questasim具有更好的调试功能,包括更好的波形查看器和调试器。 5. Questasim的价格比ModelSim更高,但它提供了更多的功能和更好的性能。 ### 回答2: ModelSimQuestasim都是常见的EDA工具,用于设计验证和仿真。其中,ModelSim基于Verilog和VHDL语言,而Questasim则支持更多种类的硬件描述语言,比如Verilog、VHDL、SystemVerilog和VHDL-AMS等。 首先,ModelSim是Mentor Graphics公司出品的仿真工具,只支持硬件描述语言的仿真,而Questasim则是MentorGraphics公司的HDLSim系列产品的升级版本,支持大多数硬件描述语言的仿真。简单来说,Questasim支持的语言更多。 其次,ModelSimQuestasim在仿真速度和性能上也有所不同。ModelSimQuestasim略慢,但与其他竞争产品相比,速度较快,因此在对速度要求较高的的项目中,ModelSim更为适合。 此外,ModelSimQuestasim在友好程度、仿真调试、仿真精度等方面也有所不同。例如,Questasim支持更全面的调试功能,因为它支持多种编程语言和进行复杂的仿真和调试操作。而ModelSim虽然无法像Questasim那样支持多种编程语言,但在仿真和调试方面更加简单直观。 综上所述,ModelSimQuestasim都是优秀的仿真工具,应根据具体项目需求来选择。如果您需要支持多种型号的仿真,并且对调试功能和高速运行更为看重,建议使用Questasim。如果您的项目的仿真速度较为关键,且您已建立了与ModelSim工具的基本技能,建议使用ModelSim。 总之,ModelSimQuestasim各有其优势和劣势,根据需要为您的工程选择最适合您的EDA工具。 ### 回答3: ModelsimQuestasim是常用的数字电路仿真软件,都是业界领先的仿真引擎。这两个软件在操作和功能方面都有不同之处,下面将从以下几个方面对其进行比较: 1. UI(用户界面) Modelsim的UI简洁明了,使用方便。Questasim的UI更加现代化,具有更多的调试、故障定位和分析功能。 2. 工程设计 在工程设计方面,两者都支持Verilog、VHDL等设计语言。但是,Questasim支持更多的设计语言和IP库,也能处理更大、更复杂的项目。Questasim还支持OVM和UVM这样的先进的验证方法。 3. 性能 在性能方面,QuestasimModelsim更快。Questasim支持更高的时序分辨率和更大的仿真规模,因此它更适合于大型项目的仿真。而在小型项目中,Modelsim可能更适合一些。 4. 结果分析 对于仿真结果的分析,Questasim提供更丰富的功能,比如支持使用Tcl脚本实现结果分析,该脚本能自动导出仿真结果图像、数据等。而在Modelsim中,这些功能需要用户自己实现。 总的来说,QuestasimModelsim更适合处理大型、复杂的项目,具有更好的性能和更丰富的功能。而对于小型项目,Modelsim可能更加方便实用。最终选择哪个仿真软件要根据具体的设计项目和个人需求来决定。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值