我目前正在处理一个包含许多模块和子模块的大项目。是否可以(GUI 或 tcl 脚本)添加所有波并将其分组到树中,如模块树?
例如:模块 A 包括模块 b0、b1、b2、b3、...、b10。我想在 A 组内的单独地面上添加每个块 b0~b10。
我认为这是一种懒惰的做法,但它可能比许多使用 tcl 脚本配置要好。
我目前正在处理一个包含许多模块和子模块的大项目。是否可以(GUI 或 tcl 脚本)添加所有波并将其分组到树中,如模块树?
例如:模块 A 包括模块 b0、b1、b2、b3、...、b10。我想在 A 组内的单独地面上添加每个块 b0~b10。
我认为这是一种懒惰的做法,但它可能比许多使用 tcl 脚本配置要好。
我不是 Questa/Modelsim 专家,但我在 TCL 中做了一些工作,所以这只是我的做法。
这分为几个步骤;
1) 遍历设计层次结构
2) 创建分组
3) 将信号添加到组
1) 遍历设计
遍历模型本身,或者将所有信号添加到 wave 并遍历1.1) 您可以使用search wave -all signal_name
1.2)
选择+搜索事物,
或者您也可以使用 find instance /* 和遍历设计然后手动重复(等等find instance /top/* ...),然后您可以使用find signals/nets/.. YOUR_LEVEL找到网络/信号
2) 创建组
您可以通过在波形窗口中选择某些内容并执行“波形组名称”来创建组。
不太明显的是,您实际上可以做同样的事情,然后重新选择出现的“红色组菱形”并将其重新分组,从而创建一个子组
或者您也可以使用“ add 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]
由于您只想要一种自动方式在模拟中对设计进行递归分组,那么这里有一些我认为可以做到这一点的代码。它只是使用上述一些答案的一个实现,但我不想通过将其添加到其中来混淆上述答案,因此创建了这个单独的答案。
你想要做什么(想要的标题输出的手动视图)
add wave /top/*
add wave -group dut /top/dut/*
add wave -group dut -group subA /top/dut/subA/*
您可以使用 Questa/Modelsim查找命令和添加波形来做到这一点,就像上面显示的那样,带有一点 TCL 魔法。 请注意,“-noupdate”可以更快地添加大量信号,但完成后您需要调用波形刷新。
# 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
}
您当然可以改进这一点,让您只显示 N 个级别,或者甚至使用TCL的正则表达式只显示感兴趣的模块。但我把这个练习留给读者。