将采用按功能分组详解的方式,对每个分组内的关键词给出清晰的定义、典型用法和必要示例。对于未在分组中单独列出的关键字(如门级原语nand、nor等),我会在最后以补充列表形式简要说明其含义。
下面按照上一轮回答的分类,对每一类中的每个项目进行详解。
🔑 1. 基础关键词详解
1.1 数据类型与结构化类型
| 关键词 | 详细说明 |
|---|
bit | 两状态(0/1)单比特数据类型,默认值为0。可用于可综合设计,但不能表示X/Z。 |
logic | 四状态(0/1/X/Z)数据类型,可综合,代替Verilog的reg和wire。过程赋值用logic,连续赋值也允许。 |
reg | Verilog遗留的四状态变量,在SystemVerilog中仍可用,推荐使用logic。 |
int | 两状态32位有符号整数,默认值0。用于循环计数或算法建模。 |
integer | 四状态32位有符号整数,默认值X。仿真效率较低。 |
longint | 两状态64位有符号整数。 |
shortint | 两状态16位有符号整数。 |
byte | 两状态8位有符号整数。 |
enum | 定义枚举类型,如enum {RED, GREEN, BLUE} color;。可指定基类型。 |
struct | 将多个变量组合成一个集合。可packed或unpacked。 |
union | 同一存储位置共享不同数据类型。很少用于可综合设计。 |
packed | 修饰struct/union,使其按位存储,可进行位选择和算术运算。 |
1.2 硬件结构描述
| 关键词 | 详细说明 |
|---|
module / endmodule | 设计模块的基本单元。包含端口、内部信号和功能描述。 |
interface / endinterface | 封装一组相互关联的信号,可包含任务、函数、modport,用于模块间通信。 |
program / endprogram | 专用于测试平台的模块,避免竞争风险(在reactive区域执行)。 |
package / endpackage | 共享常量、类型、函数、类等定义的容器。使用import package::*;引用。 |
primitive / endprimitive | 定义用户自定义原语(UDP),用于查表实现简单逻辑。 |
1.3 过程块与逻辑行为
| 关键词 | 详细说明 |
|---|
always | 通用过程块,敏感列表变化时触发。容易因不完全敏感列表导致仿真与综合不匹配。 |
always_comb | 描述组合逻辑,自动敏感所有输入变量。解决always @(*)潜在问题,综合友好。 |
always_ff | 描述触发器(时序逻辑)过程块,推荐用于@(posedge clk)。 |
always_latch | 描述锁存器逻辑,综合工具会检查是否推断为锁存器。 |
initial | 在仿真0时刻执行一次,常用于测试平台初始化、波形文件生成等。不可综合。 |
final | 在仿真结束时刻执行一次,不可综合。通常用于打印最终统计信息。 |
1.4 并发与并行编程
| 关键词 | 详细说明 |
|---|
fork / join | 创建多个并发线程,等待所有子线程结束后继续。 |
join_any | 等待任意一个子线程结束即继续。 |
join_none | 不等待子线程,父线程继续执行。子线程在调度队列中稍后启动。 |
begin / end | 将多条语句组成顺序块。 |
1.5 控制流与循环
| 关键词 | 详细说明 |
|---|
if / else | 条件语句。可嵌套,注意else与最近的if配对。 |
case / casex / casez | case全等比较(包含X/Z);casex将X/Z视为无关;casez仅将Z视为无关。推荐使用case+unique/priority替代。 |
for / while | 循环语句。for一般用于固定次数,while用于条件控制。 |
repeat | 循环固定次数,如repeat(5) @(posedge clk);。 |
foreach | 遍历数组或队列元素,如foreach(arr[i])。 |
break / continue | 提前退出循环或跳至下一次迭代。 |
return | 从任务或函数中返回。函数必须有返回值。 |
1.6 类与面向对象编程
| 关键词 | 详细说明 |
|---|
class / endclass | 定义对象蓝图,可包含属性、方法、约束、覆盖组等。 |
new | 构造函数,用于创建对象实例。 |
this | 指向当前对象自身的句柄。用于区分成员变量与局部变量。 |
extends | 继承父类,子类获得父类所有非local成员。 |
super | 指向父类对象,用于调用父类构造函数或重载方法。 |
virtual | 修饰类方法,支持动态绑定(多态)。修饰类时表示抽象基类。 |
pure | 纯虚方法,无实现,必须配合virtual使用。 |
typedef | 创建用户自定义类型别名,如typedef bit [7:0] byte_t;。 |
1.7 随机化与约束
| 关键词 | 详细说明 |
|---|
rand | 随机变量修饰符,每次randomize()求解时均匀随机分布。 |
randc | 随机周期变量,取值会遍历所有可能性后重复。 |
constraint | 定义随机约束块,如constraint c { data inside {[0:255]}; }。 |
solve / dist | solve-before指导求解顺序提高性能;dist定义权重分布(如x dist {0:=40,1:=60})。 |
randcase | 随机case语句,按权重选择分支,如randcase 10: a=1; 20: a=2; endcase。 |
randsequence | 随机产生式序列,用于生成复杂协议序列。 |
1.8 断言与形式验证
| 关键词 | 详细说明 |
|---|
assert | 检查属性是否成立,若不成立则报告错误。 |
assume | 为形式验证工具提供输入假设(约束输入行为)。 |
cover | 监控属性是否被满足,用于功能覆盖率。 |
property / endproperty | 封装一个时序/组合逻辑断言属性。 |
sequence / endsequence | 定义一个时序序列,可被属性或断言复用。 |
expect | 等待某个序列发生,否则报错。通常用于测试环境。 |
1.9 其他重要关键字
| 关键词 | 详细说明 |
|---|
automatic | 声明任务/函数/模块为自动存储(可递归,变量独立)。 |
static | 使变量或类成员在多个实例间共享。 |
local | 限定成员仅可在当前类内部访问。 |
protected | 成员可在当前类及继承类访问,外部不可见。 |
extern | 声明外部实现的方法或任务(常在类外定义)。 |
import / export | 从包导入名称,或导出DPI函数。 |
bind | 将验证代码(断言、覆盖组)绑定到设计模块实例。 |
alias | 为信号或变量创建别名,常用于调试或连续赋值替代。 |
⚙️ 2. 系统任务与函数详解
| 名称 | 详细解释 |
|---|
$display | 自动换行打印,支持格式说明符(%b, %d, %h, %s等)。 |
$write | 与$display同,但不换行。 |
$strobe | 在仿真当前时间槽末尾(所有赋值完成后)打印变量最终值。 |
$monitor | 监控列出的变量,任一变化即打印。全局只激活一个监控。 |
$monitoron / $monitoroff | 打开/关闭监控输出。 |
$stop | 暂停仿真,进入交互模式。 |
$finish | 结束仿真,退出仿真器。 |
$exit | 在程序块中优雅结束仿真,返回系统。 |
$time | 返回64位整数仿真时间(按timescale缩放)。 |
$realtime | 返回实数仿真时间(包含小数部分)。 |
$random | 返回32位有符号整数随机数。 |
$urandom | 返回32位无符号整数随机数,更常用。 |
$urandom_range(max,min) | 返回指定范围内的无符号随机整数。 |
$fopen / $fclose | 打开/关闭文件,返回文件描述符(int)。 |
$fread | 从文件读取二进制/文本数据到存储器。 |
$readmemb / $readmemh | 将二进制/十六进制文本文件加载到内存数组。 |
$size | 返回数组/向量总位数(若为动态数组,返回大小)。 |
$countones | 统计表达式中值为1的位数。 |
$isunknown | 检查表达式中是否有X或Z。 |
$assertoff/$asserton/$assertkill | 控制断言禁用/恢复/终止。 |
更多系统函数(如文件I/O、时间格式、$test$plusargs等)请参考标准第20章。
🎲 3. 随机化详解
| 关键词/方法 | 详细解释 |
|---|
rand / randc | 修饰类成员变量,randomize()时求解。 |
randomize() | 类内置方法,成功返回1,失败返回0。 |
pre_randomize() / post_randomize() | 随机化前后自动调用的回调函数,可重载。 |
randomize() with { ... } | 内嵌额外约束,如if (!p.randomize() with {addr inside {[0:10]};})。 |
std::randomize() | 作用域随机化函数,可对任意局部变量随机。 |
rand_mode() | 控制随机变量开关:obj.x.rand_mode(0)禁用随机。 |
constraint_mode() | 控制约束块开关。 |
solve ... before ... | 指定随机变量的求解顺序,通常先随机solve a before b;,再根据a求解b。 |
dist | 用于约束块中定义加权分布:{0:=40, 1:=60}(权重基于值出现次数),{0:/40, 1:/60}(相对权重)。 |
randcase | 独立于类的随机分支语句。 |
randsequence | 生成符合语法的随机序列,支持产生式::=、|、*、+等。 |
📜 4. 断言(SVA)详解
| 构件 | 详细说明 |
|---|
assert property (property_expr) | 核心检查语句。可选pass/fail语句块。 |
assume property | 形式验证中设置环境约束。仿真中弱化为assert。 |
cover property | 用于覆盖率收集。 |
property ... endproperty | 定义带可选形式参数和时钟的时序属性。 |
sequence ... endsequence | 定义底层序列,可组合使用##、and、or、intersect等。 |
@(posedge clk) | 事件控制,定义时钟边沿。 |
##n | 固定时钟周期延迟。##1表示一个时钟周期后。 |
|-> | 重叠蕴涵:前提条件满足后,在同一周期检查结论。 |
|=> | 非重叠蕴涵:前提满足后,在下个时钟周期开始检查结论。 |
$rose(expr) | 检查表达式从0/x/z变为1。 |
$fell(expr) | 检查从1变为0。 |
$stable(expr) | 在整个周期内表达式值不变。 |
$past(expr, n) | 获取前n个周期的值。 |
$changed(expr) | 当前周期相对于上一周期是否变化。 |
$onehot(expr) | 多比特信号恰好只有一位为1。 |
$onehot0(expr) | 0或1为高。 |
$isunknown(expr) | 表达式中任意位是X或Z。 |
throughout | 序列在整个范围内成立。 |
within | 一个序列完全在另一个序列的内部。 |
intersect | 两个序列同时开始并同时结束。 |
first_match(seq) | 匹配序列的第一个合法起点。 |
expect | 等待属性成功,在过程块中使用。 |
🔄 5. 进程控制详解
| 关键词 | 解释 |
|---|
fork...join | 父线程阻塞直到所有子线程完成。 |
fork...join_any | 父线程阻塞直到任意个子线程完成。 |
fork...join_none | 父线程不阻塞,子线程稍后启动。 |
disable fork | 终止当前线程的所有活跃子线程(不包括父线程)。 |
disable <label> | 禁用指定命名块或任务。 |
wait fork | 阻塞直到所有子线程完成(通常用在fork...join_none后)。 |
🔌 6. 直接编程接口(DPI)详解
| 关键词 | 解释 |
|---|
import "DPI-C" function ... | 从C库导入函数。可附加pure(无副作用)或context。 |
import "DPI-C" task ... | 导入C任务(void函数)。 |
export "DPI-C" function ... | 将SystemVerilog函数导出,供C调用。 |
DPI-C | 指定使用C语言调用约定(类型映射)。 |
chandle | 用于存储C指针的不透明类型。 |
示例:
import "DPI-C" function int c_add(input int a, b);
export "DPI-C" function sv_display;
function void sv_display(string msg);
$display("%s", msg);
endfunction
🔍 补充:完整关键词列表中未详述的其他词汇解释
本部分对IEEE 1800-2012完整列表中的剩余关键词(未在以上分组中细述)进行集中解释。
门级原语及开关
| 关键词 | 含义 |
|---|
and / nand / or / nor / xor / xnor | 基本逻辑门(2输入或多输入)。 |
buf / not | 缓冲器/反相器。 |
bufif0 / bufif1 / notif0 / notif1 | 三态驱动门(使能低/高有效)。 |
pullup / pulldown | 上拉/下拉电阻。 |
tran / tranif0 / tranif1 / rtran | 双向开关,rtran表示电阻性。 |
cmos / rcmos / nmos / pmos / rnmos / rpmos | CMOS/MOS晶体管开关。 |
强度与线网
| 关键词 | 含义 |
|---|
highz0 / highz1 / strong0 / strong1 / pull0 / pull1 / weak0 / weak1 | 线网驱动强度。 |
wire / tri / triand / trior / trireg / tri0 / tri1 | 不同类型的线网。trireg可电容存储。 |
wand / wor | 线与/线或线网。 |
uwire | 单一驱动线网,防止多驱动错误。 |
supply0 / supply1 | 电源/地线网(最强驱动)。 |
vectored / scalared | 声明线网为向量或标量。 |
仿真控制及指定块
| 关键词 | 含义 |
|---|
specify / endspecify | 指定时序延迟和路径。 |
specparam | 指定块内的参数。 |
pulsestyle_ondetect / pulsestyle_onevent | 控制脉冲过滤风格。 |
showcancelled / noshowcancelled | 控制定时事件取消是否报告。 |
配置与库
| 关键词 | 含义 |
|---|
config / endconfig | 配置模块的库绑定。 |
design / liblist / library / incdir / include | 配置内用于指定库、源文件路径。 |
cell | 原语单元声明。 |
use | 配置中指定模块使用哪个库单元。 |
instance | 在配置中选择特定实例。 |
并发与同步
| 关键词 | 含义 |
|---|
event | 声明一个事件,用于->event触发,@event等待。 |
clocking / endclocking | 定义时钟块,用于同步驱动和采样信号。 |
modport | 在接口内定义不同角色的端口方向集。 |
sync_accept_on / sync_reject_on | 属性运算符,表示同步“接受/拒绝”复位。 |
accept_on / reject_on | 异步复位操作符(用于属性)。 |
nexttime / s_nexttime | 属性中表示下一个时钟。 |
until / s_until / until_with | 属性中表示条件满足之前一直保持。 |
always / s_always | 属性中表示全局或弱化全局成立。 |
eventually / s_eventually | 属性中表示最终条件成立。 |
implies | 逻辑蕴含操作符(形式验证)。 |
within | 序列运算,一个序列在另一个范围内。 |
intersect | 两个序列同时开始并同时结束。 |
数组/队列
| 关键词 | 含义 |
|---|
foreach | 已在前文循环部分提及。 |
dynamic | 并非关键字,但动态数组通过[]定义。 |
associative | 关联数组,数据类型修饰符(实际为[*])。 |
queue | 队列类型([$])。 |
其他杂项
| 关键词 | 含义 |
|---|
chandle | 存储C指针的句柄。 |
string | 字符串数据类型。 |
void | 表示函数无返回值或忽略表达式结果。 |
time / timeunit / timeprecision | 仿真时间单位/精度声明。 |
real / realtime / shortreal | 实数数据类型。 |
signed / unsigned | 整数有符号/无符号修饰。 |
tagged | 用于联合体的标记访问,增强类型安全。 |
wait_order | 等待多个事件以指定顺序发生。 |
wildcard | 用于case或bins,将高阻或X视为通配符。 |
soft | 软约束,可被其他约束覆盖。 |
unique / unique0 / priority | 修饰case/if,检查分支唯一性或优先级。 |
inside | 包含运算符,用于随机约束中。 |
matched | sequence方法,检测序列匹配结束。 |
triggered | 事件是否已被触发(用于同步)。 |
null | 空对象句柄。 |
📌 最后说明
-
上述列表已覆盖IEEE 1800-2012标准中绝大多数关键词。由于篇幅,部分极罕见用语(如macromodule、large等)已包含在“门级原语及开关”或“其他杂项”分组中。
-
对于系统任务/函数,还存在$dumpfile、$dumpvars(波形转储)、$fdisplay、$swrite、$sformatf、$sscanf、$value$plusargs等,限于篇幅未全部列出,但其语法与$display类似或属于文件格式化类别。
-
全面参考:IEEE Std 1800-2023 是该语言的最终权威来源。如需特定关键词的精确用法,请查阅标准文档第A.4章(关键字列表)及各相关章节。
所有评论(0)