Menu
CoddyTech

时间尺度指令

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

timescale 指令用于设置仿真的时间单位和时间精度。它会告诉模拟器如何解释像 #10 这样的延迟值。

在之前的课中,我们使用了类似 #10 的延迟,却没有说明“10”代表什么。它是 10 纳秒吗?还是 10 皮秒?timescale 指令可以回答这个问题。

语法:

`timescale time_unit / time_precision
部分含义示例
time_unit延迟的基本单位1ns
time_precision仿真的精度1ps

timescale 前面的反引号 ` 表示它是一个编译器指令。

示例

`timescale 1ns / 1ps
  • time_unit = 1ns → #10 表示 10 纳秒
  • time_precision = 1ps → 仿真会四舍五入到最接近的皮秒

常见时间刻度值

时间单位精度使用场景
1ns / 1ns纳秒简单仿真
1ns / 1ps皮秒更高精度
1ps / 1ps皮秒高速设计
1us / 1ns微秒慢速仿真

它如何影响延迟

`timescale 1ns / 1ps

initial begin
  #10 a = 1;   // 等待 10 纳秒
end

如果没有 timescale,一些模拟器会采用默认值(通常为 1ns)。最好始终指定它。

重要规则

规则说明
必须位于模块外部放在任何模块定义之前
反引号符号`timescale,而不是 'timescale 
时间单位 ≥ 时间精度1ns / 1ps 可以,1ps / 1ns 不可以
影响文件中的所有延迟常规延迟、门延迟、赋值延迟
challenge icon

挑战

要做什么:

添加缺失的 timescale 指令,让延迟分别表示 10ns、20ns 和 30ns。

亲手试试

// TODO: 添加时间尺度指令(1ns / 1ps)

module timescale_challenge;
  
  initial begin
    $display("Time %0t", $time);
    #10 $display("Time %0t (10ns = 10000ps)", $time);
    #10 $display("Time %0t (20ns = 20000ps)", $time);
    #10 $display("Time %0t (30ns = 30000ps)", $time);
    $finish;
  end
endmodule
quiz icon自我测试

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

基础知识中的所有课

自己练习: Verilog 在线编译器