Здесь действуют два правила выражения Verilog:
- Контекстно-зависимые и самоопределенные выражения
- В контексте смешивание операнда со знаком и без знака приводит ко всему без знака
Если у вас есть выражение
C ? A : B
Операнды A
и B
находятся в контексте друг с другом. Каждый операнд будет изменен на самый большой операнд, и оба должны быть подписаны, чтобы остаться подписанным. Это происходит до применения оператора во время компиляции. S
самоопределяется - ничто, кроме C
, не влияет на его размер или подпись. Кроме того, C
не влияет на контекст A
и B
Аналогично, когда у вас есть выражение
A >>> S
A
определяется контекстом и S
самоопределяется
Теперь, если мы объединим два выражения в одно:
C ? A >>> S : B
Поскольку A
и B
находятся в одном контексте, а B
не подписано, A
конвертируется в без знака. Как только вы заключаете A>>>S
в вызов функции (любой вызов функции работает одинаково), каждый входной аргумент функции имеет свой собственный контекст, независимый от остальной части выражения, частью которого он является. Возвращаемое значение будет обрабатываться в контексте с остальной частью выражения.