Menu
CoddyTech

什么是延迟

本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 67 课,共 90 课。

在 Verilog 中,延迟用于控制语句执行或信号变化的时间。它们用于模拟真实硬件的时序行为。

为什么需要延迟

真实硬件中的信号需要时间才能通过导线和逻辑门。延迟可以让你模拟这种时序行为。

  • 在仿真中,如果没有延迟,所有事情都会在时间 0 发生
  • 延迟可以让事件随着时间推移依次发生
  • 它们有助于测试时序敏感的设计,例如时钟和状态机

延迟类型

延迟类型用途
门延迟逻辑门中的延迟
赋值延迟赋值时的延迟
时间刻度指令设置仿真的时间单位

基本语法

延迟的写法是在数字前加上 #:

#10 clk = ~clk;   // 等待 10 个时间单位,然后翻转时钟信号
#5 a = b;         // 等待 5 个时间单位,然后执行 a = b

# 后面的数字表示需要等待的时间单位数。

简单示例

initial begin
  a = 0;
  #10 a = 1;   // 经过 10 个时间单位后,a 变为 1
  #5 a = 0;    // 再经过 5 个时间单位后,a 变为 0
end

时间:

  • 时间 0:a = 0
  • 时间 10:a = 1
  • 时间 15:a = 0

always 块中的延迟

always #5 clk = ~clk;   // 每隔 5 个时间单位翻转一次时钟信号

这会创建一个连续的时钟信号(假设 clk 已在 initial 块中先初始化为 0。否则,~x 会一直保持为 x)。

重要规则

规则说明
# 符号表示延迟
# 后面的数字要等待多少个时间单位
延迟会累积#10 然后 #20,总共等待 30 个时间单位
不可综合延迟仅用于仿真
challenge icon

挑战

要做什么:

添加缺少的延迟,让这段代码分别在时间 0、10、25 和 40 时打印消息。

亲手试试

module delay_challenge;
  
  initial begin
    $display("Time %0t: Start", $time);
    // TODO:添加延迟,使时间达到 10
    $display("Time %0t: After first delay", $time);
    // TODO:添加延迟,使时间达到 25
    $display("Time %0t: After second delay", $time);
    // TODO:添加延迟,使时间达到 40
    $display("Time %0t: End", $time);
    $finish;
  end
  
endmodule

quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基础知识中的所有课

自己练习: Verilog 在线编译器