📜  verilog 中的系统任务是什么 (1)

📅  最后修改于: 2023-12-03 14:48:18.400000             🧑  作者: Mango

Verilog中的系统任务是一种已定义的任务,它们可以被Verilog编程语言的设计者所提供,用于执行特定的操作。系统任务与用户定义的任务不同,因为它们的实现是具有特殊含义的编译器指令,而不是用户定义的行为。该特性使得系统任务在模拟和综合过程中表现更稳定可靠。

以下是一些常见的Verilog系统任务:

$display

$display是一个重要的系统任务,用于在终端上打印信息。语法如下:

$display(format_string, arg1, arg2, ..., argN);

其中,format_string是一个格式化字符串,类似于C语言中的printf函数。arg1argN是变量或表达式,用于填充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

$monitor任务与$display任务类似,但可以在仿真过程中自动更新输出信息。语法如下:

$monitor(format_string, arg1, arg2, ..., argN);

format_stringarg1argN的含义与$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任务用于向仿真器发送一个脉冲信号。可以使用它来触发逻辑分析仪或其他类似的工具。语法如下:

$strobe(signal);

其中,signal是一个输出信号。

例如:

module test;
   reg clk;
   initial begin
      clk = 0;
      forever #5 clk = ~clk;
   end
   always @(posedge clk) $strobe($time);
endmodule

以上代码中,$strobe任务会在每个时钟上升沿触发,向仿真器发送一个脉冲信号。

$time

$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任务会在每个时钟上升沿触发,输出仿真器运行的时间。