Как правильно проверить совпадение выражений после отложенного присваивания? - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть циклический буфер, управляемый переменными head и tail:

reg[BITS:0] head;
reg[BITS:0] tail;

В какой-то момент есть

tail <= tail+1;
if (tail+1 == head)
  // do something
end

В случае, если tail + 1 переполняется и оборачивается вокруг этого оператора if не срабатывает Я думаю, что причина в том, что "tail + 1" автоматически не округляется до BITS + 1 ширина.

Как правильно написать такой код, чтобы "tail + 1 == head" был бы вычисляется со значениями ширины BITS + 1, как это было бы сделано в оборудовании, которое описывает этот код?

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Проблема в том, что +1 интерпретируется как +32'sd1 (32-разрядное число со знаком). Вам необходимо создать операнд, чтобы дополнительные биты не добавлялись

parameter [BITS:0] one = 1;

Тогда результат (tail+one) остается в битах + 1 ширина.

В SystemVerilog вы можете использовать простое приведение BITS'(tail+1).

0 голосов
/ 13 февраля 2020

Кроме того, вы можете маскировать выражения:

parameter MASK = (1 << (BITS+1)) - 1;

// ...

if (((tail+1) & MASK) == (head & MASK))
    // do something
end
...