1

我在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 中向我展示的方法。sucli% 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。正如我所说,我真的想要一个更好的解决方案,但如果有人想使用我的功能,就在这里。

4

0 回答 0