分配中非运算符的意外结果

时间:2019-11-17 21:09:31

标签: verilog

我有两个8位输入AB

input [7:0] A,B;

和9位输出F

output reg [8:0] F;

AB合并并分配给F,如下所示:

F <= ~(A^B);

如果A等于8'hFF,并且B等于8'hF0,为什么F变成9'h1F0而不是{{ 1}}?

2 个答案:

答案 0 :(得分:5)

  

为什么输出9'h1F0而不是9'h0F0?

您将F定义为9位宽。因此,编译器会在进行任何操作之前 将右侧参数扩展为9位。
由于A和B都未签名,因此它们分别成为 A = 9'h0FF, B=9'h0F0. EXOR给出9'h00F。补码则为9'h1F0。

请注意,如果将表达式放在{}之间,则宽度扩展不会发生:

F2 = {~(A^B)};

F2将为9'h0F0;

答案 1 :(得分:2)

因为 11.8.2部分评估表达式 11.8.3部分评估IEEE 1800-2017 LRM分配,实际上表示操作数得到了扩展在执行任何操作之前,首先要匹配结果的大小。