specman:在一个表达式中分配多个struct成员

时间:2010-02-17 14:25:42

标签: specman

HY,

我扩展了现有的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, ... };

3 个答案:

答案 0 :(得分:4)

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

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

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

希望它有所帮助!

答案 1 :(得分: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()的每个地方验证(使用实际运行的代码)。

答案 2 :(得分:1)

您可以直接使用Specman的packunpack工具和“物理字段”(这些实例成员以修饰符%为前缀)。

示例:

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

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

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