【问题标题】:Specman soft select on variable, decimal vs. hexadecimal valuesSpecman 对变量、十进制与十六进制值的软选择
【发布时间】:2018-12-06 06:32:41
【问题描述】:

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

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

【问题讨论】:

    标签: verification hdl specman e


    【解决方案1】:

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

    【讨论】:

      【解决方案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 - 将字段定义为无符号。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2018-07-26
          • 2011-12-09
          • 2011-02-27
          • 2014-07-31
          • 2011-10-11
          • 1970-01-01
          • 2014-04-20
          • 2014-11-30
          相关资源
          最近更新 更多