1

Specman には、列挙型変数の最初、最後、および次の値を取得する組み込みメソッドはありますか? 例えば:

type color_e: [blue, green, red, yellow, orange];`
        var color: color_e;

color = <want to assign first value of color_e>;  //blue
       …
        color = <next value>;     //which is green
4

3 に答える 3

3

列挙型のすべての値のリストを返す all_values() メソッドを使用できます。その後、必要に応じてリストを操作できます。

例:

 type color : [RED, BLUE, GREEN];
    extend color : [BLACK, CYAN];

    extend sys {
       run() is also {
         var x : color;
         foreach in all_values(color) {
            x = it;
            print x;
         };
     };
    };


Running the test ...
  x = RED
  x = BLUE
  x = GREEN
  x = BLACK
  x = CYAN
于 2014-08-03T06:13:46.760 に答える
1

( に加えてall_values())別の可能な解決策は、リフレクションを使用することです。が与えられたrf_enum場合、そのメソッドを呼び出してget_items()、すべての列挙項目のリストを取得できます。

ただし、refleciton ソリューションと にはいくつかの相違点がありall_values()、知っておくことが重要です。違いの 1 つは、一部の列挙項目に明示的な数値が与えられた場合 (必ずしも昇順であるとは限らない)、 は昇順でall_values()値を返しますがrf_enum.get_items()、宣言の順序で項目を返すことです。たとえば、次の場合:

type foo: [A=5, B, C=1, D];

次にall_values(foo)、C、D、A、B を (この順序で - それぞれの数値 1、2、5、6 に従って)rf_manager.get_type_by_name("foo").as_a(rf_enum).get_items()返しますが、A、B、C、D を返します。リフレクション結果を並べ替えたい場合数値によって、たとえば、行うことができますrf_manager.get_type_by_name("foo").as_a(rf_enum).get_items().sort(it.get_value())

もう 1 つの違いは、生成サブ範囲が異なる複数の列挙型が相互に基づいている場合all_values()、特定の型はその型の生成範囲に属する値のみを返しますが、rf_enum.get_items()すべてのアイテムを返すことです。例えば:

type t1: [A, B, C, D];
type t2: t1[A..B];
type t3: t2;
extend t2: [E];

この例でrf_enum.get_items()は、t1、t2、または t3 のいずれかに対して A、B、C、D、E を返します。ただしall_values()、各タイプの生成範囲に応じて、異なる結果が得られます。all_values(t1)A、B、C、D を返します。all_values(t2)A、B、E を返します。A 、all_values(t3)Bを返します。

于 2014-08-04T10:00:53.493 に答える
1

私は次のリフレクションソリューションを手に入れましたが、もっと簡単な方法があれば勝ちました。

<'

 ----------------------------------------------------------------------
 -- Define an enumerated type and populate
 ----------------------------------------------------------------------
  type color_e : [blue, green, red, yellow, orange];


  ----------------------------------------------------------------------
  -- Extend sys
  ----------------------------------------------------------------------
  extend sys {

  ----------------------------------------------------------------------
  -- Use the reflection facility to get the number of labels in an
  -- enumerated type
  ----------------------------------------------------------------------
  get_num_labels(enum_item: string) : int is {

    var size : int; -- number of labels defined in the enumerated type

    -- Find the type if defined
    for each (t) in rf_manager.get_user_types() { 
       if t is a rf_enum and t.get_name() == enum_item {
          -- return the size of the list
         result = t.as_a(rf_enum).get_items().size();
       }; // if t is a rf_en...
    }; // for each (t) in...
 }; // get_num_labels( ...

 ----------------------------------------------------------------------
 -- Use the reflection facility to return the value of the
 -- label defined in an enumerated type at a particular index
 ----------------------------------------------------------------------
   get_enum_label_value(enum_item: string, idx: int) : int is {

    var size : int; -- number of labels defined in the enumerated type

    -- Find the type if defined
    for each (t) in rf_manager.get_user_types() { 
       if t is a rf_enum and t.get_name() == enum_item {

          -- get the size of the list
          size = get_num_labels(enum_item);

          -- return the value of the item in the list at the specified index if legal
          if (idx < size) {
            result = t.as_a(rf_enum).get_items()[idx].get_value();
          } else {
            dut_errorf("Index requested is greater than the number of labels in the enumerated type %s\n",enum_item);
          };

       }; // if t is a rf_en...
    }; // for each (t) in...
 }; // get_enum_label_value( ...


 ----------------------------------------------------------------------
 -- Extend the run phase
 ----------------------------------------------------------------------
   run() is also {

     var color : color_e;
     var size  : int;

     size = get_num_labels("color_e");
     messagef (NONE, "Enumerated type color_e has %d labels, and they are...\n", size);

     for i from 0 to (size-1) {
        color = get_enum_label_value("color_e",i).as_a(color_e);
        messagef (NONE, "%s\n", color);
     }; -- for

   }; // run is also

 }; // extend sys

'>
于 2014-08-03T06:07:15.663 に答える