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:*) 语义中一样。十六进制表示法表示该值是无符号的。