SystemVerilog语法基础

0.前言

相较于verilog,system verilog在验证方面应用更广泛,当下最常用的uvm就是基于sv实现的。sv在verilog的基础上借鉴了一些高级语言的语法,它拥有以下功能:
.设计+验证
.产生随机约束
.功能覆盖率统计分析
.断言(SVA)
.面向对象的验证
这一篇学习笔记用于记录常用的变量类型、过程语句,以便于后续再深入补充。

1.数据类型

(1)两态数据类型:0、1;
sv的数据类型在verilog的基础上,借鉴了C/C++的语法

变量类型位宽符号位状态数备注
reg自定义4线网型,四态为:0,1,X,Z
wire自定义4寄存器型, 四态为:0,1,X,Z
logic自定义4可以代替reg和wire型
int32位两态两态为:0,1
shortint16位两态
longint64位两态
unsigned int32位两态
byte8位两态
bit1位两态

注:X为不确定态;Z为高阻态

(2)枚举类型

enum{red=2'b0,yellow,green}RGB;
//表示00为red,01为yellow,10为grenn
//当缺省时起点时,默认从0开始

(3)用户自定义类型

typedef unsigned int uint;
uint a,b;

(4)压缩数组

(5)动态数组

dyn[];//可以不声明数组大小
dyn=new[5];//使用new函数声明大小
dyn.delete();//使用完回收空间

(6)关联数组
分布式存储,类似于哈希数组

//前面表示内容的地址,后面表示索引。
//都要声明类型,索引也可以使用string,如assoc["小明"]
bit[63:0]	assoc[bit[63:0]];

//foreach遍历数组
foreach(assoc[i])
{$display("assoc[%h]=%h",i,assoc[i])}

//函数索引遍历
if(assoc.first[idx])begin
	do{
	     $display("assoc[%h]=%h",i,assoc[i])
	}
	while(assoc.next(idx));
end

//操作:找到并删除第一个元素
assoc.first(idx);
assoc.delete(idx);

(7)队列

q[$]={1,2,3,4};//初始化队列,中括号内加$

q.insert(1,j)={};//在第i个数据之后插入j
q.delete(i);//删除数据i,不是第i个;缺省i则删除所有数据

q.push_front(i);
q.push_back(i);//把数据i向前/向后压入

q.pop_front();
q.pop_back();//把最前/最后一个数据弹出

¥size(q);//查询队列q的长度

(8)面向对象
sv中借鉴C++的语法,tb基于类实现,是dut和验证平台的交互。
class->object 从类到某一对象,需要句柄(即地址)
一个类包含属性和方法,例如

class Bus;
	bit [31:0] addr,crc,data[8];//属性
  
	function calc_crc;//方法
 		crc=addr^data.xor;
 	endfunction:calc_crc

	function:display;//方法
		$display("Bus trans:%h",addr);
 	endfunction:display

endclass:Bus

(9)信箱
类似于FIFO
(10)旗语
对同一资源的访问控制,相当于仲裁机制

semaphore sem;
sem=new(1);//声明钥匙数量
sem.get(1);//获取钥匙
sem.put(1);//释放要是

2.过程语句

(1)赋值语句
阻塞/非阻塞赋值;
自加/自减赋值;

(2)并行进程语句
fork…join:阻塞,等待全部进程执行完
fork…join_any:阻塞,等待最快的进程执行完
fork…join_none:不阻塞,与下一块同时执行

(3)条件选择语句
if/case
(4)循环语句
for/while/repeat/forever/do…while/foreach
(5)跳转语句
break;continue;return(表达式/0)

(6)事件控制
function:有返回值,不能使用#延迟,不可嵌套task
task:无返回值,可以使用#延迟,内部可以嵌套function

(7)随机产生机制

.内置系统函数

a=$random();//返回32位有符号
a=$urandom();//32位无符号
a=$urandom_range(0,10);//32位无符号,范围0-10

.randcase/randsequence

randcase
 1:x=1;
 2:x=5;
 3:x=10;
endcase
//带权重,表示出现的概率分别为1/6,2/6,3/6

.基于对象的随机生成

class rand_num;
rand int size;
constraint c_size{
	size inside{[1:100];}
} 
endclass:rand_num

rand_num randnum_inst;
randnum_inst=new();
randnum_inst.randomoze();

.标准随机函数

std::randomize()

(8)断言
SVA,system verilog assertion,是描述设计期望行为的代码
例如:

assert property@(posedge clk)
	$rose sys_reset |->
	(##[0:6]$rose ready);

断言基础可以参考
https://blog.csdn.net/qq_39556143/article/details/94590198

3.模块连接

TB和DUT的连接:interface类型

//声明一个interface
interface bus_if(input bit clk);
	logic[1:0]	a;
endinterface
//tb的输入参数是interface类型
module tb(bus_if busif);

//通过“.”连接符寻找变量
busif.a<=2'b01;
//top集成dut与tb
module top;
	dut ins(.a(busif.a));
	bus_if busif(clk);
	tb test(busif);
endmodule
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值