📅  最后修改于: 2023-12-03 14:48:18.400000             🧑  作者: Mango
Verilog中的系统任务是一种已定义的任务,它们可以被Verilog编程语言的设计者所提供,用于执行特定的操作。系统任务与用户定义的任务不同,因为它们的实现是具有特殊含义的编译器指令,而不是用户定义的行为。该特性使得系统任务在模拟和综合过程中表现更稳定可靠。
以下是一些常见的Verilog系统任务:
$display
是一个重要的系统任务,用于在终端上打印信息。语法如下:
$display(format_string, arg1, arg2, ..., argN);
其中,format_string
是一个格式化字符串,类似于C语言中的printf
函数。arg1
到argN
是变量或表达式,用于填充format_string
中的占位符。
例如:
module test;
reg [7:0] a;
initial begin
a = 8'hFF;
$display("a = %d, %b, %h", a, a, a);
end
endmodule
以上代码中,$display
任务会在仿真开始时输出以下信息:
a = -1, 1111_1111, FF
$monitor
任务与$display
任务类似,但可以在仿真过程中自动更新输出信息。语法如下:
$monitor(format_string, arg1, arg2, ..., argN);
format_string
、arg1
到argN
的含义与$display
任务相同。不同的是,$monitor
任务会在仿真过程中持续更新,每次输出信息时都会重新计算表达式的值。
例如:
module test;
reg [7:0] a;
initial begin
a = 8'hFF;
$monitor("a = %d, %b, %h", a, a, a);
#10 a = 8'hAA;
#10 a = 8'h55;
end
endmodule
以上代码中,$monitor
任务会在仿真过程中输出以下信息:
a = -1, 1111_1111, FF
a = -86, 1010_1010, AA
a = -171, 0101_0101, 55
$strobe
任务用于向仿真器发送一个脉冲信号。可以使用它来触发逻辑分析仪或其他类似的工具。语法如下:
$strobe(signal);
其中,signal
是一个输出信号。
例如:
module test;
reg clk;
initial begin
clk = 0;
forever #5 clk = ~clk;
end
always @(posedge clk) $strobe($time);
endmodule
以上代码中,$strobe
任务会在每个时钟上升沿触发,向仿真器发送一个脉冲信号。
$time
是一个系统任务,返回仿真器运行的时间,以时钟周期为单位。可以在$display
、$monitor
任务中使用它来输出仿真时间。
例如:
module test;
reg clk;
initial begin
clk = 0;
forever #5 clk = ~clk;
end
always @(posedge clk) $display("Time: %t", $time);
endmodule
以上代码中,$display
任务会在每个时钟上升沿触发,输出仿真器运行的时间。