向左移动,直到MSB为1:超出循环计数限制。条件绝不虚假

时间:2019-04-23 03:52:27

标签: verilog

我试图向左移动“移位寄存器”,直到MSB为1。但是我的代码不起作用。编译器说“超出了循环计数限制。条件绝不为假”

input wire [31:0] targetnumber,
...
reg [31:0] shifted;
...
shifted=targetnumber;
for(cnt = 0; shifted[31] == 0; shifted = shifted << 1)begin
   cnt = cnt + 1;
end

所以问题出在循环中,如果我执行此左移操作,我100%确信我的移位寄存器的MSB可以达到1。但是编译器说是NOPE ch子。 我尝试过shiftd [31]!= 0 ;,它不会出错,但是没有得到我想要的结果。

2 个答案:

答案 0 :(得分:1)

鉴于并不是所有信号之间的依赖性都得到了解释/详细说明,我不确定我是否完全理解您的代码,但是下面粘贴的代码摘录可能对您有所帮助。

for(cnt = 0; cnt < 31; cnt = cnt + 1)begin
    if (targetnumber[i])
        shift_index = 31 - cnt;
    cnt = cnt + 1;
end

assign shifted = targetnumber << shift_index;

答案 1 :(得分:0)

编译器是正确的。考虑一下shifted = 0时会发生什么。

此代码不太可能被合成。如果您要计算一个数字中前0位的数目,则最好使用更明确的方法(例如编写一个循环,运行32次并依次检查每个位)。