Timescaleディレクティブ
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 70/90。
timescaleディレクティブは、シミュレーションの時間単位と時間精度を設定します。これは、シミュレータに#10のような遅延値の解釈方法を伝えます。
以前のレッスンでは、#10 のような遅延を、「10」が何を意味するのかを指定せずに使用してきました。それは10ナノ秒でしょうか?10ピコ秒でしょうか?timescale ディレクティブがこの疑問に答えます。
構文:
`timescale time_unit / time_precision| 項目 | 意味 | 例 |
|---|---|---|
time_unit | 遅延の基本単位 | 1ns |
time_precision | シミュレーションの精度 | 1ps |
timescale の前にあるバッククォート ` は、それがコンパイラディレクティブであることを意味します。
例
`timescale 1ns / 1pstime_unit = 1ns→#10は10ナノ秒を意味しますtime_precision = 1ps→ シミュレーションは最も近いピコ秒に丸められます
一般的なタイムスケール値
| 時間単位 | 精度 | ユースケース |
|---|---|---|
1ns / 1ns | ナノ秒 | 単純なシミュレーション |
1ns / 1ps | ピコ秒 | より高精度 |
1ps / 1ps | ピコ秒 | 高速設計 |
1us / 1ns | マイクロ秒 | 低速なシミュレーション |
遅延への影響
`timescale 1ns / 1ps
initial begin
#10 a = 1; // 10ナノ秒待機します
endtimescaleがない場合、一部のシミュレータはデフォルト値(多くの場合1ns)を想定します。常に指定することをお勧めします。
重要なルール
| ルール | 説明 |
|---|---|
| モジュールの外に配置する必要があります | モジュール定義の前に記述します |
| バッククォート記号 | 'timescale ではなく `timescale を使用します |
| 時間単位 ≥ 時間精度 | 1ns / 1ps は問題ありませんが、1ps / 1ns は不可です |
| ファイル内のすべての遅延に影響します | 一般的な遅延、ゲート遅延、代入遅延 |
チャレンジ
やること:
遅延が 10ns、20ns、および 30ns を表すように、不足している timescale ディレクティブを追加してください。
チートシート
`timescale ディレクティブは、シミュレーションの時間単位と時間精度を設定します。これは、モジュール定義の前に配置する必要があります。
`timescale time_unit / time_precision`timescale 1ns / 1ps
initial begin
#10 a = 1; // 10ナノ秒待機します
endtime_unit— 遅延の基本単位(例:#10= 10ns)time_precision— シミュレーションの丸め精度の細かさ(時間単位以下である必要があります)
| タイムスケール | ユースケース |
|---|---|
1ns / 1ns | 単純なシミュレーション |
1ns / 1ps | より高精度 |
1ps / 1ps | 高速設計 |
1us / 1ns | 低速なシミュレーション |
自分で試してみよう
// TODO: タイムスケール・ディレクティブ (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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。