вы должны посмотреть, что такое дополнение к двум. Итак, в вашем примере 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 ширины операции.