C.1 Verilog 关键字(Keywords)
一、什么是关键字?
关键字(Keyword) 是 Verilog 语言预定义的、有特殊含义的标识符 。所有关键字全部小写,不能用作变量名、模块名等。
⚠️ 重要提醒 :Verilog 区分大小写 。always 是关键字,Always 和 ALWAYS 不是关键字(但也不建议用作变量名,容易混淆)。
二、关键字完整清单(按字母顺序)
| 关键字 |
用途分类 |
说明 |
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 个,其他用到时查阅即可。
三、关键字分类速记
| 分类 |
关键字 |
| 模块相关 |
module、endmodule、macromodule |
| 端口相关 |
input、output、inout |
| 数据类型 |
wire、reg、integer、real、time、realtime、event、parameter |
| 线网类型 |
wire、wand、wor、tri、tri0、tri1、triand、trior、trireg、supply0、supply1 |
| 门级原语 |
and、nand、or、nor、xor、xnor、not、buf、bufif0、bufif1、notif0、notif1、pullup、pulldown |
| 开关级原语 |
nmos、pmos、cmos、rnmos、rpmos、rcmos、tran、tranif0、tranif1、rtran、rtranif0、rtranif1 |
| 行为级建模 |
always、initial、if、else、case、casex、casez、default、for、while、repeat、forever |
| 块语句 |
begin、end、fork、join、disable |
| 任务/函数 |
task、endtask、function、endfunction、automatic |
| 时序控制 |
posedge、negedge、wait、edge |
| 过程赋值 |
assign、deassign、force、release |
| 强度 |
supply0、supply1、strong0、strong1、pull0、pull1、weak0、weak1、large、medium、small、highz |
| 路径延迟 |
specify、endspecify、specparam、ifnone |
| UDP |
primitive、endprimitive、table、endtable |
| 参数重载 |
defparam |
| 其他 |
scalared、vectored |
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`` | 禁止隐式线网 | |
|