Specman soft select 变量、十进制值与十六进制值
Specman soft select on variable, decimal vs. hexadecimal values
这里有两个类似的约束块,一个是十进制写法,一个是十六进制写法。第一个按预期工作,但第二个仅生成 5 个可用值中的正值(包括 0):
-- positive and negative values generated as expected
var rnd_byte : int(bits: 8);
for i from 0 to 9 {
gen rnd_byte keeping {
soft it == select {
90 : [-1, -128 , 127, 1];
10 : 0x00;
};
};
print rnd_byte;
};
-- only positive values (including 0) generated!!!
var rnd_byte : int(bits: 8);
for i from 0 to 9 {
gen rnd_byte keeping {
soft it == select {
90 : [0xFF, 0x80, 0x7F, 0x01];
10 : 0x00;
};
};
print rnd_byte;
};
如何使第二个示例的行为与第一个示例相同,但保留十六进制表示法。我不想写大的十进制数。
0xff 和 0x80 不在 rnd_byte 数据类型的范围内。您需要将 rnd_byte 声明为 uint(bits:8).
或者,尝试对文字进行类型转换(我无法验证语法):
(0xff).as_a(int(bits:8))
关于这个问题的更多信息 - 程序代码有自动转换。所以你可以写
var rnd_byte : int( bits : 8);
rnd_byte = 0xff;
结果为 rnd_byte == -1.
约束与 int(位:8)语义一起工作,此代码将失败:
var rnd_byte : int( bits : 8);
gen rnd_byte keeping {it == 0xff};
按照建议 - 为了获得 0xff - 将字段定义为无符号。
在过程代码中,数字类型之间的自动转换处理了绝大多数情况。然而,在世代中,数字是通过它们的自然值来看待的,就像在 int(bits:*) 语义中一样。十六进制表示法表示该值是无符号的。
这里有两个类似的约束块,一个是十进制写法,一个是十六进制写法。第一个按预期工作,但第二个仅生成 5 个可用值中的正值(包括 0):
-- positive and negative values generated as expected
var rnd_byte : int(bits: 8);
for i from 0 to 9 {
gen rnd_byte keeping {
soft it == select {
90 : [-1, -128 , 127, 1];
10 : 0x00;
};
};
print rnd_byte;
};
-- only positive values (including 0) generated!!!
var rnd_byte : int(bits: 8);
for i from 0 to 9 {
gen rnd_byte keeping {
soft it == select {
90 : [0xFF, 0x80, 0x7F, 0x01];
10 : 0x00;
};
};
print rnd_byte;
};
如何使第二个示例的行为与第一个示例相同,但保留十六进制表示法。我不想写大的十进制数。
0xff 和 0x80 不在 rnd_byte 数据类型的范围内。您需要将 rnd_byte 声明为 uint(bits:8).
或者,尝试对文字进行类型转换(我无法验证语法):
(0xff).as_a(int(bits:8))
关于这个问题的更多信息 - 程序代码有自动转换。所以你可以写
var rnd_byte : int( bits : 8);
rnd_byte = 0xff;
结果为 rnd_byte == -1.
约束与 int(位:8)语义一起工作,此代码将失败:
var rnd_byte : int( bits : 8);
gen rnd_byte keeping {it == 0xff};
按照建议 - 为了获得 0xff - 将字段定义为无符号。
在过程代码中,数字类型之间的自动转换处理了绝大多数情况。然而,在世代中,数字是通过它们的自然值来看待的,就像在 int(bits:*) 语义中一样。十六进制表示法表示该值是无符号的。