Error (10119): Verilog HDL Loop Statement error at divider.v(16): loop with non-constant loop condition must terminate within 250 iterations
出现这个错误提示,指我的循环可能陷入死循环,最高循环次数为250次
代码如下
module divider(input [4:0]AX,//被除数
input [4:0]BX, //除数
output reg[4:0]RX,//商
output reg[4:0]CX//余数
);
reg [4:0]TA;
reg [4:0]TB;
reg [0:0]QX; //验证最后商的符号
always@(AX or BX)
begin
TA=AX[4]?(~AX+1'b1):AX;//如果被除数为负数就取其相反数,反之不变
TB=(BX[4])?BX:(~BX+1'b1);//如果除数是正数就取其负数,反之不变
QX=AX[4]+BX[4];//判断商的符号
RX=0; //商初始化为0
while(TA>=(~TB+1'b1))
begin
TA=TA+TB;
RX=RX+1'b1;
end
CX=TA;
RX=QX?(~RX+1'b1):RX;
end
endmodule
这里是个除法器 我使用补码的形式来进行加法错做,TA是逐渐减小的,但是它仍然认为我的TA有可能陷入死循环,即 TB=0(我敲博客的时候才想到TB有可能等于0,我傻了)现在修改一下试一下
发现还是不对,于是放弃使用while 改用repeat
module divider(input [4:0]AX,//被除数
input [4:0]BX, //除数
output reg[4:0]RX,//商
output reg[4:0]CX//余数
);
reg [4:0]TA;
reg [4:0]TB;
reg [0:0]QX; //验证最后商的符号
always@(AX or BX)
begin
if(BX==0)
begin
RX=0;
CX=0;
TA=0;
TB=0;
QX=0;
end
else
begin
TA=AX[4]?(~AX+1'b1):AX;//如果被除数为负数就取其相反数,反之不变
TB=(BX[4])?(~BX+1'b1):BX;//如果除数是正数就取其负数,反之不变
QX=AX[4]+BX[4];//判断商的符号
RX=0; //商初始化为0
repeat(15)
begin
if(TA>=TB)
begin
TA=TA-TB;
RX=RX+1'b1;
end
end
CX=TA;
RX=QX?(~RX+1'b1):RX;
end
end
这种情况下程序正确 仿真结果如下:
还有有问题
此处涉及问题 负数除正数后余数怎么算 如-5 除 2 得-2 余-1 还是得-3 余 1呢?
按理来说应该是余-1的结果。所以即余数应该和被除数同号,修改代码
module divider(input [4:0]AX,//被除数
input [4:0]BX, //除数
output reg[4:0]RX,//商
output reg[4:0]CX//余数
);
reg [4:0]TA;
reg [4:0]TB;
reg [0:0]QX; //验证最后商的符号
always@(AX or BX)
begin
if(BX==0)//如果除数为0则报错输出全为0
begin
RX=0;
CX=0;
TA=0;
TB=0;
QX=0;
end
else
begin
TA=AX[4]?(~AX+1'b1):AX;//如果被除数为负数就取其相反数,反之不变
TB=(BX[4])?(~BX+1'b1):BX;//如果除数是正数就取其负数,反之不变
QX=AX[4]+BX[4];//判断商的符号
RX=0; //商初始化为0
repeat(15)
begin
if(TA>=TB)
begin
TA=TA-TB;
RX=RX+1'b1;
end
end
CX=AX[4]?(~TA+1'b1):TA; //余数与被除数同号
RX=QX?(~RX+1'b1):RX; // 商与被除数和除数有关
end
end
仿真结果
经查阅wiki百科 -5 除 2 得-2 余-1 得-3 余 1的两种结果都是正确的,只要保证余数绝对值小于除数就可以了,但是在某些编程语言中有特殊的规定
具体如下图