Verilog 在这段代码中,为什么逻辑右移的行为类似于算术右移?

Verilog 在这段代码中,为什么逻辑右移的行为类似于算术右移?,verilog,logical-operators,Verilog,Logical Operators,我正在构建一个浮点加法器模块,其中一部分需要2s补码和移位值。主要模块代码为 module backup (x, y, z, clk); input [7:0] x,y; output reg [7:0] z; input clk; integer i; reg [1:0] a; reg unsigned [7:0] temp; reg unsigned [8:0] temp2; always @ (posedge clk) begin a = 2'b00; temp = 8'b00111100

我正在构建一个浮点加法器模块,其中一部分需要2s补码和移位值。主要模块代码为

module backup (x, y, z, clk);
input [7:0] x,y;
output reg [7:0] z;
input clk;
integer i;
reg [1:0] a;
reg unsigned [7:0] temp;
reg unsigned [8:0] temp2;
always @ (posedge clk) begin
a = 2'b00;
temp = 8'b00111100; 
temp = ((~temp)+1) >> 2;
$display("temp = %b", temp);
end
endmodule

module backup_tb();
reg [7:0] x,y;
wire [7:0] z;
reg clk;

backup m1 (.x(x),.y(y),.z(z),.clk(clk));

always #10 clk = ~clk;
initial begin
clk = 0;
#50
$finish;
end
endmodule

此代码的输出为
temp=11110001
,而预期输出为
temp=00110001
。请解释我在这里遗漏了什么,或者我如何修复它?

问题不在于换档是否正确;它的表达式是
(~temp)+1)
。将8位操作数添加到32位操作数,操作数在执行任何操作之前都会进行扩展。数字文字隐式为32位。因此,按位
~
操作将
32'b00000000\U00000000\U00000000\U 00111100
反转,然后将其右移。要修复它,您可以写:

temp = ((~temp)+1'b1) >> 2;