Verilog 赋值中Not运算符的意外结果

Verilog 赋值中Not运算符的意外结果,verilog,Verilog,我有两个8位输入A和B input [7:0] A,B; 以及9位输出F output reg [8:0] F; A和B组合并分配给F,如下所示: F <= ~(A^B); F 为什么输出是9'h1F0而不是9'h0F0 您将F定义为9位宽。因此,编译器将在执行任何操作之前将右侧参数扩展到9位。 因为A和B都是未签名的,所以它们分别成为 A=9'h0FF,B=9'h0F0。EXOR给出9'h00F。1的补码给出9'h1F0 请注意,如果将表达式置于{}之间,则不会发生宽度扩展: F2

我有两个8位输入
A
B

input [7:0] A,B;
以及9位输出
F

output reg [8:0] F;
A
B
组合并分配给
F
,如下所示:

F <= ~(A^B);
F
为什么输出是9'h1F0而不是9'h0F0

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

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

F2 = {~(A^B)};
F2将为9'h0F0

因为第11.8.2节用于计算表达式的步骤和第11.8.3节用于计算IEEE 1800-2017 LRM赋值的步骤实际上表明,在执行任何操作之前,操作数首先被扩展以匹配结果的大小