while不支持非常量循环条件



这是我用于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

错误为:while不支持非恒定循环条件

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

请给我推荐其他合成方法!!

提前感谢Madhav(超大规模集成电路学生)

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

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

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

您必须选择FSM设计,其输入是cnt的当前值和err的当前值。

顺便说一句:源代码中有很多编码错误。其中之一是:

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

这并不像你假装的那样读作"如果err等于四、五、六或七,那么…"。

你必须这样编码:

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

最新更新