2016-10-07 1 views
1

こんにちは私のVerilogコードの入力の可能性のあるすべてのケースをテストしようとしています。私はループのためにそれを設定しました。Isimはテストフィクスチャ内のすべてのビットをテストしていません

for(sel = 0;sel < 4;sel=sel+1) begin 
      for(a = 0;a < 8;a=a+1) begin 
        for(b = 0;b < 8;b=b+1) begin 
         #50; 
        end 
      end 
    end 

これは以前はうまくいきましたが、変更が必要な場合やIsimにバグがある可能性があります。 a、b、およびselも初期化しました。

reg [2:0] a; 
reg [2:0] b; 
reg [1:0] sel; 

しかし、私がtbファイルをシミュレートしようとすると、繰り返し繰り返すだけです! なぜこれができますか?私はしばらくそれを遊んでいて、運がなかった。私は< 7にBの境界を変更すると

また、それはをループに開始されますが、私は、SELをループに< 7に境界を変更する必要があります。これは部分的に機能しますが、aとbの場合は111、selの場合は11の場合をスキップします。

また、すべてのケースでビットを手動でテストすることにしました。正しい結果を示しています。

答えて

2

終了条件(b < 8)が常にtrueであるため、無限ループが発生しています。次のコードを使ってこれを簡単に証明できます。あなたは0-7繰り返し何度も見ることができます:

module tb; 

reg [2:0] b; 
initial begin 
    for (b = 0;b < 8;b=b+1) begin 
     $display(b); 
     #50; 
    end 
end 
initial #1000 $finish; 

endmodule 

/* 
Output: 
0 
1 
2 
3 
4 
5 
6 
7 
0 
1 
2 
3 
4 
5 
6 
7 
0 
1 
2 
3 
*/ 

あなたは3ビットの信号としてbを宣言しているので、それが値の範囲だ= 7 bのときしたがって、Bは常に8未満7. 0〜です、b + 1 = 0、ない8

8から7に変更すると、終了条件(b < 7)が偽になるため、1回だけ0-6が表示されます。ここ

ループする一つの方法は、一度0から7までである:

module tb; 

reg [2:0] b; 
initial begin 
    b = 0; 
    repeat (8) begin 
     $display(b); 
     #50; 
     b=b+1; 
    end 
end 

endmodule 

別の一般的な方法は、integer代わりに3ビットregとしてbを宣言することです。 integerは32ビットの符号付きの値です(IEEE Std 1800-2012、6.11節の整数データ型を参照)。for (b = 0;b < 8;b=b+1) beginは0から7までループします。

+0

ありがとうございます。そのコードは、私のシミュレーションで正しく増加するようです。まだ何か気分が悪いです。私は私のトリプル・フォー・ループの境界が間違っているのを見ています。私はaとbのために **を(b = 3'b000; b = 3'b111; b = b + 1)**に変更しました。 と ** for(sel = 2'b00; sel <= 2'b11; sel = sel + 1)** for sel これらの境界は現在正しいように見えますが、まだ正しくシミュレートされていません。私はそれを試してみるために別のコンピュータに行って、それは動作します!私のシミュレータに問題があるはずです... – Darklink9110

関連する問題