1

私はこのばかげた考えに行き詰まりました: Verilog テストベンチでは、さまざまなシグナルに単純なパターンを実行させたい:

_ -------- _ _

このように切り替えたいシグナルがたくさんあるので、タスクを作成しました。

//timescale 10ns / 100ps//

module tb;

reg  rst_chip_n;

    task reset_phase;
    inout signal;
    begin
      signal = 1'b0;
      #(100);
      signal = 1'b1;
      #(100);
      signal = 1'b0;
      #(100);
    end
    endtask


initial begin
  reset_phase(rst_chip_n);
  $finish;
  end

endmodule

ただし、これは機能しません。シミュレーション時間は 300 ですが、rst_chip_n の値は常に未定義のままです。なんで ?そして、どのような信号でもそのようなパターンを実行するタスクを作成するにはどうすればよいですか? みんなありがとう!

4

2 に答える 2

2

Verilog のタスクおよび関数への引数は、値によって渡され、タイプの引数はoutputタスクまたは関数が を返したときにinoutのみ更新されます。

したがって、あなたの例で何が起こっているかは次のとおりです。

  1. rst_chip_nXに初期化されます
  2. reset_phase呼び出されると、rst_chip_n(X) の値が渡されます
  3. reset_phaseタスクの存続期間中、signal更新されます。これは、タスクの内部のみです。波形ビューアsignalでタスク内を確認できる場合は、これを観察できるはずです。
  4. reset_phase完了すると、 の値signalがコピーされて戻されますrst_chip_n

シミュレーションを時間 300 を過ぎて実行できるようにすると、時間 300 で 0 になることがわかります。これがタスクrst_chp_nの最終値だからです。signal

このタイプのパターン生成は単純なタスクではできないと思います。1つのオプションは、パターンを駆動する小さなモジュールを作成し、出力を制御したい信号に接続することです.

于 2012-12-14T16:47:23.097 に答える
0

タスクにパラメーターを渡す必要はありません。モジュールスコープでタスクを宣言したため、それらの変数が表示され、呼び出されるたびに使用されます。

module tb;

reg  rst_chip_n;

    task reset_phase;
    begin
      rst_chip_n = 1'b0;
      #(100);
      rst_chip_n = 1'b1;
      #(100);
      rst_chip_n = 1'b0;
      #(100);
    end
    endtask


initial begin
  reset_phase;
  $finish;
  end

endmodule
于 2012-12-15T00:07:18.450 に答える