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章(关键字列表)及各相关章节。

相关推荐
仲南音16 小时前
Xilinx FPGA——时钟IP核MMCM、PLL
fpga开发
I'm a winner1 天前
基于Xilinx FPGA的LVDS高速串行通信系统(三)--数据训练及握手机制【文末源码】
fpga开发
upper20201 天前
coremark移植坑之-nostartfiles -nostdlib参数
学习·fpga开发·coremark移植·riscv设计
Eloudy2 天前
Vivado 纯命令行构建 FPGA 项目教程
fpga开发
Rambo.xia2 天前
AXI跨时钟域与数据一致性——CDC FIFO深度不够、写后读冒险、多Master仲裁、乱序返回,出了Bug根本查不出来
fpga开发·bug
upper20202 天前
FPGA部署卷积神经网络识别MINST图片
fpga开发·卷积神经网络·minst·minst识别·部署神经网络·神经网络识别图片
你是我的解忧王子2 天前
嵌入式 ADC采样 原始数据分析上层(平均值 波动率 正态分布 线性补偿 系统误差)
fpga开发·数据挖掘·数据分析
9527华安3 天前
FPGA纯verilog代码ISP图像处理培训教程,基于IMX214,提供工程源码+视频教程+FPGA开发板
图像处理·fpga开发·isp·imx214·mipi
千寻xun3 天前
二、实战篇-NVME SSD控制之ZYNQ实现(六)-读写NVME SSD硬盘数据
fpga开发·nvme·nvme ssd
千寻xun3 天前
二、实战篇-NVME SSD控制之ZYNQ实现(三)
fpga开发·nvme ssd·nvme协议