Systemverilog类

1 什么是类(Class)

类封装了数据和操作这些数据的子程序。

2 在哪里定义类

在SystemVerilog中,可以把类定义在program、module、package中,或者在这些块之外的任何地方。类可以在程序和模块中使用。

3 OOP术语

  • 类(Class):包含变量和子程序的基本构件块。
  • 对象(Object):类的一个实例。
  • 句柄(Handle):指向对象的指针。
  • 属性(Property)
  • 方法(Method)
  • 原型(Prototype):程序的头,包括程序名、返回类型和参数列表。程序体包含了执行代码。

创建新对象——构造函数

对象的创建过程:

Transaction tr;   //声明一个句柄。在声明一个句柄时,它被初始化为特殊值null

Tr=new();         //new函数为Transaction分配空间,将变量初始化为默认值
                  //(二值变量为0,四值变量为X),并返回保存对象的地址。

定制构造函数(Constructor)

new函数也成为构造函数,因为它创建对象。构造函数除了分配内存外,它还初始化变量。可以通过自定义new函数修改变量的默认数值。但是new函数不能有返回值,因为构造函数总是返回一个指向对象的句柄,其类型就是类本身。

//简单用户定义的new()函数
class Transaction;
    logic[31:0] addr,crc,data[8];

    function new;
        addr=3;
        foreach(data[i]) 
            data[i]=5;
    endfunction
endclass
//addr和crc被设为固定数值,但crc仍然被初始化为默认值X

另外,可以使用具有默认值的函数参数来创建更加灵活的构造函数:

//一个带有参数的new()函数
class Transaction;
    logic[31:0]addr,crc,data[8];

    function new(logic[31:0] a=3,d=5);
        addr = a;
        foreach(data[i])
            data[i]=d;
    endfunction
endclass

initial begin
    Transaction tr;
    tr=new(10);     //data使用默认值5
end

每一个类都有自己的new函数,在调用new函数时,SystemVerilog通过赋值操作符左边的句柄类型来决定使用哪个new函数:

class Transaction;
    ...
endclass:Transaction

class Driver;
    Transaction tr;
    function new();   //Driver的new函数
        tr=new();     //调用Transaction的new函数
    endfunction;
endclass:Driver

注意:应该避免在声明一个句柄的时候调用构造函数,即new函数。这样构造函数在第一条声明语句前就被调用了,初始化的顺序便不能被控制了。

静态变量和全局变量

每个对象都有自己的局部变量,这些变量不和任何其他对象共享。但有时候你需要一个某种类型的变量,被所有对象所共享,此时就需要静态变量(如果没有OOP,可能需要创建一个全局变量)。

当你打算创建一个全局变量的时候,首先应该考虑创建一个类的静态变量。一个类应该是自给自足的,对外部的引用越少越好。

静态变量:在SystemVerilog中,可以在类中创建一个静态变量。该变量将被这个类的所有实例所共享,并且它的使用范围仅限于这个类。

//以下是一个含有静态变量的类
class Transcation;
    static int count=0; // 使用static关键字声明一个int类型的静态变量
    int id;
    funtion new();
        id=count++;
    endfunction
endclass

Transaction t1,t2;
initial begin
    t1=new();
    t2=new();
    $display("Second id=%d,count=%d",t2.id,t2.count);
end

静态变量可以累积,动态变量离开函数后自动清空。

访问静态变量有以下两种方法

// 方法1:使用句柄访问静态变量
tr.StaticVariable
// 方法2:使用 类名+作用域符“:”
Transcation::StaticVariable 

静态变量的初始化

静态变量通常在声明时初始化。不能简单地在类的构造函数中初始化静态变量,因为每一个新的对象都会调用构造函数。

静态方法

在SystemVerilog中,可以在类中创建一个静态方法用于读写静态变量,甚至可以在第一个实例产生之前读写静态变量。SystemVerilog不允许静态方法读写非静态变量,例如id。                  

class Transaction;
    static Config cfg;
    static int count=0;
    int id;

    //显示静态变量的静态方法
    static function void display_statics();
        $display("Transcation cfg.mode=%s,count=%0d",cfg.mode.name(),count);
    endfunction
endclass

Config cfg;

initial begin
    cfg=new(MODE_ON);
    Transaction::cfg=cfg;
    Transaction::display_statics(); //调用静态方法
end

类的成员

一个类的功能应该尽可能简单,不应该承担过多的责任,也不应该承担不符合它的职责。类作为载体,不会将成员变量直接暴露给外部,通过public,protected,local关键词来设置成员变量方法的外部权限访问。

  1. 在SystemVerilog中,所有成员都是公有的,除非标记为local或者protected。你应该尽量使用默认值,以保证对DUT行为的最大程度控制,这比软件的长期稳定性更加重要。
  2. Public:(SystemVerilog默认类型)子类和外部类型均可以访问成员。
  3. Protected:只有子类可以访问成员,外部访问是非法的。
  4. Local:只有该类可以访问,子类和外部都不能。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
SystemVerilog的听课学习笔记,包括讲义截取、知识点记录、注意事项等细节的标注。 目录如下: 第一章 SV环境构建常识 1 1.1 数据型 1 四、二值逻辑 4 定宽数组 9 foreach 13 动态数组 16 队列 19 关联数组 21 枚举型 23 字符串 25 1.2 过程块和方法 27 initial和always 30 function逻辑电路 33 task时序电路 35 动态 静态变量 39 1.3 设计例化和连接 45 第二章 验证的方法 393 动态仿真 395 静态检查 397 虚拟模型 403 硬件加速 405 效能验证 408 性能验证 410 第三章 SV组件实现 99 3.1 接口 100 什么是interface 101 接口的优势 108 3.2 采样和数据驱动 112 竞争问题 113 接口的时序块clocking 123 利于clocking的驱动 133 3.3 测试的开始和结束 136 仿真开始 139 program隐式结束 143 program显式结束 145 软件域program 147 3.4 调试方法 150 第四章 验证的计划 166 4.1 计划概述 166 4.2 计划的内容 173 4.3 计划的实现 185 4.4 计划的进程评估 194 第五章 验证的管理 277 6.1 验证的周期检查 277 6.2 管理三要素 291 6.3 验证的收敛 303 6.4 问题追踪 314 6.5 团队建设 321 6.6 验证的专业化 330 第六章 验证平台的结构 48 2.1 测试平台 49 2.2 硬件设计描述 55 MCDF接口描述 58 MCDF接口时序 62 MCDF寄存器描述 65 2.3 激励发生器 67 channel initiator 72 register initiator 73 2.4 监测器 74 2.5 比较器 81 2.6 验证结构 95 第七章 激励发生封装: 209 5.1 概述 209 5.2 的成员 233 5.3 的继承 245 三种型权限 protected/local/public 247 this super 253 成员覆盖 257 5.4 句柄的使用 263 5.5 包的使用 269 第八章 激励发生的随机化 340 7.1 随机约束和分布 340 权重分布 353 条件约束 355 7.2 约束块控制 358 7.3 随机函数 366 7.4 数组约束 373 7.5 随机控制 388 第九章 线程与通信 432 9.1 线程的使用 432 9.2 线程的控制 441 三个fork...join 443 等待衍生线程 451 停止线程disable 451 9.3 线程的通信 458 第十章 进程评估:覆盖率 495 10.1 覆盖率型 495 10.2 功能覆盖策略 510 10.3 覆盖组 516 10.4 数据采样 524 10.5 覆盖选项 544 10.6 数据分析 550 第十一章 SV语言核心进阶 552 11.1 型转换 552 11.2 虚方法 564 11.3 对象拷贝 575 11.4 回调函数 584 11.5 参数化的 590 第十二章 UVM简介 392 8.2 UVM简介 414 8.3 UVM组件 420 8.4 UVM环境 425

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值