SystemVerilog 验证-测试平台编写指南学习笔记(4):SystemVerlog 面向对象编程OOP

1 为什么 SystemVerilog 需要面向对象编程?

Verilog 语言没有结构(struct),只有位和数组,而且数组是静态的,需要修改数组大小需要修改源代码并重新编译。
面向对象(OOP)编程:

  • 能够创建复杂的数据类型,并将它们和程序紧密结合。
  • 能够在更高层次建立测试平台和系统级建模,更加高效。
  • 测试平台与设计细节分开,更加可靠易于维护,可重用。

传统的测试平台强调要做的操作,类似C语言,执行一个操作流,比如创建事务、发送、接收、检查结果、产生报告。
OOP中,考虑测试平台的结构和功能,每一个部分作为一类,或者说若干块(block)。如发生器(generator)、驱动器(driver)、监视器(monitor)、记分板(scoreboard)。他们各自实现自己的功能,即OOP中的方法。

2 OOP术语以及与 Verilog-2001 大致对应关系?

  1. 类(class):包含变量和子程序的基本构建块。Verilog 对应模块。
  2. 对象(object):类的一个实例。Verilog 中模块的实例。
  3. 句柄(handle):指向对象的指针。Verilog 中实例名引用信号与方法。
  4. 属性(property):存储数据的变量。Verilog 寄存器 或 线网。
  5. 方法(method):任务或函数中操作变量的程序性代码。Verilog 除 initial 和 always 块之外,还有task 和 function。
  6. 原型(prototype):程序的头包含程序名、返回类型和参数列表。程序体则包含执行代码。

3 SystemVerilog OOP 中的类 class

3.1 怎么定义类?

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

class Transaction;
    bit [31:0] addr,crc,data[8]; // 数据 
    function void display;  // 操作数据的子程序:输出数据包地址  
        $display ("Transaction:th",addr);
    endfunction : display
    function void calc_crc; // 操作数据的子程序:计算循环冗余校验码(CRC:cyclic redundancy check) 
        crc=addr ^ data .xor;
    endfunction:calc_crc
endclass: Transaction  // 类的标记label : Transaction

3.2 在哪里定义类?

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

3.3 怎么创建对象?

Verilog 与 OOP 例化的区别:Verilog 模块在代码被编译时例化,而一个 SystemVerilog 类在运行测试平台需要的时候才被创建。

Transaction tr; // 声明一个句柄
tr = new(); // 为一个Transaction对象tr分配空间  

注意new()创建一个对象,而new[]建立一个含有多个元素的数组。

构造函数除了分配内存外,还初始化变量。默认情况下,二值变量初始化为0,四值变量初始化为X。
所以可以在类的定义中重写构造函数来自定义初始化。

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

4 怎么使用类建立一个测试平台?

在这里插入图片描述

图中的 Generator、Agent、Driver、Monitor、Checker、Scoreboard 都是类。被建模成事务处理器(transactor)。在Environment类内部例化。
Tset在最高层,即处在例化Environment类的程序中。
功能覆盖(Functional Covarage)的定义可以在Environment类的内部或外部。

4.1 事务处理器的结构?

事务处理器由一个简单的循环构成,这个循环从前面的块接收事务对象,经过变换后送给后续块。
有一些块,如generator,没有上游块,改事务处理器就创建和随机复制每一个事务。
其他对象,如Driver接收到一个书屋然后将其作为信号发送到DUT。

基本的事务类:

class Transactor; //  通用类  
    Transaction tr;

    task run;
        forever begin
        // 从上游模块获取事务
        ...
        // 做一些处理 
        ...
        // 发送到下游模块
        ...

        end 
    endtask
endclass 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lu-ming.xyz

觉得有用的话点个赞吧 :)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值