我已阅读multiple questions,了解如何在Verilog中实现算术移位。所有建议都使用$signed(…) >>> …
。
当直接将结果分配给导线或寄存器时有效,但在将其用作较大表达式的一部分时无效。那是:
reg[2:0] a = $signed(3'b100) >>> 1 ;
产生3'b110
reg[2:0] a = 1'b1 ? $signed(3'b100) >>> 1 : 3'b000;
产生3'b010
解决方法似乎是将计算结果包装到$unsigned
中:
reg[2:0] a = $unsigned($signed(3'b100) >>> 1) ;
产生3'b110
reg[2:0] a = 1'b1 ? $unsigned($signed(3'b100) >>> 1) : 3'b000;
产生3'b110
这是一个最小的工作示例:$unsigned
输出:
module puzzle();
reg [2:0] a_u = 3'b100 >>> 1; // 3'b010
reg [2:0] a_s = $signed(3'b100) >>> 1; // 3'b110
reg [2:0] a_mux = 1'b1 ? $signed(3'b100) >>> 1 : 3'b000; // 3'b010
reg [2:0] b_u = $unsigned(3'b100 >>> 1); // 3'b010
reg [2:0] b_s = $unsigned($signed(3'b100) >>> 1); // 3'b110
reg [2:0] b_mux = 1'b1 ? $unsigned($signed(3'b100) >>> 1) : 3'b000; // 3'b110
initial begin
$display("a_u = 3'b%3b", a_u);
$display("a_s = 3'b%3b", a_s);
$display("a_mux = 3'b%3b", a_mux);
$display("b_u = 3'b%3b", b_u);
$display("b_s = 3'b%3b", b_s);
$display("b_mux = 3'b%3b", b_mux);
end
endmodule
我已经阅读了有关如何在Verilog中实现算术移位的多个问题。所有建议都使用$ signed(…)>>>…。直接将结果分配给导线或寄存器时,此方法有效,...
上下文确定与自定义表达式
3'sb000