SV主要关键词详解

将采用按功能分组详解 的方式,对每个分组内的关键词给出清晰的定义、典型用法和必要示例。对于未在分组中单独列出的关键字(如门级原语nandnor等),我会在最后以补充列表形式简要说明其含义。

下面按照上一轮回答的分类,对每一类中的每个项目进行详解。


🔑 1. 基础关键词详解

1.1 数据类型与结构化类型

关键词 详细说明
bit 两状态(0/1)单比特数据类型,默认值为0。可用于可综合设计,但不能表示X/Z。
logic 四状态(0/1/X/Z)数据类型,可综合,代替Verilog的regwire。过程赋值用logic,连续赋值也允许。
reg Verilog遗留的四状态变量,在SystemVerilog中仍可用,推荐使用logic
int 两状态32位有符号整数,默认值0。用于循环计数或算法建模。
integer 四状态32位有符号整数,默认值X。仿真效率较低。
longint 两状态64位有符号整数。
shortint 两状态16位有符号整数。
byte 两状态8位有符号整数。
enum 定义枚举类型,如enum {RED, GREEN, BLUE} color;。可指定基类型。
struct 将多个变量组合成一个集合。可packedunpacked
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 定义底层序列,可组合使用##andorintersect等。
@(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 用于casebins,将高阻或X视为通配符。
soft 软约束,可被其他约束覆盖。
unique / unique0 / priority 修饰case/if,检查分支唯一性或优先级。
inside 包含运算符,用于随机约束中。
matched sequence方法,检测序列匹配结束。
triggered 事件是否已被触发(用于同步)。
null 空对象句柄。

📌 最后说明

  • 上述列表已覆盖IEEE 1800-2012标准中绝大多数关键词。由于篇幅,部分极罕见用语(如macromodulelarge等)已包含在"门级原语及开关"或"其他杂项"分组中。

  • 对于系统任务/函数,还存在$dumpfile$dumpvars(波形转储)、$fdisplay$swrite$sformatf$sscanf$value$plusargs等,限于篇幅未全部列出,但其语法与$display类似或属于文件格式化类别。

  • 全面参考:IEEE Std 1800-2023 是该语言的最终权威来源。如需特定关键词的精确用法,请查阅标准文档第A.4章(关键字列表)及各相关章节。

相关推荐
happyDogg_4 小时前
验证环境采样rtl时序数据遇到的问题
fpga开发
unicrom_深圳市由你创科技6 小时前
项目分析和FPGA器件选型外包服务包括哪些内容?别让选错芯片毁了整个项目
fpga开发
Aaron15886 小时前
27DR/47DR/67DR技术对比及应用分析
人工智能·算法·fpga开发·硬件架构·硬件工程·信息与通信·基带工程
my_daling7 小时前
DSMC通信协议理解,以及如何在FPGA上实现DSMC从设备(2)
学习·fpga开发
珞光电子USRP SDR软件无线电平台1 天前
打破通用瓶颈:珞光电子发布 Luowave Driver V2 定制化驱动方案
fpga开发
9527华安1 天前
FPGA实现PCIe数据通信培训课程,提供工程源码+视频教程+FPGA开发板
fpga开发·pcie·视频教程·培训
my_daling1 天前
FPGA实现IIC主机读写,以及部分IIC传感器控制流程
fpga开发
乌恩大侠1 天前
【AI-RAN】在空ubuntu服务器安装环境和生成TV,高达430G文件
服务器·人工智能·ubuntu·fpga开发·o-ru
qq_150841991 天前
高云FPGA固件下载速成
fpga开发