代码之家  ›  专栏  ›  技术社区  ›  evilpascal

specman软选择变量,十进制与十六进制值

  •  1
  • evilpascal  · 技术社区  · 7 年前

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

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

    3 回复  |  直到 7 年前
        1
  •  2
  •   user3467290    7 年前

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

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

    约束使用int(bits:8)语义,此代码将失败:

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

        2
  •  2
  •   Thorsten    7 年前

    0xFF和0x80不在RND U字节数据类型的范围内。您需要将RND字节声明为 uint(bits:8). (0xff).as_a(int(bits:8))

        3
  •  1
  •   Rodion Melnikov    7 年前

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