Specman e: Есть ли способ ограничить количество установленных битов в числе?

У меня есть поле единицы измерения events:

events:uint;

Значения events не так интересны, как количество установленных битов в нем. Я хотел бы ограничить диапазоны количества установленных битов в events. Есть ли способ сделать это? Спасибо за помощь.


person Halona    schedule 27.11.2014    source источник


Ответы (3)


Возможно, есть более простой способ сделать это, но вы можете использовать битовую нарезку, чтобы ограничить список uint равным битам вашей переменной, и использовать sum для ограничения их количества.

Следующий пример делает то, что вам нужно (для краткости ограничен 4-битной переменной):

<'
extend sys {
    events : uint(bits:4);
    b: list of uint(bits:1);
    keep b.size() == 4;

    keep b[0] == events[0:0];
    keep b[1] == events[1:1];
    keep b[2] == events[2:2];
    keep b[3] == events[3:3];

    keep (b.sum(it) == 2);
};
'>

Записывать все ограничения, вероятно, немного некрасиво, но это легко сделать с помощью макроса define as computed.

person Kalev    schedule 27.11.2014

Операции [..] и %{} не являются генеративными, поэтому они рассматриваются как входные данные в ограничениях.

Ограничение:

keep events_bits == events[..];

эквивалентно:

keep events_bits == read_only(events[..]);

Генератор сгенерирует events и только после этого применит ограничения на `events_bits.

Вы можете сделать следующее:

extend sys {
    events : uint;
    events_bits_on [32] : list of bool;
    keep for each in events_bits_on {
        it == (events[index:index] == 1);
    };
    keep events_bits_on.count(it) == 2;
};
person Amit M.    schedule 01.12.2014

Это только частичный ответ.

Вы можете использовать events[..] или %{events} для преобразования вектора в список, содержащий биты этого вектора. Использование его непосредственно в ограничении напрямую не работает, потому что он жалуется на отсутствие генеративного элемента:

extend sys {
  events : uint(bits:4);

  // neither of these compile
  keep events[..].sum(it) == value(2);
  keep %{events}.sum(it) == value(2);
};

Это, вероятно, случай для Cadence.

Однако разрешено создавать промежуточный список и назначать его выходу любого из этих операторов:

extend sys {
  events_bits : list of bit;
  keep events_bits == events[..];
};

Вы могли бы подумать, что затем можете ограничить этот список определенным количеством единиц:

extend sys {
  // these constraints apply, but aren't enforced
  keep events_bits.sum(it) == value(2);
  keep events_bits.count(it == 1) == value(2);
};

Однако это не работает. Несмотря на то, что ограничения есть, они по какой-то причине не применяются. Это еще одна проблема, на которую стоит обратить внимание Cadence.

Подводя итог, если бы этих проблем не было, вы, вероятно, могли бы легко сосчитать их количество. Возможно, в будущей версии Specman. Я все еще надеюсь, что, по крайней мере, наблюдение за существованием операторов [..] и %{} поможет вам в других вещах.

person Tudor Timi    schedule 27.11.2014