fork-joinブロック

[] [] []


begin-endブロック内は上から順番に実行されるが、複数の文を並行実行するにはfork-joinブロック内に書けばよい。このときfork-joinブロック内の全てが終了しないと次へ進めない。

// task_atask_bを並行実行する

initial

  begin

  task_a;

  task_a;

  fork

    task_a;

    task_b(16'h7777);

  join

  ...

  end

例えば、バグのためDUTからの出力が返って来なくてシミュレーションが先に進まなくなってしまったときに、タイムアウトを検出してシミュレーションを終了させるモニタを、fork-joinを使って次のように書くことができる。

// dut_out信号が100クロック間変化しなかったらタイムアウト

always

  fork: watchdog  // fork-joinブロックにwatchdogという名前を付ける

    begin

    @(dut_out)

    disable watchdog;  // enb信号が変化したらこのwatchdogブロックを終了する

    end

    begin

    repeat(100) @(posedge clk); // 100クロックたったら強制終了する

    $display("-- time out");

    $finish;

    end

  join


[] [] []