Мягкий выбор Specman для переменных, десятичных и шестнадцатеричных значений - PullRequest
0 голосов
/ 27 июня 2018

Вот два похожих блока ограничений, один из которых записан с использованием десятичной записи, а другой - с использованием шестнадцатеричной записи. Первое работает как положено, но второе генерирует только положительные значения (включая 0) из 5 доступных значений:

-- 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 ]

0 голосов
/ 28 июня 2018

еще немного об этой проблеме - с процедурным кодом происходит автоматическое приведение. так что вы можете написать

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 - определить поле как беззнаковое.

0 голосов
/ 28 июня 2018

В процедурном коде автоматическое приведение между числовыми типами обеспечивает абсолютное большинство случаев. Тем не менее, в числах поколения рассматриваются их естественные значения, как в семантике int (bits: *). Шестнадцатеричная запись означает, что значение не подписано.

0 голосов
/ 28 июня 2018

0xff и 0x80 не находятся в диапазоне типа данных rnd_byte. Вы должны объявить rnd_byte как uint(bits:8). В качестве альтернативы, попробуйте ввести литералы (я не смог проверить синтаксис): (0xff).as_a(int(bits:8))

...