Timescaleディレクティブ
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 70/90。
timescale ディレクティブ(directive)は、シミュレーションの時間単位(time_unit)と時間精度(time_precision)を設定します。これにより、シミュレータに #10 のような遅延値の解釈方法を伝えます。
これまでのレッスンでは、#10 のような遅延を使用してきましたが、「10」が何を意味するのかを指名していませんでした。10ナノ秒でしょうか?10ピコ秒でしょうか?timescale ディレクティブ(directive)がこの疑問に答えます。
構文:
`timescale time_unit / time_precision| パーツ | 意味 | 例 |
|---|---|---|
time_unit | 遅延の基本単位 | 1ns |
time_precision | シミュレーションの精度 | 1ps |
timescale の前にあるバックティック ` は、それがコンパイラディレクティブであることを意味します。
例
`timescale 1ns / 1pstime_unit = 1ns→#10は10ナノ秒を意味しますtime_precision = 1ps→ シミュレーションは最も近いピコ秒に丸められます
共通の Timescale 値
| Time Unit | Precision | ユースケース |
|---|---|---|
1ns / 1ns | ナノ秒 | シンプルなシミュレーション |
1ns / 1ps | ピコ秒 | より高精度 |
1ps / 1ps | ピコ秒 | 高速設計 |
1us / 1ns | マイクロ秒 | 低速なシミュレーション |
遅延への影響
`timescale 1ns / 1ps
initial begin
#10 a = 1; // 10ナノ秒待機します
endtimescale を指定しない場合、一部のシミュレータはデフォルト値(多くは 1ns)を前提とします。常に明示的に指定するのが最善です。
重要なルール
| ルール | 説明 |
|---|---|
| モジュールの外に配置する必要がある | いずれのモジュール定義よりも前に配置します |
| バックティック記号 | 'timescale ではなく `timescale |
| 時間単位(Time unit)≥ 時間精度(time precision) | 1ns / 1ps は問題ありませんが、1ps / 1ns は不可です |
| ファイル内のすべての遅延に影響する | 一般的な遅延、ゲート遅延、代入遅延 |
チャレンジ
作業内容:
遅延が 10ns、20ns、30ns を表すように、不足している timescale directive を追加します。
自分で試してみよう
// TODO: timescaleディレクティブを追加 (1ns / 1ps)
module timescale_challenge;
initial begin
$display("Time %0t", $time);
#10 $display("Time %0t (10ns = 10000ps)", $time);
#10 $display("Time %0t (20ns = 20000ps)", $time);
#10 $display("Time %0t (30ns = 30000ps)", $time);
$finish;
end
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。