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, ... };
答案 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的pack
和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
在您的Specman文档中查找packing, unpacking, physical fields, packing.low, packing.high
。
即使结构未映射到DUT,您仍然可以使用物理字段。如果你的结构已经将物理字段用于其他目的,那么你需要为该结构采用某种set*
方法。