Как я уже сказал в комментариях: ваш код очень ... неоптимальный. Так что здесь я отвечу только:
Y [Ь] = (У [Ь]!); // КАК ИСПРАВИТЬ ЭТО?
Если вы пишете Y [b] =! (Y [b]) (а часы не задействованы), вы создали комбинаторный цикл: Y [b] становится не Y [b], который сразу же становится не-не Y [b], который сразу становится не-не-не Y [b] и т. Д.
Вы должны использовать прямую рабочую логику: создайте новую переменную, например. Z равно Y, но бит b (b! = 0) инвертирован.
always @( * )
case (b)
1 : Z = Y ^ 4'b0010;
2 : Z = Y ^ 4'b0100;
3 : Z = Y ^ 4'b1000;
default : Z = Y;
endcase
(Конечно, это также помогает, если вы знакомы с работой различных логических операций.)
Не проверено, возможны опечатки