为什么要对Verilog算术移位进行内联,使其变成逻辑上的?

问题描述 投票:3回答:2

我已阅读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(…)>>>…。直接将结果分配给导线或寄存器时,此方法有效,...

verilog bit-shift
2个回答
3
投票

上下文确定与自定义表达式


1
投票
3'sb000
© www.soinside.com 2019 - 2024. All rights reserved.