3

やあ、

次のようなコードが表示される既存のspecmanテストを拡張します。

struct dataset {
  !register : int (bits:16);
  ... other members
}

...

data : list of dataset;
foo : dataset;
gen foo;

foo.register = 0xfe;
... assign other foo members ...
data.push(foo.copy());

構造体のメンバーに1行で割り当てる方法はありますか?お気に入り:

foo = { 0xff, ... };
4

3 に答える 3

4

現在、すべてのメンバーを希望どおりに設定する直接的な方法は考えられませんが、変数を初期化する方法があります (構造体メンバーでも機能するかどうかはわかりません)。とにかく、次のようなものがあなたに合うかもしれません:

myfunc() is {
    var foo : dataset = new dataset with {
        .register = 0xff;
        .bar = 0xfa;
    }
    data.push(foo.copy());
}

newwithの詳細についてhelp new structは、specman プロンプトを参照してください。

それが役に立てば幸い!

于 2010-02-17T15:26:25.077 に答える
2

フィールドを名前で割り当てるというシンプルな美しさは、私が常に便利でコード化しても安全で読みやすい言語機能の 1 つです。

これは私がそれについて行く方法です:

struct s {
  a : int;
  b : string;
  c : bit;
};

extend sys {
  ex() is {
    var s := new s with {.a = 0x0; .b = "zero"; .c = 0;};
  };
  run() is also {
    var s;
    gen s keeping {.a == 0x0; .b == "zero"; .c == 0;};
  };
};

私もそうしdata.push(new dataset with {.reg = 0xff; bar = 0x0;});ますが、必要に応じて可読性フラグを上げることができます。

警告: unpack() の使用は完全に正しいですが (ross の回答を参照)、エラーが発生しやすい IMO です。unpack() を使用することを選択したすべての場所を (実際に実行されるコードで) 検証することをお勧めします。

于 2010-03-15T14:43:48.263 に答える
1

Specmanのpackand機能は、「物理フィールド」(修飾子の前に付けられたインスタンスメンバー)で直接使用できます。unpack%

例:

define FLOODLES_WIDTH 47;
type floodles_t : uint(bits:FLOODLES_WIDTH);

define FLABNICKERS_WIDTH 28;
type flabnickers_t : uint(bits:FLABNICKERS_WIDTH);

struct foo_s {
   %!floodle : floodles_t;
   %!flabnicker : flabnickers_t;
};

extend sys {
   run() is also {
      var f : foo_s = new;
      unpack(packing.low,64'hdeadbeefdeadbeef,f);
      print f;

      unpack(packing.low,64'hacedacedacedaced,f);
      print f;

   };
   setup() is also {
      set_config(print,radix,hex);
   };
};

これを実行すると、次のように出力されます。

Loading /nfs/pdx/home/rbroger1/tmp.e ...
read...parse...update...patch...h code...code...clean...
Doing setup ...
Generating the test using seed 1...

Starting the test ...
Running the test ...
  f = foo_s-@0: foo_s   of unit: sys
        ----------------------------------------------  @tmp
0       !%floodle:                      0x3eefdeadbeef
1       !%flabnicker:                   0x001bd5b
  f = foo_s-@0: foo_s   of unit: sys
        ----------------------------------------------  @tmp
0       !%floodle:                      0x2cedacedaced
1       !%flabnicker:                   0x00159db

Specmanpacking, unpacking, physical fields, packing.low, packing.highドキュメントで調べてください。

構造体がDUTにマップされていない場合でも、物理フィールドを使用できます。構造体がすでに他の目的で物理フィールドを使用している場合は、その構造体に対して何らかのset*方法を追求する必要があります。

于 2010-02-17T17:28:41.247 に答える