我在VCS UCLI(即命令行界面)中工作,并且无法让VCS 显示typedef 枚举类型的各种状态变量,值作为名称而不是数字。例如,我有一些这样的 SystemVerilog:
typedef enum logic [1:0] {A, B, C} state_t;
state_t s;
...
现在在 ucli 中,我想查看s
(说它处于状态 A)的值,所以我输入如下内容:
ucli% get s
0
ucli% get s -radix symbolic
0
ucli% show s -value
s 0
ucli% show s -value -radix symbolic
s 0
ucli% show s -value -type
s 0 { ENUM state_t { {A 0} {B 1} {C 2} } }
(或类似的东西)。我已经阅读了 ucli 用户指南,它似乎是符号基数,我所知道的唯一一个可能是接近的,它只使用来自枚举的原始值,而不是枚举名称。我曾尝试使用 ucli ( ) 中的 call 命令调用.name()
变量的方法,但似乎不支持。我知道 VCS 具有打印枚举名称的能力,它在 DVE 中当然可以,但是我无法想出在 ucli 中向我展示的方法。s
ucli% call {$display("%s", s.name())}
有谁知道如何让 ucli 在查询时打印枚举名称而不是数字?枚举类型基数是否以某种方式(用户在 DVE 中定义?),使用一些 SystemVerilog 系统调用来获取名称,诸如此类?
(注意,我知道我可以只使用 DVE,但我试图使用 ucli 来简化潜在用户的界面,这是出于教育目的,我想屏蔽很多 ucli 界面(以及一般的 VCS 界面)不要让学生不知所措并容易获得一些变量;我将 vcs ucli 变成了一个简单的处理器模拟器)
++++++++++++++更新++++++++++++
我想出了一个非常老套的解决方案,但我真的想要一个更好的方法。我很快为 show 编写了自己的包装器(称为 eshow),如果设置了 -radix enum,我将用枚举名称替换任何 -value:
#
# An extension of show to include "-radix enum"
#
# Borrowed from http://wiki.tcl.tk/17342
# Credit to Richard Suchenwirth (12-8-2006)
proc getopt {_argv name {_var ""} {default ""}} {
upvar 1 $_argv argv $_var var
set pos [lsearch -regexp $argv ^$name]
if {$pos>=0} {
set to $pos
if {$_var ne ""} {
set var [lindex $argv [incr to]]
}
set argv [lreplace $argv $pos $to]
return 1
} else {
if {[llength [info level 0]] == 5} {set var $default}
return 0
}
}
proc eshow {args} {
set argv $args
# If radix is not specified or value is not specified, then dont bother doing anything but regular show
if { 0 == [getopt argv -radix radix] } {
return [eval show $args]
}
if { 0 == [getopt argv -value] } {
return [eval show $args]
}
# If radix isnt enum, just pass off to regular show
if { 0 == [string equal -nocase $radix "enum"] } {
return [eval show $args]
}
# Now get the signal, its value and its type
set var [lindex [eval show $argv] 0]
set val [lindex [show $var -value] 1]
set typ [lindex [show $var -type] 1]
# If the type isnt an enum, error
if { 0 == [string equal -nocase [lindex $typ 0] "ENUM"] } {
return "The type of variable $var is not an enumerated type"
}
# Process the enumerations
set enuml [lindex $typ 2]
# Find the value name
foreach v $enuml {
if { $val == [lindex $v 1] } {
set enumname [lindex $v 0]
break
}
}
# If could not be found....
if { 0 == [info exists enumname] } {
return "The variabel $var has a value which does not map"
}
# Get rid of radix from args
getopt args -radix trashcan
# Replace all values with the name
set retval [eval show $args]
set retshow $retval
foreach v [lsearch -all $retval $val] {
set retshow [lreplace $retshow $v $v $enumname]
}
return $retshow
}
因此,如果我键入任何其他非基数枚举 eshow 命令,它将传递给 show,但否则,它将用它们的名称替换所有值并返回与替换相同的东西 show。正如我所说,我真的想要一个更好的解决方案,但如果有人想使用我的功能,就在这里。