Menu
Coddy logo textTech

システムタスクの使用

CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 77/90。

システムタスクは、ドル記号($)で始まるVerilogの組み込みコマンドです。これらは、メッセージの表示、シミュレーションの終了、波形ファイルの作成といった便利な機能を実行します。

以前のレッスンで、$display$monitor$dumpfile、および$dumpvarsについてはすでに説明しました。このレッスンでは、テストベンチで役立つ追加のシステムタスクについて見ていきます。

追加のシステムタスク

システムタスク目的
$time現在のシミュレーション時間を返す
$finishシミュレーションを終了する
$stopシミュレーションを一時停止する
$random乱数を生成する

$time

現在のシミュレーション時刻を返します。イベントが発生したタイミングを追跡するのに便利です。

$display("Current time is %0t", $time);

$finish

シミュレーションを終了します。テストベンチの最後に必ず使用してください。

$finish;

$stop

シミュレーションを一時停止します。シミュレータのコマンドで再開できます。デバッグに便利です。

$stop;

$random

乱数を生成します。ランダムなテストスティミュラスの作成に役立ちます。

reg [7:0] rand_value;
rand_value = $random;

複数のシステムタスクを使用した例

module system_tasks_demo;
  reg [7:0] data;
  integer i;
  
  initial begin
    $display("Simulation started at time %0t", $time);
    
    for (i = 0; i < 5; i = i + 1) begin
      data = $random;
      $display("Random value %d: %b", i, data);
    end
    
    $stop;
    #10 $display("Resumed at time %0t", $time);
    
    $display("Simulation finished at time %0t", $time);
    $finish;
  end
endmodule
challenge icon

チャレンジ

このテストベンチに不足しているシステムタスクを追加してください。

作業内容:

  1. 開始時に現在の時刻を表示するために $display を追加する
  2. 終了時に現在の時刻を表示するために $display を追加する
  3. シミュレーションを終了するために $finish を追加する

チートシート

Verilogのシステムタスクは、$で始まり、シミュレーションユーティリティを実行します:

システムタスク目的
$time現在のシミュレーション時間を返す
$finishシミュレーションを終了する
$stopシミュレーションを一時停止する
$random乱数を生成する
$display("Time: %0t", $time); // 現在の時刻を表示
$finish;                       // シミュレーションを終了
$stop;                         // シミュレーションを一時停止

reg [7:0] rand_value;
rand_value = $random;          // 乱数を代入

自分で試してみよう

module and_gate (
  input a,
  input b,
  output c
);
  assign c = a & b;
endmodule

module testbench;
  reg a, b;
  wire c;
  
  and_gate dut (
    .a(a),
    .b(b),
    .c(c)
  );

  initial begin
    // TODO: 開始時に現在の時刻を $display で表示する
    // フォーマット: "Start time: %0t"
    
    
    $monitor("Time %0t: a=%b, b=%b, c=%b", $time, a, b, c);
    
    a = 0; b = 0; #10;
    a = 0; b = 1; #10;
    a = 1; b = 0; #10;
    a = 1; b = 1; #10;
    
    // TODO: 終了時に現在の時刻を $display で表示する
    // フォーマット: "End time: %0t"
    
    
    // TODO: $finish を追加する
    
  end
endmodule
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン