Verilog HDL 学习笔记(十八)| 附录C:关键字、系统任务和编译指令

C.1 Verilog 关键字(Keywords)

一、什么是关键字?

关键字(Keyword) 是 Verilog 语言预定义的、有特殊含义的标识符 。所有关键字全部小写,不能用作变量名、模块名等。

⚠️ 重要提醒 :Verilog 区分大小写always 是关键字,AlwaysALWAYS 不是关键字(但也不建议用作变量名,容易混淆)。

二、关键字完整清单(按字母顺序)

关键字 用途分类 说明
always 行为级建模 无限循环的过程块
and 门级原语 与门
assign 数据流建模 连续赋值
automatic 任务/函数 自动(可重入)任务/函数
begin 块语句 顺序块开始
buf 门级原语 缓冲器
bufif0 门级原语 低电平使能三态缓冲器
bufif1 门级原语 高电平使能三态缓冲器
case 行为级建模 多路分支
casex 行为级建模 多路分支(x为无关项)
casez 行为级建模 多路分支(z为无关项)
cmos 开关级原语 CMOS开关
deassign 过程连续赋值 取消assign赋值
default 行为级建模 case默认分支
defparam 参数重载 参数重定义
disable 块语句 禁用命名块
edge 时序控制 边沿控制
else 行为级建模 if-else分支
end 块语句 顺序块结束
endcase 行为级建模 case结束
endfunction 任务/函数 函数结束
endmodule 模块 模块结束
endprimitive UDP 原语结束
endspecify 路径延迟 specify块结束
endtable UDP 状态表结束
endtask 任务/函数 任务结束
event 数据类型 命名事件
for 行为级建模 for循环
force 过程连续赋值 强制赋值
forever 行为级建模 无限循环
fork 块语句 并行块开始
function 任务/函数 函数定义
if 行为级建模 条件语句
ifnone 路径延迟 默认路径延迟
initial 行为级建模 只执行一次的过程块
inout 端口 双向端口
input 端口 输入端口
integer 数据类型 32位有符号整数
join 块语句 并行块结束
large 强度 大电容强度
macromodule 模块 宏模块(同module)
medium 强度 中电容强度
module 模块 模块定义
nand 门级原语 与非门
negedge 时序控制 下降沿
nmos 开关级原语 NMOS开关
nor 门级原语 或非门
not 门级原语 非门
notif0 门级原语 低电平使能三态非门
notif1 门级原语 高电平使能三态非门
or 门级原语 或门
output 端口 输出端口
parameter 参数 参数定义
pmos 开关级原语 PMOS开关
posedge 时序控制 上升沿
primitive UDP 原语定义
pull0 强度 下拉强度
pull1 强度 上拉强度
pulldown 门级原语 下拉电阻
pullup 门级原语 上拉电阻
rcmos 开关级原语 阻抗CMOS开关
real 数据类型 实数
realtime 数据类型 实数时间
reg 数据类型 寄存器
release 过程连续赋值 释放强制赋值
repeat 行为级建模 重复循环
rnmos 开关级原语 阻抗NMOS开关
rpmos 开关级原语 阻抗PMOS开关
rtran 开关级原语 阻抗双向开关
rtranif0 开关级原语 阻抗双向开关(低电平)
rtranif1 开关级原语 阻抗双向开关(高电平)
scalared 数据类型 标量向量
small 强度 小电容强度
specify 路径延迟 路径延迟块开始
specparam 路径延迟 路径延迟参数
strong0 强度 强0驱动
strong1 强度 强1驱动
supply0 强度/线网 地(逻辑0)
supply1 强度/线网 电源(逻辑1)
table UDP 状态表开始
task 任务/函数 任务定义
time 数据类型 64位时间变量
tran 开关级原语 双向开关
tranif0 开关级原语 双向开关(低电平)
tranif1 开关级原语 双向开关(高电平)
tri 线网 三态线网
tri0 线网 三态线网(默认0)
tri1 线网 三态线网(默认1)
triand 线网 三态线与
trior 线网 三态线或
trireg 线网 电容线网
vectored 数据类型 向量
wait 时序控制 电平敏感等待
wand 线网 线与
weak0 强度 弱0驱动
weak1 强度 弱1驱动
while 行为级建模 while循环
wire 线网 普通连线
wor 线网 线或
xnor 门级原语 同或门
xor 门级原语 异或门

💡 总计约 100 个关键字。初学者不需要全部记住,常用的只有 30-40 个,其他用到时查阅即可。

三、关键字分类速记

分类 关键字
模块相关 moduleendmodulemacromodule
端口相关 inputoutputinout
数据类型 wireregintegerrealtimerealtimeeventparameter
线网类型 wirewandwortritri0tri1triandtriortriregsupply0supply1
门级原语 andnandornorxorxnornotbufbufif0bufif1notif0notif1pulluppulldown
开关级原语 nmospmoscmosrnmosrpmosrcmostrantranif0tranif1rtranrtranif0rtranif1
行为级建模 alwaysinitialifelsecasecasexcasezdefaultforwhilerepeatforever
块语句 beginendforkjoindisable
任务/函数 taskendtaskfunctionendfunctionautomatic
时序控制 posedgenegedgewaitedge
过程赋值 assigndeassignforcerelease
强度 supply0supply1strong0strong1pull0pull1weak0weak1largemediumsmallhighz
路径延迟 specifyendspecifyspecparamifnone
UDP primitiveendprimitivetableendtable
参数重载 defparam
其他 scalaredvectored

C.2 系统任务和系统函数(System Tasks and Functions)

一、什么是系统任务/函数?

系统任务/函数 是 Verilog 预定义的特殊任务/函数,以 $ 开头。它们用于执行仿真控制、输入输出、调试等操作。

⚠️ 系统任务/函数不可综合,仅用于仿真。

二、显示类系统任务

二、显示类系统任务

系统任务 功能 示例
$display 打印并自动换行 $display("Value = %d", x);
$write 打印不换行 $write("Value = %d", x);
$monitor 持续监视信号变化 $monitor("x = %d", x);
$monitoron 开启监视 $monitoron;
$monitoroff 关闭监视 $monitoroff;
$strobe 选通显示(同一时刻最后执行) $strobe("x = %d", x);
$fdisplay 写入文件并换行 $fdisplay(fd, "x = %d", x);
$fwrite 写入文件不换行 $fwrite(fd, "x = %d", x);
$fmonitor 持续监视并写入文件 $fmonitor(fd, "x = %d", x);
$fstrobe 选通写入文件 $fstrobe(fd, "x = %d", x);

格式说明符:

格式符 含义 示例输出
%d / %D 十进制 10
%b / %B 二进制 1010
%h / %H 十六进制 A
%o / %O 八进制 12
%s / %S 字符串 Hello
%c / %C ASCII字符 A
%m / %M 层次名 top.u1
%v / %V 信号强度 St1
%t / %T 时间格式 100
%e / %E 科学计数法 3.0e+06
%f / %F 浮点数 3.140000
%g / %G 自动格式 3.14

三、仿真控制类系统任务

系统任务 功能 示例
$finish 结束仿真 $finish;
$stop 暂停仿真 $stop;
$time 返回当前仿真时间 t = $time;
$stime 返回当前仿真时间(32位) t = $stime;
$realtime 返回当前仿真时间(实数) t = $realtime;
$timeformat 设置时间显示格式 $timeformat(-9, 2, "ns", 10);

四、文件操作类系统任务

系统任务 功能 示例
$fopen 打开文件 fd = $fopen("data.txt");
$fclose 关闭文件 $fclose(fd);
$readmemb 读取二进制文件初始化存储器 $readmemb("init.dat", mem);
$readmemh 读取十六进制文件初始化存储器 $readmemh("init.hex", mem);

五、随机数生成类系统任务

系统任务 功能 示例
$random 生成32位有符号随机数 r = $random;
$random(seed) 带种子的随机数 r = $random(seed);
$dist_uniform 均匀分布随机数 $dist_uniform(seed, start, end);
$dist_normal 正态分布随机数 $dist_normal(seed, mean, std_dev);
$dist_exponential 指数分布随机数 $dist_exponential(seed, mean);
$dist_poisson 泊松分布随机数 $dist_poisson(seed, mean);
$dist_chi_square 卡方分布随机数 $dist_chi_square(seed, degree);
$dist_t t分布随机数 $dist_t(seed, degree);
$dist_erlang 厄兰分布随机数 $dist_erlang(seed, k, mean);

六、仿真时间与转储类系统任务

系统任务 功能 示例
$dumpfile 指定VCD文件 $dumpfile("wave.vcd");
$dumpvars 指定要转储的信号 $dumpvars(0, top);
$dumpon 开始转储 $dumpon;
$dumpoff 停止转储 $dumpoff;
$dumpall 生成检查点 $dumpall;

七、PLI相关系统任务

系统任务 功能
$test$plusargs 测试命令行参数是否存在
$value$plusargs 获取命令行参数的值
$sdf_annotate 延迟反标注

八、其他常用系统任务

系统任务 功能
$signed 将无符号数转为有符号数
$unsigned 将有符号数转为无符号数
$bits 返回表达式的位宽
$clog2 计算以2为底的对数向上取整
$itor 整数转实数
$rtoi 实数转整数
$bitstoreal 位向量转实数
$realtobits 实数转位向量
$scale 缩放时间

C.3 编译指令(Compiler Directives)

一、什么是编译指令?

编译指令 以反引号 ````` 开头,在编译阶段生效,用于控制编译器的行为。

⚠️ 区分反引号和单引号 :反引号 ````` 在键盘 Tab 键上方,单引号 ' 在回车键左边。初学者常把 ```define`` 写成 'define,导致编译错误。

二、编译指令完整清单

编译指令 功能 示例
define`` | 定义文本宏 | define WIDTH 8``
undef`` | 取消宏定义 | undef WIDTH``
ifdef`` | 条件编译(已定义) | ifdef DEBUG``
ifndef`` | 条件编译(未定义) | ifndef SIMULATION``
else`` | 条件编译否则分支 | else``
elsif`` | 条件编译否则如果 | elsif FPGA``
endif`` | 条件编译结束 | endif``
include`` | 包含其他文件 | include "defines.vh"``
timescale`` | 设置时间单位和精度 | timescale 1ns/10ps``
default_nettype`` | 设置默认线网类型 | default_nettype none``
resetall`` | 重置所有编译指令为默认值 | resetall``
celldefine`` | 标记模块为单元定义 | celldefine``
endcelldefine`` | 结束单元定义 | endcelldefine``
unconnected_drive`` | 设置未连接端口驱动 | unconnected_drive pull0``
nounconnected_drive`` | 取消未连接端口驱动 | nounconnected_drive``
line`` | 设置行号和文件名 | line 100 "test.v" 0``
begin_keywords`` | 指定关键字版本 | begin_keywords "1364-2001"``
end_keywords`` | 结束关键字版本指定 | end_keywords``
pragma`` | 编译指示 | pragma protect``

三、最常用的编译指令详解

1. ```define`` ------ 文本宏定义
复制代码
// 定义常量
`define DATA_WIDTH 8
`define OP_ADD 3'b001

// 使用宏(必须加反引号)
reg [`DATA_WIDTH-1:0] data;
wire [`DATA_WIDTH-1:0] result;

// 定义带参数的宏
`define MAX(a, b) ((a) > (b) ? (a) : (b))
wire [7:0] max_val = `MAX(a, b);
2. ```include`` ------ 文件包含
复制代码
// 包含头文件
`include "aludefines.vh"

module top;
    reg [`DATA_WIDTH-1:0] data;   // 使用头文件中的宏
endmodule
3. ```timescale`` ------ 时间尺度
复制代码
// 时间单位1ns,精度10ps
`timescale 1ns / 10ps

module test;
    initial begin
        #10;    // 延迟10ns
        $display("Time = %t", $time);
    end
endmodule
4. ifdef`` / else / ```endif ------ 条件编译
复制代码
`define DEBUG

module test;
    initial begin
        `ifdef DEBUG
            $display("Debug mode enabled");
            $monitor("q = %d", q);
        `else
            $display("Release mode");
        `endif
    end
endmodule
5. ```default_nettype`` ------ 默认线网类型
复制代码
// 禁止隐式线网声明(推荐!)
`default_nettype none

module test;
    // 如果没有声明wire,编译器会报错
    // wire out;    // ✅ 显式声明
    // assign out = a & b;
endmodule

推荐使用 ```default_nettype none``:它会强制你显式声明所有线网,避免因拼写错误导致的隐式线网声明问题。

C.4 常用关键字、系统任务、编译指令速查

一、最常用的10个关键字

关键字 用途
module / endmodule 模块定义
input / output 端口声明
wire / reg 数据类型
assign 连续赋值
always / initial 过程块
if / else 条件语句
case / endcase 多路分支
begin / end 顺序块
posedge / negedge 时钟边沿
parameter 参数定义

二、最常用的10个系统任务

系统任务 用途
$display 打印信息
$monitor 持续监视
$finish 结束仿真
$stop 暂停仿真
$time 获取仿真时间
$random 生成随机数
$readmemb / $readmemh 初始化存储器
$fopen / $fclose 打开/关闭文件
$fdisplay 写入文件
$dumpfile / $dumpvars VCD转储

三、最常用的5个编译指令

编译指令 用途
```define`` | 定义宏 |
```include`` | 包含文件 |
```timescale`` | 设置时间尺度 |
ifdef`` / endif`` 条件编译
```default_nettype none`` | 禁止隐式线网 |
相关推荐
free-elcmacom4 小时前
FPGA学习笔记<1>FPGA的开发流程
fpga开发·硬件工程·hdl
明德扬5 小时前
AD9653单通道波形怎么看?幅度、频率与基础测量入门
学习·fpga开发·fpga
ERROR:996 小时前
GPT Images 2.5将手稿转时序图效果不佳
fpga开发
尤老师FPGA6 小时前
声学相机介绍
fpga开发
科恒盛远13 小时前
ZU902 FMC194 可编程宽带信号源实测
fpga开发·硬件工程·信号处理
大盛供应链·卢生16 小时前
哪些国产芯片可以替代进口芯片,哪些替代不了
fpga开发·容器
ALINX技术博客1 天前
跨越 1819 公里,ALINX 携 AI 异构平台、电子后视镜及 HIL 仿真方案亮相深圳国际电子展
ai·fpga开发·汽车
Enclustra_China1 天前
FMC为何成为FPGA生态的“万能扩展接口”?
fpga开发·fpga解决方案
tju新生代魔迷1 天前
Verilog HDL 学习笔记(十七)| 附录B:PLI子程序清单
fpga开发