Verilog中的算术右移

Verilog中的算术右移,verilog,bit-shift,xilinx,Verilog,Bit Shift,Xilinx,作为处理器设计的一部分,我正在使用Verilog实现一个简单的行为右移器 移位器输入32位变量,并根据变量(输入)选择输出右逻辑移位或右算术移位 代码如下: module ShiftRight( input signed[31:0] inp, input [31:0] shamt, output [31:0] out, input choice ); assign out = (choice)? (inp>>>shamt):(inp>>s

作为处理器设计的一部分,我正在使用Verilog实现一个简单的行为右移器

移位器输入32位变量,并根据变量(输入)选择输出右逻辑移位或右算术移位

代码如下:

 module ShiftRight(
  input signed[31:0] inp,
  input [31:0] shamt,
  output [31:0] out,
  input choice
  );

  assign out = (choice)? (inp>>>shamt):(inp>>shamt);


 endmodule
这将导致正确的行为实现,但在合成过程中会发出以下警告:

Unit ShiftRight : the following signal(s) form a combinatorial loop: out_shift0000<31>.
Unit ShiftRight:以下信号构成一个组合回路:out\u shift0000。

(括号中的系数基本上是inp的最高有效位,在我的例子中是31)。所以我想知道这是否与inp的签名有关

我猜你的合成器一想到必须对向量进行2^32位(4294967296)的算术移位,就会爆炸,在它的内部RTL-to-gates合成中,它以一个循环结束


因为我猜你不需要移位40亿位,也许你可以用一个合理的数字作为移位量?

我猜你的合成器一想到必须将向量算术移位2^32位(4294967296),就会爆炸,在它的内部RTL到门合成中,它以一个循环结束


因为我猜你不需要移位40亿位,也许你可以用一个合理的数字来表示移位量?

听起来你有一把梳子。在该模块外部循环。输入和输出来自哪里,您是否将它们反馈到逻辑中?out\u shift0000是另一个层次结构级别的信号吗?仅供参考,shamt仅需5位宽即可表示32位的移位。@Tim我尝试将该模块实现为顶部模块。同样的警告。所以我猜它一定是内部的。听起来你有一把梳子。在该模块外部循环。输入和输出来自哪里,您是否将它们反馈到逻辑中?out\u shift0000是另一个层次结构级别的信号吗?仅供参考,shamt仅需5位宽即可表示32位的移位。@Tim我尝试将该模块实现为顶部模块。同样的警告。所以我猜它一定是内部的。这听起来是个好主意!我要试一试。谢谢听起来是个好主意!我要试一试。谢谢