以反引号 ` 开始的某些标识符是 Verilog 系统编译指令。
编译指令为 Verilog 代码的撰写、编译、调试等提供了极大的便利。
下面介绍下完整的 8 种编译指令,其中前 4 种使用频率较高。
在编译阶段,`define 用于文本替换,类似于 C 语言中的 #define。
一旦 `define 指令被编译,其在整个编译过程中都会有效。
`undef 用来取消之前的宏定义。
elsif,
else 编译指令对于 ifdef 指令是可选的,即可以只有
ifdef 和 `endif 组成一次条件编译指令块。
`ifdef MCU51 parameter DATA_DW = 8 ;//如果定义了MCU就使用第一种 `elsif WINDOW parameter DATA_DW = 64 ;//如果定义了WINDOW就使用第二种 `else parameter DATA_DW = 32 ;//如果都没有,就使用最后一种 `endif
`include
使用 `include 可以在编译时将一个 Verilog 文件内嵌到另一个 Verilog 文件中,作用类似于 C 语言中的 #include 结构。该指令通常用于将全局或公用的头文件包含在设计文件里。文件路径既可以使用相对路径,也可以使用绝对路径。这就是类似于c语言,c语言定义整个函数库,也就是连接整个函数库,在Verilog中通过
`timescale
在 Verilog 模型中,时延有具体的单位时间表述,并用 `timescale 编译指令将时间单位与实际时间相关联。
该指令用于定义时延、仿真的单位和精度,格式为:
`timescale time_unit / time_precision
time_unit 表示时间单位,time_precision 表示时间精度,它们均是由数字以及单位 s(秒),ms(毫秒),us(微妙),ns(纳秒),ps(皮秒)和 fs(飞秒)组成。时间精度可以和时间单位一样,但是时间精度大小不能超过时间单位大小,例如下面例子中,输出端 Z 会延迟 5.21ns 输出 A&B 的结果。
`timescale 1ns/100ps //时间单位为1ns,精度为100ps,合法 //`timescale 100ps/1ns //不合法 module AndFunc(Z, A, B); output Z; input A, B ; assign #5.207 Z = A & B endmodule
在编译过程中,timescale 指令会影响后面所有模块中的时延值,直至遇到另一个
timescale 指令或 `resetall 指令。 时延设置是一个覆写过程,一堆时延设置,只取最近的那一个
由于在 Verilog 中没有默认的 timescale,如果没有指定
timescale,Verilog 模块就有会继承前面编译模块的 `timescale 参数。有可能导致设计出错。(这里主要说明每块都需要定义时延值)
如果一个设计中的多个模块都带有 `timescale 时,模拟器总是定位在所有模块的最小时延精度上,并且所有时延都相应地换算为最小时延精度,时延单位并不受影响。
`default_nettype
该指令用于为隐式的线网变量指定为线网类型,即将没有被声明的连线定义为线网类型。