Verilog 时间刻度范围
默认时间刻度
虽然预计 Verilog 模块在模块之前定义了时间刻度,但模拟器可能会插入默认时间刻度。可以使用系统任务 $printtimescale
打印在 Verilog 详细层次结构中的任何范围内应用的实际时间刻度 它接受范围作为参数。
module tb;
initial begin
// Print timescale of this module
$printtimescale(tb);
// $printtimescale($root);
end
endmodule
看到即使在这个模块之前没有放置时间刻度指令,模拟器最终还是应用了 1ns/1ns 时间刻度值。
模拟日志xcelium> run Time scale of (tb) is 1ns / 1ns xmsim: *W,RNQUIE: Simulation is complete.
标准时间尺度范围
默认情况下,放置在文件中的 timescale 指令将应用于该指令之后的所有模块,直到定义另一个 timescale 指令。
`timescale 1ns/1ps
module tb;
des m_des();
alu m_alu();
initial begin
$printtimescale(tb);
$printtimescale(tb.m_alu);
$printtimescale(tb.m_des);
end
endmodule
module alu;
endmodule
`timescale 1ns/10ps
module des;
endmodule
在上面的例子中,tb 和 alu 的时间刻度为 1ns/1ns,而 des 的时间刻度为 1ns/10ps,因为在 des 的模块定义之前放置了指令
模拟日志xcelium> run Time scale of (tb) is 1ns / 1ps Time scale of (tb.m_alu) is 1ns / 1ps Time scale of (tb.m_des) is 1ns / 10ps xmsim: *W,RNQUIE: Simulation is complete.
Verilog 文件之间的范围
可以使用 `include
将其他文件包含到当前文件中 指令,它是一个预处理器指令,使编译器在编译之前放置包含文件的内容。所以,这相当于简单地将其他文件的全部内容粘贴到这个主文件中。
// main.v
`timescale 1ns/1ps
module tb;
des m_des();
alu m_alu();
initial begin
$printtimescale(tb);
$printtimescale(tb.m_alu);
$printtimescale(tb.m_des);
end
endmodule
`include "file_alu.v"
`include "file_des.v"
// file_alu.v
module alu;
endmodule
// file_des.v
`timescale 1ns/10ps
module des;
endmodule
看到结果与前面的示例完全相同。 alu 获得 1ns/1ps 的时间刻度,因为它是最后一个保持有效的指令,直到编译器找到 alu 定义,尽管将它放在不同的文件中。 des 获得 1ns/10ps 的时间刻度,因为该指令在其定义之前被替换。
模拟日志xcelium> run Time scale of (tb) is 1ns / 1ps Time scale of (tb.m_alu) is 1ns / 1ps Time scale of (tb.m_des) is 1ns / 10ps xmsim: *W,RNQUIE: Simulation is complete.
交换文件可以改变时间尺度
文件的包含顺序在时间刻度指令的重新定义中起着重要作用,这在下面的示例中很明显。
// main.v
`timescale 1ns/1ps
module tb;
des m_des();
alu m_alu();
initial begin
$printtimescale(tb);
$printtimescale(tb.m_alu);
$printtimescale(tb.m_des);
end
endmodule
// NOTE! Swapped order of inclusion
`include "file_des.v"
`include "file_alu.v"
// file_alu.v
module alu;
endmodule
// file_des.v
`timescale 1ns/10ps
module des;
endmodule
看到模块 alu 现在获得了 1ns/10ps 的时间尺度。
模拟日志xcelium> run Time scale of (tb) is 1ns / 1ps Time scale of (tb.m_alu) is 1ns / 10ps Time scale of (tb.m_des) is 1ns / 10ps xmsim: *W,RNQUIE: Simulation is complete.
这是在文件顶部设置时间刻度指令的原因之一,以便该文件中的所有模块都假定正确的时间刻度,而与文件包含无关。
但是,这种方法可能难以在不更改每个文件的情况下以不同的时间尺度精度(斜线后面的值)进行编译。许多编译器和模拟器还提供了一个选项来覆盖将应用于所有模块的默认时间刻度值。
Verilog