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 には enum 名を出力する機能があることは知っていますが、DVE では確かに出力できますが、ucli で表示する方法を考え出すのに苦労しています。sucli% call {$display("%s", s.name())}

照会時に番号の代わりに enum 名を出力するように ucli を取得する方法を知っている人はいますか? 列挙型の基数はどういうわけか(DVEのようにユーザー定義?)、SystemVerilogシステムコールを使用して名前を取得しますか?

(注、DVE を使用できることは理解していますが、ucli を潜在的なユーザー向けのインターフェイスとして使用しようとしています。これは教育目的であり、多くの ucli インターフェイス (および一般的な VCS インターフェイス) をマスクしたいと考えています)。学生を圧倒せず、いくつかの変数を簡単に取得するために;私はvcs ucliを単純なプロセッサシミュレータに変えています)

++++++++++++ 更新 ++++++++++++

私は非常にハックな解決策を思いつきましたが、もっと良いアプローチが本当に欲しいです。-radix enum が設定されている場合、-value を enum 名に置き換えます。

#
# 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