Verilog 编译器指令是以反引号(`)开头的语句,不综合进逻辑电路,但在代码预处理阶段由仿真器或综合工具解析。常用于:
\
define` – 定义宏常量或宏函数语法:
`define 宏名 值
`define 宏函数(a, b) 表达式
示例:
`define DATA_WIDTH 8
`define MAX(a, b) ((a) > (b) ? (a) : (b))
reg [`DATA_WIDTH-1:0] data;
initial $display("Max: %d", `MAX(5, 9));
\
undef` – 取消宏定义示例:
`undef DATA_WIDTH
\
ifdef/
`ifndef/
`else/
`elsif/
`endif` – 条件编译示例:
`define DEBUG
`ifdef DEBUG
$display("Debug mode on");
`else
$display("Release mode");
`endif
\
include` – 引入外部头文件示例:
`include "defines.vh"
常配合 +incdir+路径
使用以指定 include 搜索路径。
\
timescale` – 设置仿真时间单位与精度语法:
`timescale 时间单位 / 时间精度
示例:
`timescale 1ns / 1ps // #1 表示 1ns,最小粒度为 1ps
\
default_nettype` – 控制未声明信号的默认类型示例:
`default_nettype none
禁止自动默认为 wire
,强制所有信号显式声明,避免拼写错误。
\
celldefine/
`endcelldefine` – 声明为单元库模块(ASIC 设计常用)示例:
`celldefine
module nand_gate(input a, b, output y);
assign y = ~(a & b);
endmodule
`endcelldefine
结构:
include/
├── defines.vh // 全局参数定义
├── platform_config.vh // 平台宏开关
使用方式:
`include "defines.vh"
reg [`DATA_WIDTH-1:0] din;
platform_config.vh:
`ifdef FPGA_VENDOR_XILINX
`define CLK_FREQ 100_000_000
`elsif FPGA_VENDOR_LATTICE
`define CLK_FREQ 25_000_000
`endif
顶层模块引用:
`include "platform_config.vh"
parameter CLK_FREQ_HZ = `CLK_FREQ;
defines.vh:
`define ENABLE_FILTER
top.v:
`ifdef ENABLE_FILTER
filter u_filter(...);
`else
bypass u_bypass(...);
`endif
`ifdef ENABLE_DEBUG
always @(posedge clk)
$display("Debug: din = %d", din);
`endif
Makefile:
DEFINES = +define+SIMULATION +define+FPGA_VENDOR_XILINX
vlog $(DEFINES) +incdir+include rtl/top.v sim/tb_top.v
指令 | 推荐使用时机 | 注意事项 |
---|---|---|
define |
定义常量、开关 | 命名需唯一,避免重复 |
include |
引入参数文件 | 配合 +incdir 使用 |
ifdef / endif |
条件配置/平台适配 | 与 define 配合使用 |
timescale |
仿真时间控制 | 每个文件建议统一设置 |
default_nettype none |
信号显式声明 | 强烈推荐写入所有源码文件头 |
undef |
控制宏作用范围 | 减少全局污染 |
Verilog 编译器指令为模块化设计、仿真控制、平台适配提供强大工具,合理使用可显著提升工程的可读性、可移植性与可维护性。
在大型 FPGA 项目中,建议:
defines.vh
;timescale
和 default_nettype
;