Предположим, что у меня есть два логических вектора:
logic [4:0] a;
logic [4:0] b;
которые содержат 2 дополнительные значения. Я хочу выполнить вычитание и расширить результат на 1 бит. Например, предположим, что я хочу вычислить -12 - 13
и сохранить результат -25
:
logic [5:0] sum;
sum = a - b;
Вышеприведенное имитирует, как я ожидаю, и я получаю ожидаемое значение 6'b100111
. Работаем с этим вручную:
1 0 1 0 0 -12
1 0 0 1 0 invert bits of +13
1 carry-in
---------------
1 0 0 1 1 1 = -25
Таким образом, MSB результата — это просто перенос сложения. Однако, если я вычисляю 12 - 13
, результат должен быть 6'b111111
, но вместо этого я получаю смоделированный результат 6'b011111
. Работаем с этим примером вручную:
0 1 1 0 0 12
1 0 0 1 0 invert bits of +13
1 carry-in
---------------
0 1 1 1 1 1 = +31
Таким образом, результат неверный, так как перенос в MSB равен нулю.
Я могу исправить смоделированный результат, изменив RTL следующим образом:
logic [5:0] sum;
sum = $signed(a) - $signed(b);
который возвращает ожидаемый результат 6'b111111
. Прочитав SystemVerilog LRM, чтобы понять, что здесь происходит, я обнаружил, что сложения выполняются с битовым размером самого большого операнда, включая LHS операций присваивания. Кроме того, использование ключевого слова $signed
приводит к тому, что 5-битные входные операнды расширяются по знаку до 6-битных. Принимая это во внимание и снова выполняя операцию вручную:
[0] 0 1 1 0 0 12
[1] 1 0 0 1 0 invert bits of +13
1 carry-in
---------------
1 1 1 1 1 1 = -1
где [0]
и [1]
— биты расширения знака. Отсюда видно, что MSB фактически вычисляется полным сумматором ([0] + [1] + carry-out from previous column
).
Мой вопрос таков:
- Правильно ли я считаю, что сумматор со знаком действительно требует полного сумматора в старшем бите для вычисления правильного результата?
- Если вышесказанное верно, что сделает из этого инструмент синтеза? Будет ли он также знать, что нужно создать экземпляр полного сумматора на MSB?
Я всегда предполагал, что написание сумматора в SystemVerilog, где входные данные имеют ширину n бит, приведет к тому, что инструмент синтеза создаст экземпляр n-битного сумматора, где (n + 1)-битный вывод будет просто переносом этого сумматор.