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信号が変化したらこのfork-joinブロックを終了する

      end

   

      begin

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

      $display("-- time out");

      $finish;

      end

    join


[] [] []