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

Min*_*wat 0 verilog

我有两个8位输入AB

input [7:0] A,B;
Run Code Online (Sandbox Code Playgroud)

和一个9位的输出F

output reg [8:0] F;
Run Code Online (Sandbox Code Playgroud)

A并被B组合并分配为F

F <= ~(A^B);
Run Code Online (Sandbox Code Playgroud)

如果A等于8'hFF,并且B等于8'hF0,为什么F变得9'h1F09'h0F0

Old*_*art 5

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

您将F定义为9位宽。因此,编译器将执行任何操作之前将右侧参数扩展为9位。
由于A和B均未签名,因此 A = 9'h0FF, B=9'h0F0.EXOR给出9'h00F。然后补码得到9'h1F0。

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

F2 = {~(A^B)};
Run Code Online (Sandbox Code Playgroud)

F2将为9'h0F0;