tcl提供dump配置

一般我们会在tb的里面控制波形的dump与否,并设置dump的层次和深度。当仿真时间长时,可能需要修改dump的多与少,而直接修改这些代码需要重新编译,耗时耗力。其实可以用tcl脚本来做这个控制。

在仿真参数是增加如下参数,会在仿真开始时调用start.tcl

1
simv [opt] -ucli -i start.tcl

start.tcl如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
set cfg_fn "$env(CURDIR)/dump.cfg"
set tcl_fn "$env(CURDIR)/run.tcl"

if {"$env(DUMPWAVE)" != 0} {
call {$fsdbDumpfile("test.fsdb")}
if {[file exists $cfg_fn]} {
set fp [open $cfg_fn "r"]
set line 1
while { [gets $fp data] >= 0 } {
set data [string trim $data]
if { [string match {#*} $data ] == 0 } {
set fields [split $data ","]
if { [llength $fields] == 1 } {
set name [lindex $fields 0]
call "\$fsdbDumpvars(0,$name,\"+all\")"
} elseif { [llength $fields] == 2 } {
set name [lindex $fields 0]
set depth [lindex $fields 1]
call "\$fsdbDumpvars($depth,$name,\"+all\")"
} else {
error "config syntax error. please use \"depth, path\". line \[$line\]: $data"
}
}
incr line
}
close $fp
} else {
call {$fsdbDumpvars("+all")}
}
call {$fsdbDumpflush}
}

if {[file exists $tcl_fn]} {
do $tcl_fn
}
run

脚本中,有用到两个环境变量,$env(CURDIR) 和 $env(DUMPWAVE)。这个可以在makefile中传递进来。

1
2
3
4
DUMP=0
CURDIR=tests/xxx
run:
export DUMPWAVE=$(DUMP);export CURDIR=$(CURDIR);simv opt -ucli -i start.tcl

其中DUMPWAVE表示是否要dump波形;CURDIR表示每个用例的目录,这样可以每个用例指定一个dump.cfg,单独控制每个用例需要dump的层次和深度。

该tcl流程:

当DUMPWAVE不为0时,dump波形。如果cfg文件存在,则开始解析cfg文件;如果cfg文件不存在,默认dump所有层次的波形。

cfg文件格式是:

  1. #开头的是注释
  2. 如果只有一个参数,则认为是层次
  3. 如果有两个参数,则认为第一个是层次,第二个是深度
1
2
3
# this is comment
top_tb.dut
top_tb.dut, 1

脚本33-35行,如果run.tcl存在的话,就调用该tcl,这样可以在前面配置文件需求满足不了的时候,将tcl直接写在run.tcl里面。

1
2
call {$fsdbDumpSVA()}
call {$fsdbDumpMDA(1000,top_tb.dut.mem,"+fsdbfile+test.fsdb")}