Suponha que eu tenha um módulo que recebe dois números e um sinal que indica se é uma multiplicação com sinal ou sem sinal. O módulo precisa multiplicar.
module signed_or_unsigned_mul
# (
parameter n = 8
)
(
input [ n - 1:0] a, b,
input signed_mul,
output [2 * n - 1:0] res
);
Tentei implementá-lo com o operador ternário, mas ele produz um resultado incorreto, por exemplo -8 * -7 = 72
assign res = signed_mul ? ($signed(a) * $signed(b)) : (a * b) ;
E o código abaixo com always_comb e if produz resultados corretos:
logic [2 * n - 1:0] res_stub;
assign res = res_stub;
always_comb
if (signed_mul)
res_stub = $signed(a) * $signed(b);
else
res_stub = a * b;
Não vejo qual é a diferença entre essas duas implementações e por que elas produzem resultados diferentes. Você pode me explicar isso, por favor? Uma variável lógica adicional afeta esse aspecto?
Isso ocorre porque os ramos verdadeiro e falso do operador ternário fazem parte de uma única expressão. Eles são avaliados em um único contexto. É o mesmo que somar as expressões verdadeiro e falso . Elas são dimensionadas para a maior expressão e, se alguma parte não tiver sinal, toda a expressão também não terá sinal.
Ao usar a
if
instrução, você está criando duas expressões separadas com contextos separados.