赞
踩
一般来说,在数字IC验证中,编写testbench文件会采用verilog,但随着设计越来越复杂,为了更方便例化模块,面向对象编程的SystemVerilog(以下简称SV)越来越流行。
下文部分图片和观点摘自《芯片验证漫游指南》刘斌著
见链接:https://blog.csdn.net/qq_39815222/article/details/106538103
有关面向对象编程的基础概念参考 C/C++——基础语法学习 篇第4大节。
链接:https://blog.csdn.net/qq_39815222/article/details/80529000
为提高调用效率,免于模块重用,面对对象编程可创建复杂的数据类型并把他们封装在一起使其共同工作。
与C++中不同的是,在SV中,若对象没有指针指向它,它会自动释放掉其物理空间
在新旧项目版本交替过程中,利用继承可在就testbench文件基础上添加新功能。
类内部声明和定义必须是task或function,不得使用过程块always或initial
new函数不会显示地返回数值,因为系统会固定例化的对象句柄本身;此外new函数是function,不能包含延时语句,即立即执行返回。
在继承时,子类在定义new函数时,首先调用父类的new函数即super.new()。如果父类的new函数没有参数,子类也可以省略该调用,而系统会在编译是自动添加super.new()。
当使用一个变量名的时候,systemverilog将先在当前作用域内寻找,接着在上一级作用域内寻找,直到找到该变量为止。
在类定义中不能声明interface,而应使用virtual interface。
通常constraint约束块会和rand一同声明在类中
class class1; //声明
bit [31:0] A; //properties
function void f1(); //methods
endfunction: f1
endclass: example
class class2 extends class1; //继承
function void f1();
super.f1(); //调用父类的成员并改写
endfunction
endclass
class1 example1; //调用
example1 = new(); //构造函数:分配空间,初始化类里面的变量,返回该空间的地址给example1
example2 = example1; //把example1的地址空间给example2
example1.A = 32'h48; //赋值
example1.f1();
使用一个关键词表明一个意图,通过 property 表现出来,通常验证时会根据spec文档,验证信号间的时序情况,若不符合spec,则需要debug
参考链接:https://blog.csdn.net/moon9999/article/details/106035582
//模块化编码
property getSignal;
@(posedge clk) not( countValue < 9 );
endproperty: getSignal
agetSignal: assert property( getSignal ) statement1; //若满足assertion执行statement1,否则执行statement2
else statement2;
//非模块化编码
P1: assert property( @(posedge clk) $rose sys_set |-> ##[0:6] $rose rec_readyH); //判断在sys_set上升沿开始后,持续6个时钟上升沿,后拉高rec_readyH
检测验证目标完成的百分比,
covergroup可以包含多个覆盖采样点,EDA会产生bin来保存采样数据,并通过分析工具来统计
class1 tr;
covergroup conPort; //声明功能覆盖率
coverpioint tr.port; //定义采样点,计算覆盖率
endgroup
conPort ck = new; //实例化
initial begin
repeat(100) begin
tr.randmize;
ck.sample(); //采样,收集覆盖率
@(clk);
end
end
充分理解SV的不同结构体在仿真中执行的先后顺序,有利于理解testbench中对DUT的驱动和采样的顺序,进而避免不合理的驱动和采样方式。
时间片(time-slot)是仿真时间中的一个抽象单位Ts,该单位内所有的线程(always,initial,assertion等)和数据对象的赋值被赋予相应的优先级,依次被执行。这种优先级即如下图所示的调度区域。observerd和reactive专门用于SV验证,其余区域均继承于verilog调度区域。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。