システムタスク
- モニタータスク モニタータスク$monitorは、指定されたパラメータを継続的に監視し、パラメータの値が変化したときにその値を表示します。フォーマットは$displayや$writeと同様です。パラメータには$timeシステム関数を使用できます。
// 例: D, Clk, Qの値を監視
initial begin
$monitor("At %t, D=%b, Clk=%b and Q is %b", $time, D, Clk, Q);
end
// 出力:
// At 24, D=x, Clk=x and Q is 0
// At 25, D=x, Clk=x and Q is 1
// At 30, D=0, Clk=x and Q is 1
- $monitoroff タスクは$monitorを停止します。
- $monitoron タスクは$monitorを再開します。 $monitorは通常、initialブロック内で呼び出され、$monitoroffが呼ばれるまで継続的に監視します。
- 仿真控制任务
// 仿真控制任务用于使仿真进程停止。该类任务有两个:
$finish
$stop
// 两者用法相同,以$stop为例说明:
initial #500 $stop;
// 执行此initial语句将使仿真进程在500个时间单位后停止。
// 这两个系统任务都是终止仿真:
◆$finish终止仿真进程后,会把控制权返回操作系统;
◆$stop终止仿真进程后,没有返回操作系统,而是返回仿真器的命令行。
- ファイル出力タスク
//$readmemb: 二進数形式のデータ読み込み
//$readmemh: 十六進数形式のデータ読み込み
これらのシステムタスクは、テキストファイルからデータを読み取り、メモリにロードします。以下の形式で使用します。
// 例: 256アドレスのバイトメモリmemを定義
reg [7:0] mem [1:256];
// 次のシステムタスクはそれぞれ異なる方法でメモリmemにデータをロードする
initial $readmemh("mem.data", mem);
initial $readmemh("mem.data", mem, 16);
initial $readmemh("mem.data", mem, 128, 1);
別の方法として、特定のデータを特定のメモリアドレスに配置することもできます。テキストファイル内のデータにアドレスを指定することで、そのアドレスにデータを配置します。
// 例: @3 B のように指定すると、データBはアドレス3に配置され、その後のデータはアドレス4から順に配置される
- 仿真时间函数
Verilog HDLでは、現在のシミュレーション時間を取得するための2種類のシステム関数があります:$timeと$realtime。これらはモジュールのtimescaleに基づいています。
- $time: 64ビット整数型の時間を返す
- $realtime: 実数型の時間を返す
`timescale 10ns / 1ns
module test;
reg set;
parameter p = 1.6;
initial begin
$monitor($time, "set =", set);
#p set = 0;
#p set = 1;
end
endmodule
// 出力結果:
// 0 set = x
// 2 set = 0
// 3 set = 1
`timescale 10ns / 1ns
module test;
reg set;
parameter p = 1.55;
initial begin
$monitor($realtime, "set =", set);
#p set = 0;
#p set = 1;
end
endmodule
// 出力結果:
// 0 set = x
// 1.6 set = 0
// 3.2 set = 1
- 乱数関数random
乱数関数$randomは、新しい乱数を生成します。以下のように使用します。
// -59から59までの範囲の乱数を生成
reg [23:0] rand;
rand = $random % 60;
// 0から59までの範囲の乱数を生成
rand = {$random} % 60;