Verilog выполняет преобразование типов автоматически.
Это значение со знаком:
wire signed [4:0] I_am_signed;
assign I_am_signed = 16;
Это без знака:
wire [4:0] I_am_unsigned;
assign I_am_unsigned = 16;
Это идет не так:
wire signed [3:0] I_am_signed_but_too_small_for_16;
assign I_am_signed_but_too_small_for_16= 16;
В последнем случае вы не гарантированно получите предупреждения или ошибки, но большинство компиляторов предоставят их. Однако это не будет иметь место, когда он не знает значений. Это может пойти ужасно неправильно:
assign I_am_signed_but_too_small_for_16 = I_am_signed;
Но это безопасный способ преобразования подписанного в неподписанное или наоборот:
assign I_am_unsigned = I_am_signed;
assign I_am_signed = I_am_unsigned;