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());

有没有办法在一行中分配给结构的成员?喜欢:

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

3 回答 3

4

我目前想不出一种直接设置所有成员的方法,但是有一种方法可以初始化变量(我不确定它是否也适用于结构成员)。无论如何,以下内容可能适合您:

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

您可以从 specman 提示符中找到有关newwith的更多信息。help new struct

希望能帮助到你!

于 2010-02-17T15:26:25.077 回答
2

按名称分配字段的简单优点是我一直认为有用的语言功能之一,代码安全且可读。

这就是我的做法:

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 的packandunpack功能与“物理场”(那些以修饰符前缀的实例成员%)一起使用。

例子:

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

packing, unpacking, physical fields, packing.low, packing.high在您的 Specman 文档中查找。

即使结构没有映射到 DUT,您仍然可以使用物理字段。set*如果您的结构已经将物理字段用于其他目的,那么您需要为该结构寻求某种方法。

于 2010-02-17T17:28:41.247 回答