如何添加所有Modelsim波形?

时间:2012-10-11 06:01:41

标签: modelsim

我目前正在处理一个包含许多模块和子模块的大项目。是否有可能(GUI或tcl脚本)添加所有wave并将其分组到树中,如模块树?

例如:模块A包括模块b0,b1,b2,b3,...,b10。我想在A组内的分离地面上添加每个块b0~b10。

我认为这是一种懒惰的方式,但它可能比许多配置tcl脚本更好。

2 个答案:

答案 0 :(得分:3)

我不是Questa / Modelsim专家,但我在TCL中做了一些,所以这只是我的方法。

这分为几个步骤;
1)遍历设计层次结构
2)创建分组
3)向组添加信号

1)遍历设计
要么遍历模型本身,要么添加所有信号以进行波动和遍历  1.1)您可以使用搜索wave -all signal_name 选择+搜索内容  1.2)或者您也可以使用find instance / *遍历设计,然后手动重复(等查找实例/ top / * ... )然后您可以使用查找信号/网络/ .. YOUR_LEVEL

2)创建群组 您可以通过在波形窗口中选择一些内容并执行“ wave group name ”来创建一个组。

不那么明显的是你可以做同样的事情然后重新选择出现的'红色组菱形'并重新组合它从而创建一个子组

或者您也可以使用“添加wave -group G1 -group G2 ”指定子组

3)向组添加信号
您可以使用常规“ add -position N wave signal_name

添加信号

其他有帮助的部分;
a)在波形窗口中选择事物

set WAVEWIN [view wave]
$WAVEWIN.tree.tree1 curselection
$WAVEWIN.tree.tree1 selection clear all
$WAVEWIN.tree.tree1 selection set 1 2 etc

b)从所选项目中获取信号名称

# gets its signal name "sim:/path/to/sig"
set SIGPATH $WAVEWIN.tree.tree1 get 1

c)我可能会评论说,将所有信号添加到同一个波形窗口可能会变得非常难以管理,所以您可能还想考虑添加到单独的波形窗口中?

set WAVEWIN [view -new wave]

答案 1 :(得分:1)

由于您只想以自动方式在模拟中对设计进行递归分组,因此这里有一些代码我认为会这样做。它只是一个实现使用上面的一些答案,但我不想混淆上面的答案,将其添加到其中,因此创建了这个单独的答案。

你想做什么(手动查看想要的输出)

add wave                         /top/*
add wave -group dut              /top/dut/*
add wave -group dut -group subA  /top/dut/subA/*

您可以使用Questa / Modelsim 查找命令和添加wave ,就像上面显示的TCL魔法一样。 注意'-noupdate'可以更快地添加大量信号,但完成后需要调用 wave refresh

# Kick everything off from here.
proc add_wave_groupedrecursive { } {
  add_wave_breadthwiserecursive "" ""

  # Added all signals, now trigger a wave window update
  wave refresh
}

proc add_wave_breadthwiserecursive { instance_name prev_group_option } {
    # Should be a list something like "/top/inst (MOD1)"
    set breadthwise_instances [find instances $instance_name/*]

    # IFF there are items itterate through them breadthwise
    foreach inst $breadthwise_instances {
      # Separate "/top/inst"  from "(MOD1)"
      set inst_path [lindex [split $inst " "] 0]

      # Get just the end word after last "/"
      set gname     [lrange [split $inst_path "/"] end end]

      # Recursively call this routine with next level to investigate
      add_wave_breadthwiserecursive  "$inst_path"  "$prev_group_option -group $gname" 
    }

    # Avoid including your top level /* as we already have /top/*
    if { $instance_name != "" } {
        # Echo the wave add command, but you can turn this off
        echo add wave -noupdate $prev_group_option "$instance_name/*"

        set CMD "add wave -noupdate $prev_group_option $instance_name/*"
        eval $CMD
    }

    # Return up the recursing stack
    return
}

您当然可以改进这一点,以便您只使用TCL中的正则表达式来显示N个级别,甚至可能只显示感兴趣的模块。但是我把这个练习留给了读者。