Verilog:乘以无符号符号

Verilog: Multiply signed by unsigned

现在我正在尝试通过一个 8 位变量来调整 12 位有符号输入的幅度。

module mixer_4input (in, amp, out);

input signed    [11:0]  in;
input           [7:0]   amp;
wire signed     [8:0]   signed_amp;
output signed  [19:0]   out;
  
assign signed_amp = amp; 
assign out = $signed((in  >> 8) * signed_amp);  
//assign out = $signed(amp) * (in >> 8); //this one works wrong too
  
endmodule

modelsim screenshot here

但输出要么缺少符号,要么完全错误。 modelsim中的radix type根据我等着看

我做错了什么?谢谢

这一行不会像我想的那样进行符号扩展:

assign signed_amp = amp;

amp 是 8 位宽且无符号。 Verilog 将通过在左侧添加 1'b0 将其扩展为 9 位,而不管 amp 的位 7 的状态如何。 signed_amp 已签名的事实无关紧要。

要完成这项工作,您需要先将 amp 转换为使用 $signed 系统函数进行签名:

assign signed_amp = $signed(amp);

我认为这也不符合您的预期:

assign out = $signed(amp) * (in >> 8);

>> 合乎逻辑的 右移。因此,将在左侧添加零。我怀疑你需要这个:

assign out = $signed(amp) * (in >>> 8);

使用 算术 右移运算符 - >>>,这将保留 in 的符号。