3

私のベンチプログラムでは、次のようなものがあります(簡略化):

// bench.sv
program tb (input clk, ...);
  initial begin
    ...
    repeat (100) begin
      main_module_interface.write_index <= bench.write_index;
      // drive additional inputs
      ...

      @(clk);

      $display("%t : BENCH", $realtime);

index_regメインモジュールには、モジュールを作成するための生成ループがあります

// main_module.sv
generate
  for (genvar ix = 0; ix < 32; ix++) begin
    index_reg #(.WIDTH(32), .INDEX(ix)) r (
      .clk,
      .ind(writeIFC.write_index),
      ...
    );
  end
endgenerate

次に、index_regモジュールに次のデバッグコードを追加しました。

// index_reg.sv
always @ (posedge clk) begin
  if (INDEX == 10) begin
    $display("I see the clock");
  end
end

私はこの出力を見ることを期待します:

I see the clock
10 : BENCH
I see the clock
20 : BENCH
I see the clock
30 : BENCH
I see the clock
40 : BENCH
I see the clock
50 : BENCH
etc.

しかし、「時計が見える」が1回おきにしか表示されない場合もあります。だから私は見る

10 : BENCH
I see the clock
20 : BENCH
30 : BENCH
I see the clock
40 : BENCH
50 : BENCH
etc.

なぜそうなるのか理解できません。誰かが私を正しい方向に向けてくれませんか?どうもありがとう。

4

1 に答える 1

2

これ以上コードを見ないで、これが私の最善の推測です。

@(clk);

そのコードは、とclkの両方のすべてのエッジでトリガーされます。posedgenegedge

always @ (posedge clk) begin

posedgeそのコードはのでのみトリガーされclkます。これは 1 回おきです。

BENCHそれが、の 2 倍の頻度で表示される理由かもしれませんI see the clock

それでも質問の答えが得られない場合は、誰でもコンパイルして実行できる完全なコード例を提供してください。

于 2011-10-11T12:38:24.630 に答える