1. verilog 编译指令
以反引号 `
开始的某些标识符是 verilog 系统编译指令。
2. `define
在编译阶段,`define
用于文本替换,类似于 C 语言中的 #define 。
一旦 `define
指令被编译,其在整个编译过程种都会有效。
例如:在一个文件中定义
`degine DATA 64
那么在另一个文件种也可以直接使用 DATA。
例如:在另一个文件中
reg [DATA-1:0] a ;
3. `undef
`undef
用来取消之前的宏定义。
例如:
`define DATA 64
reg [DATA-1:0] a ;
`undef DATA
笔记
除此之外,还有条件编译指令。
- 格式 1
`ifdef
...
`elsif
...
`else
...
`endif
例如:
`ifdef A /// 如果定义了A,那么DATA等于8
parameter DATA = 8 ;
`elsif B /// 如果定义了B,那么DATA等于16
parameter DATA = 16 ;
`else /// 否则,DATA等于32
parameter DATA = 32 ;
`endif
- 格式 2
`ifdef
...
`else
...
`endif
用法和格式 1 类似。
- 格式 3
`ifndef
...
`else
...
`endif
例如:
`ifndef A /// 如果没有定义A,那么DATA=8
parameter DATA = 8 ;
`else /// 否则,DATA=16
parameter DATA = 16 ;
`endif
4. `include
使用 `include
可以在编译一个 verilog 文件时调用另一个 verilog 文件,类似于 C 语言中 #include
结构。
该指令通常用于将全局或共用的头文件包含在设计文件中。
例如:
module a(
...
);
...
endmodule
`include "./a.v"
module b(
...
);
...
endmodule
这样在编译 b.v 时,就会调用 a.v 的内容。
5. `timescale
在 verilog 模型中,时延有具体的单位时间表述,并用 `timescale
编译指令将时间单位与实际时间相关联。
该指令用于定义时延,仿真单位和精度。
格式
`timescale 【时间单位】/【时间精度】
`timesacle time_unit/time_precision
例如
`timescale 1ns/100ps
/// 时间精度和时间单位可以一样。但时间精度大小不能超过时间单位的大小
/// `timescale 100ps/1ns /// 不合法,
module a();
parameter PERIOD = 5 ;
reg [7:0] data ;
initial begin
#1 data = 0 ; /// 1*1ns = 1ns, 1ns后data=0
#5*PERIOD data = 1 ; /// 5*5ns = 25ns, 25ns后data=1
end
笔记
`timecasle
的时间精度会影响仿真时间的。
时间精度越小,仿真时占用的内存越多,实际使用的仿真时间越长。
6. 其它
除上面的 5 种编译指令,还有 `default_nettype
,`resetall
,`celldefine, `endcelldefine
`unconnected_drive,`nounconnected_drive
等。
这些编译指令我在日常工作中几乎没有看到过,实际工作中很少用到,简单了解,知道有这些就好。