Qutus编译出错 loop with non-constant loop condition must terminate within 250
时间:10-02
整理:3721RD
点击:
新手,想写一个除16位数除以400,商四舍五入的模块,折腾了半天,quartus总是报错,不知道什么原因,请高手帮忙看看?
module div_400(A,Div);
input [15:0] A;//被除数
output [8:0] Div;//商
parameter B=16'd400;
reg [8:0] Div;
reg [8:0] Div_temp;
reg [15:0] A_temp;
always@(A)
begin
A_temp=A;
Div_temp=0;
while (A_temp>B)
begin
Div_temp=Div_temp+1;
A_temp=A_temp-B;
end
if (A_temp>=200)
begin
Div=Div_temp+1;
end
else
begin
Div=Div_temp;
end
end
endmodule
编译总是报错Verilog HDL Loop Statement error : loop with non-constant loop condition must terminate within 250 iterations
是什么原因呢?
module div_400(A,Div);
input [15:0] A;//被除数
output [8:0] Div;//商
parameter B=16'd400;
reg [8:0] Div;
reg [8:0] Div_temp;
reg [15:0] A_temp;
always@(A)
begin
A_temp=A;
Div_temp=0;
while (A_temp>B)
begin
Div_temp=Div_temp+1;
A_temp=A_temp-B;
end
if (A_temp>=200)
begin
Div=Div_temp+1;
end
else
begin
Div=Div_temp;
end
end
endmodule
编译总是报错Verilog HDL Loop Statement error : loop with non-constant loop condition must terminate within 250 iterations
是什么原因呢?
while (A_temp>B)
begin
Div_temp=Div_temp+1;
A_temp=A_temp-B;
end
这里要加循环退出条件不?当A_temp > B不再为1后
应该不是这个问题吧
呵呵,一般的循环语句用于testbench测试用,不适合于RTL综合。
verilog是硬件描述语言,它的实现是对应一定的硬件结构。你这个是典型的c语言的结构模式...
你上面写的这段代码是没有办法用硬件来实现的,因为循环的次数是不固定的,无法确定最终的硬件结构。
而且就像ls所说的,循环语句一般用于testbench...不用于实现RTL代码...
我也遇到相同的问题,貌似之前使用Quartus也没遇到过啊。
“挂在天边的鱼 ”说的完全正确
我也遇到这个问题,有啥解决之道呀?
/
改程序吗?直接设置那个数吗
就是循环次数不固定造成的,学习了