while不支持非恒定循环条件

时间:2014-01-09 17:47:05

标签: verilog

这是我用于CRC校正的verilog代码,

module cor(m,err);
input m;
output  err;
reg  [10:0]data;                    // message and zeros concatenated
reg  [7:0]poly;                     // polynomial equivalent
reg  [15:0]err;                     //xor output
reg  [3:0]cnt;                      // counter
reg  [2:0]n;                        // zeros
wire  [7:0]m;
reg  [7:0]poly1;                    // copy of polynomial equivalent
reg  [15:0]f;                       //shifted polynomial
//wire a;
reg [2:0]a;

initial a <= 3'b000;
initial cnt = 4'b1000;
//initial data <= {m,n};
initial poly1<= poly;

//always_comb
always @ (m or poly)
begin
data <= {m,n};
poly1 <= poly;
//data <= {m,n};
err <= data[7:0]^poly1;
while(!cnt[2:0] == 0)
begin
if(err == 4||5||6||7)begin
f <= poly1>>1;
cnt <=cnt-1;
err <= data^f;
err <= err<<1;
end
else if(err[7:4]== 2||3) begin
f <= poly1>>2;
cnt <= cnt-2;
err <= data^poly1;
err = err <<2;
end
else if(err[7:4]== 1) begin
f <= poly1>>3;
cnt <= cnt-3;
err <= data^poly1;
err <= err <<3;
end
else if(err[7:4]== 4'b0000)begin
f <= poly1>>4;
cnt <= cnt-4;
err <= data^poly1;
err <=err <<4;
end
else
err <= data^poly1;
end
if(err[7:4]==4'b0000)                           //checking remainder? zero
$display("no error detected");
else 
$display("error detected");
err <= data^poly1;                              // correcting error

end

endmodule

我无法合成xst

错误是:

时不支持非恒定循环条件

这里我认为我不能使用for循环,因为它在每次迭代后都不是线性增量(+1),(我没错?)

请建议我合成它的其他方法!!

提前致谢 Madhav(VLSI学生)

1 个答案:

答案 0 :(得分:0)

  

这里我认为我不能用于循环,因为它不是线性增量   (+1)每次迭代后,(我没错?)

你不能使用你的while循环,因为在编译时无法计算迭代次数:保持循环的条件是cnt[2:0]不等于零,所以数量为循环迭代(0到7)只能在电路工作且值存储到cnt[2:0]时才能知道。只有迭代一定次数的循环才是可合成的,因为XST用于合成这种循环的方式是展开它们。

  

请建议我合成它的其他方法!!

您必须选择FSM设计,其输入值为当前值cnt,当前值为err

顺便说一下:源代码中存在许多编码错误。其中之一是:

if(err == 4||5||6||7)begin

当你假装时,这并不是“如果错误等于四,五,六或七......”。

你必须像这样编码:

if ( err == 4 || err == 5|| err == 6 || err == 7 ) begin