循环收敛 - Verilog 综合
Loop Convergence - Verilog Synthesis
我正在尝试连续减去一个特定数字以获得该数字的最后一位(不除法)。例如当q=54时,循环后我们得到q=4。同样适用于 q=205,输出为 q=5。
if(q>10)
while(q>10)
begin
q=q-10;
end
迭代应该在逻辑上收敛。但是,我收到一个错误:
“[Synth 8-3380] 循环条件在 2000 次迭代后不收敛”
我检查了 post - Use of For loop in always block。它说循环中的迭代次数必须是固定的。
然后我尝试用固定的迭代来实现这个循环,如下所示(只是为了检查这个至少是否合成):
if(q>10)
while(loopco<9)
begin
q=q-10;
loopco=loopco-1;
end
但是上面的也行不通。出现相同的错误“[Synth 8-3380] 循环条件在 2000 次迭代后不收敛”。从逻辑上讲,它应该是 10 次迭代,因为我已经声明了 loopco=8.
的值
关于如何在 verilog 中实现上述功能的任何建议都会有所帮助。
无法合成该代码。对于综合,循环必须具有编译时间已知的迭代次数。因此它必须知道要进行多少次减法。在这种情况下它不能。
永远不要忘记,对于综合,您是在将一种语言转换为硬件。在这种情况下,该工具需要生成 N 次减法的代码,但 N 的值未知。
您已经在声明您正在努力避免分裂。这向我建议你知道不能合成通用除法运算符。尝试解决使用重复减法的问题是行不通的。你应该已经怀疑了:如果这很容易,那么现在就已经完成了。
如果你知道 q 的上限(你可以根据位数计算),你可以自己构建它:
wire [5:0] q;
reg [3:0] rem;
always @( * )
if (q<6'd10)
rem = q;
else if (q<6'd20)
rem = q - 6'd10;
else if (q<6'd30)
rem = q - 6'd20;
etc.
else
rem = q - 6'd60;
刚刚注意到这个 link 会弹出到您的问题旁边,表明过去有人问过它:
How to NOT use while() loops in verilog (for synthesis)?
我正在尝试连续减去一个特定数字以获得该数字的最后一位(不除法)。例如当q=54时,循环后我们得到q=4。同样适用于 q=205,输出为 q=5。
if(q>10)
while(q>10)
begin
q=q-10;
end
迭代应该在逻辑上收敛。但是,我收到一个错误: “[Synth 8-3380] 循环条件在 2000 次迭代后不收敛”
我检查了 post - Use of For loop in always block。它说循环中的迭代次数必须是固定的。
然后我尝试用固定的迭代来实现这个循环,如下所示(只是为了检查这个至少是否合成):
if(q>10)
while(loopco<9)
begin
q=q-10;
loopco=loopco-1;
end
但是上面的也行不通。出现相同的错误“[Synth 8-3380] 循环条件在 2000 次迭代后不收敛”。从逻辑上讲,它应该是 10 次迭代,因为我已经声明了 loopco=8.
的值关于如何在 verilog 中实现上述功能的任何建议都会有所帮助。
无法合成该代码。对于综合,循环必须具有编译时间已知的迭代次数。因此它必须知道要进行多少次减法。在这种情况下它不能。
永远不要忘记,对于综合,您是在将一种语言转换为硬件。在这种情况下,该工具需要生成 N 次减法的代码,但 N 的值未知。
您已经在声明您正在努力避免分裂。这向我建议你知道不能合成通用除法运算符。尝试解决使用重复减法的问题是行不通的。你应该已经怀疑了:如果这很容易,那么现在就已经完成了。
如果你知道 q 的上限(你可以根据位数计算),你可以自己构建它:
wire [5:0] q;
reg [3:0] rem;
always @( * )
if (q<6'd10)
rem = q;
else if (q<6'd20)
rem = q - 6'd10;
else if (q<6'd30)
rem = q - 6'd20;
etc.
else
rem = q - 6'd60;
刚刚注意到这个 link 会弹出到您的问题旁边,表明过去有人问过它: How to NOT use while() loops in verilog (for synthesis)?