Для подобных вещей ясность RTL превосходит все с большим отрывом. SystemVerilog имеет специальные директивы всегда блока, чтобы было ясно, когда блок должен синтезироваться в комбинационную логику, защелки или флопы (и ваш инструмент синтеза должен выдавать ошибку, если вы написали RTL, который конфликтует с этим (например, не включая все сигналы в список чувствительности всегда блока). Также имейте в виду, что инструмент, вероятно, заменит любую кодировку, которую вы имеете, на наиболее аппаратно-эффективную кодировку (ту, которая минимизирует область вашего общего проекта), если только сама кодировка не распространяется на контакты. вашего модуля верхнего уровня.
Этот совет, в общем, тоже подходит. Сделайте ваш код легким для понимания людьми, и он, вероятно, будет более понятен и инструменту синтеза, что позволит ему более эффективно использовать буквально тысячи человеко-лет исследований алгоритмов для вашей RTL .
Вы также можете закодировать его, используя троичные операторы, если хотите, но я бы предпочел что-то вроде:
always_comb //or "always @*" if you don't have an SV-enabled tool flow
begin
case(a)
begin
4'b0000: b = 1'b0;
4'b0001: b = 1'b1;
...
4'b1111: b = 1'b0;
//If you don't specify a "default" clause, your synthesis tool
//Should scream at you if you didn't specify all cases,
//Which is a good thing (tm)
endcase //a
end //always