почему для двоичного вычитания не установлен флаг переполнения? - PullRequest
0 голосов
/ 02 мая 2018

У меня есть базовый бинарный математический вопрос. Например;

reg [31:0] a = 32'hFFFF_FFFF; 
reg [31:0] b = 32'hFFFF_FFFF; 
reg [31:0] c = 0;

Я знаю, что c = a - b приведет к нулю, и флаг переполнения не будет установлен.

Насколько я понимаю, ALU использует дополнение 2 к вычитаемому (правая часть оператора) и добавляет его к наименьшему (левая часть оператора).

Таким образом, дополнение 2s к значению, хранимому в регистре b, равно 32'h1. Теперь, если я добавлю это в reg a, я получу 32 нуля и 1, что является переполнением. Тогда почему не установлен флаг переполнения?

Даже если я изменяю ширину reg c на 33, c [32] не устанавливается в 1. Я понимаю, что, когда вычитаются два равных числа, переполнения нет, но я получаю переполнение, когда выполняю 2s дополнение к математике.

Позвольте мне помочь устранить эту путаницу в моей голове. Спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

вы должны посмотреть, что такое дополнение к двум. Итак, в вашем примере a и b являются 32-битными векторами со всеми битами, установленными в '1':

 a[31:0] = 32'hFFFF_FFFF;

два дополняют это 32'h0000_0001; поэтому добавление его к b приведет к тому, что все будет установлено на 0, а бит переполнения 33 будет усечен, поскольку ширина операции составляет 32 бита.

Теперь, предположительно, у вас есть 33-битный вектор

a[32:0] = 33'hFFFF_FFFF;

дополнение к двум будет 33'h1_OOOO_OOO1. Таким образом, если вы добавите его к 33-битному вектору 33'hFFFF_FFFF, у вас все равно будут все 33 бита, равные '0'. Если вы добавите больше битов к a, к стороне msb добавится больше 1: 34'h3_0000_0001, ...

И, если c шире контекста операции, он всегда будет расширен с 0, для переменных без знака, в противном случае - с расширением знака.

В результате вы всегда окажетесь в ситуации, когда бит переполнения находится за пределами ширины операции и усекается. Это гарантируется требованием LRM ширины операции.

0 голосов
/ 02 мая 2018

a, b и c - все 32-разрядные переменные без знака, и вы выполняете 32-разрядную арифметику. LRM говорит, что полученная ширина арифметической операции равна ширине ее наибольшего операнда. Таким образом, переполнение или 33-й бит усекается. Этот факт остается верным даже при расширении c до 33 бит.

...