您当前的位置: 首页 > 

lu-ming.xyz

暂无认证

  • 0浏览

    0关注

    115博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

lu-ming.xyz 发布时间:2022-04-22 08:46:44 ,浏览量:0

文章目录
  • 1 为什么 SystemVerilog 需要面向对象编程?
    • 2 OOP术语以及与 Verilog-2001 大致对应关系?
  • 3 SystemVerilog OOP 中的类 class
    • 3.1 怎么定义类?
    • 3.2 在哪里定义类?
    • 3.3 怎么创建对象?
  • 4 怎么使用类建立一个测试平台?
    • 4.1 事务处理器的结构?

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 
关注
打赏
1655639048
查看更多评论
立即登录/注册

微信扫码登录

0.1233s