为什么此代码中的逻辑右移行为类似于算术右移?

问题描述

我正在构建一个浮点加法器模块,它的一部分需要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_00000000_00000000_00111100反转,然后向右移动。要解决此问题,您可以编写:

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