1

这里有两个类似的约束块,一个使用十进制表示法,另一个使用十六进制表示法。第一个按预期工作,但第二个仅在 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;
};

如何使第二个示例与第一个示例一样,但保留十六进制表示法。我不想写大的十进制数。

4

3 回答 3

2

0xff 和 0x80 不在 rnd_byte 数据类型的范围内。您需要将 rnd_byte 声明为uint(bits:8). 或者,尝试对文字进行类型转换(我无法验证语法): (0xff).as_a(int(bits:8))

于 2018-06-28T07:08:27.833 回答
2

关于这个问题的更多信息 - 程序代码有自动转换。所以你可以写

var rnd_byte : int( bits : 8);
rnd_byte = 0xff;

它将导致 rnd_byte == -1。

约束与 int (bits :8 ) 语义一起使用,并且此代码将失败:

var rnd_byte : int( bits : 8);
gen rnd_byte keeping {it == 0xff};

正如建议的那样 - 为了获得 0xff - 将该字段定义为无符号。

于 2018-06-28T07:49:48.680 回答
1

在过程代码中,数字类型之间的自动转换处理了绝大多数情况。然而,在世代中,数字是通过它们的自然值来查看的,就像在 int(bits:*) 语义中一样。十六进制表示法表示该值是无符号的。

于 2018-06-28T10:51:37.047 回答