任意のスコープでのVerilog timescale理解と表示
デフォルトtimescale
Verilogモジュールはモジュール前にtimescaleが定義されていることが期待されますが、シミュレータはデフォルトのtimescaleを挿入する場合があります。Verilog展開階層内の任意のスコープで実際に適用されるtimescaleは、スコープを引数として受け取るシステムタスク$printtimescaleで出力できます。
module tb;
initial begin
// このモジュールのtimescaleを出力
$printtimescale(tb);
// $printtimescale($root);
end
endmodule
このモジュールの前にtimescaleディレクティブが配置されていなくても、シミュレータが1ns/1nsのtimescale値を適用したことがわかります。
xcelium> run Time scale of (tb) is 1ns / 1ns xmsim: *W,RNQUIE: Simulation is complete.
標準的なtimescaleスコープ
デフォルトでは、ファイルに配置されたtimescaleディレクティブは、別のtimescaleディレクティブの定義が見つかるまで、それに続くすべてのモジュールに適用されます。
`timescale 1ns/1ps
module tb;
des m_des();
alu m_alu();
initial begin
$printtimescale(tb);
$printtimescale(tb.m_alu);
$printtimescale(tb.m_des);
end
endmodule
module alu;
endmodule
`timescale 1ns/10ps
module des;
endmodule
上記例では、tbとaluは1ns/1psのtimescaleになり、desはその定義前にディレクティブが置き換わったため1ns/10psのtimescaleになります。
xcelium> run Time scale of (tb) is 1ns / 1ps Time scale of (tb.m_alu) is 1ns / 1ps Time scale of (tb.m_des) is 1ns / 10ps xmsim: *W,RNQUIE: Simulation is complete.
Verilogファイル間のスコープ
他のファイルを`includeディレクティブで現在のファイルに含めることができます。これはプリプロセッサディレクティブであり、コンパイラに含まれるファイルの内容をコンパイル前に配置させます。したがって、これは単に他のファイルの全内容をこのメインファイルに貼り付けるのと同等です。
// main.v
`timescale 1ns/1ps
module tb;
des m_des();
alu m_alu();
initial begin
$printtimescale(tb);
$printtimescale(tb.m_alu);
$printtimescale(tb.m_des);
end
endmodule
`include "file_alu.v"
`include "file_des.v"
// file_alu.v
module alu;
endmodule
// file_des.v
`timescale 1ns/10ps
module des;
endmodule
結果は前の例と全く同じです。aluは、alu定義が見つかるまで最後のディレクティブが有効だったため、別ファイルに配置しても1ns/1psのtimescaleになります。desは、その定義前にディレクティブが置き換わったため1ns/10psのtimescaleになります。
xcelium> run Time scale of (tb) is 1ns / 1ps Time scale of (tb.m_alu) is 1ns / 1ps Time scale of (tb.m_des) is 1ns / 10ps xmsim: *W,RNQUIE: Simulation is complete.
ファイル順序の入れ替えでtimescaleが変わる
ファイルのインクルード順序は、timescaleディレクティブの再定義において重要な役割を果たします。これは以下の例から明らかです。
// main.v
`timescale 1ns/1ps
module tb;
des m_des();
alu m_alu();
initial begin
$printtimescale(tb);
$printtimescale(tb.m_alu);
$printtimescale(tb.m_des);
end
endmodule
// 注意!インクルード順序を入れ替え
`include "file_des.v"
`include "file_alu.v"
// file_alu.v
module alu;
endmodule
// file_des.v
`timescale 1ns/10ps
module des;
endmodule
aluモジュールが今度は1ns/10psのtimescaleを持つことがわかります。
xcelium> run Time scale of (tb) is 1ns / 1ps Time scale of (tb.m_alu) is 1ns / 10ps Time scale of (tb.m_des) is 1ns / 10ps xmsim: *W,RNQUIE: Simulation is complete.
これが、ファイルの先頭にtimescaleディレクティブを置き、そのファイル内のすべてのモジュールがファイルインクルード順序に関係なく正しいtimescaleを持つようにする理由の1つです。
ただし、このアプローチでは、各ファイルを変更せずに異なるtimescale精度(斜め以下の値)でコンパイルすることが難しくなる場合があります。多くのコンパイラとシミュレータは、すべてのモジュールに適用されるデフォルトtimescale値を上書きするオプションも提供しています。
Verilog
- Verilogマスター:デジタル回路設計のための完全チュートリアル
- Verilog連結マスター:実践ガイド
- Verilog代入文の理解:種類、構文、ベストプラクティス
- Verilogブロッキング代入とノンブロッキング代入:違いを徹底解説
- Verilog関数のマスター:効率的なRTL設計のために
- Verilogタスクの理解:関数との違い、構文、使用法
- Verilog階層参照スコープのマスター:モジュールとブロックでの名前衝突回避
- Verilogクロックジェネレータ:設計と実装ガイド
- Verilog数学関数のマスター:効率的なハードウェア設計のために
- Verilog $timeformatのマスター:精度と表示制御
- VerilogファイルI/Oの完全ガイド:オープン、読み取り、書き込み、クローズ