SystemVerilog 语法总结
SystemVerilog 在 Verilog 基础上扩展了硬件建模和验证功能,以下是其核心语法要点的系统化总结:
一、基础数据类型与操作
1. 数据类型
- 四态逻辑:
logic [7:0] data; // 替代 reg/wire,支持 0, 1, X, Z
- 两态类型:
bit a; // 0/1 int b; // 32位有符号整数 byte c; // 8位有符号整数
- 用户自定义类型:
typedef enum {IDLE, RUN, STOP} state_t; // 枚举 typedef struct { // 结构体 bit [31:0] addr; int data; } packet_t;
2. 操作符
- 通配符比较:
if (data ==? 8'b1xxx_0000) ... // 忽略 X/Z 的位比较
- 集合操作:
if (value inside {[0:255], 512}) ... // 检查值是否在集合内
二、面向对象编程(OOP)
1. 类定义与对象
- 类定义:
class Transaction; bit [31:0] addr; int data; function void display(); $display("Addr=0x%h, Data=%d", addr, data); endfunction endclass
- 对象操作:
Transaction tr = new(); // 实例化 tr.addr = 32'h1000; // 成员赋值 tr.display(); // 方法调用
2. 继承与多态
- 派生类:
class ErrorTransaction extends Transaction; bit error; function void display(); super.display(); // 调用基类方法 $display("Error=%b", error); endfunction endclass
3. 随机化与约束
- 随机变量:
class Packet; rand bit [3:0] len; // 随机变量 randc bit [2:0] id; // 循环随机 constraint valid { len > 0; len < 10; } // 约束块 endclass
三、接口(Interface)
1. 接口定义
- 封装信号组:
interface bus_if (input logic clk); logic [31:0] addr; logic [63:0] data; logic valid; endinterface
2. 接口使用
- 模块绑定:
module dut (bus_if bus); always @(posedge bus.clk) begin if (bus.valid) ... end endmodule
四、流程控制
1. 增强的循环
foreach
遍历数组:int arr[4] = '{1, 2, 3, 4}; foreach (arr[i]) $display("arr[%0d] = %0d", i, arr[i]);
2. 分支控制
unique
和priority
:unique if (a > b) ... // 确保条件唯一 priority case (sel) ... // 指定优先级
五、并发与线程
1. 线程控制
fork...join
分支:fork task1(); // 并行执行 task2(); join
2. 事件同步
- 事件触发与等待:
event data_ready; -> data_ready; // 触发事件 @data_ready; // 等待事件
六、断言(SVA)
1. 立即断言
- 组合逻辑检查:
assert (a != b) else $error("a equals b!");
2. 并发断言
- 时序逻辑检查:
property p_valid; @(posedge clk) req |-> ##[1:3] ack; endproperty assert property (p_valid);
七、功能覆盖率
1. 覆盖组定义
- 覆盖点与交叉覆盖:
covergroup cg @(posedge clk); coverpoint addr { bins low = {[0:100]}; bins mid = {[101:200]}; } cross addr, data; // 交叉覆盖 endgroup
2. 覆盖率采样
- 手动触发采样:
cg cg_inst = new(); cg_inst.sample(); // 在事务完成时调用
八、其他关键语法
1. 包(Package)
- 封装可重用代码:
package my_pkg; typedef enum {READ, WRITE} cmd_t; endpackage module top; import my_pkg::*; // 导入包 cmd_t command = READ; endmodule
2. 增强的数组操作
- 动态数组:
int dyn_arr[] = new[10]; // 动态分配大小
- 关联数组:
int assoc_arr[string]; // 键值对存储 assoc_arr["addr"] = 100;
总结
SystemVerilog 的语法扩展显著提升了硬件建模和验证效率,以下是其核心优势速查表:
语法特性 | 用途 | 示例场景 |
---|---|---|
四态逻辑 | 精确描述硬件行为 | RTL 设计 |
OOP 支持 | 构建可复用验证组件 | UVM 测试平台 |
接口(Interface) | 简化模块间连接 | 总线协议封装 |
约束随机化 | 自动生成多样化测试场景 | 功能覆盖率驱动验证(CDV) |
断言(SVA) | 实时检查时序逻辑正确性 | 协议验证 |
掌握这些语法要点,可高效实现复杂数字系统设计和验证。