【发布时间】:2020-02-21 19:59:16
【问题描述】:
我已经阅读了multiplequestions,了解如何在 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
输出:
a_u = 3'b010
a_s = 3'b110
a_mux = 3'b010
b_u = 3'b010
b_s = 3'b110
b_mux = 3'b110
【问题讨论】: