SystemVerilog学习 (7)——面向对象编程

一、概述

        对结构化编程语言,例如Verilog和C语言来讲,它们的数据结构和使用这些数据结构的代码之间存在很大的沟壑。数据声明、数据类型与操作这些数据的算法经常放在不同的文件里,因此造成了对程序理解的困难。

        Verilog程序员的境遇比C程序员更加棘手,因为 Verilog 语言中没有结构(structures),只有位向量和数组。如果你想要存储一个总线事务(bus transaction)的信息,你就需要多个数组:一个用于保存地址,一个用于保存数据、一个用于保存指令等等。事务(transaction)N的信息分布在这些所有的数组中。用来创建、发送和接收事务的代码位于模块( module)中,但这个模块可能连接到总线上,也可能根本没有连接到总线上。最糟糕的是,这些数组都是静态的,所以如果测试平台( testbench)只配置了100个数组项,而当前测试需要101个时,就需要修改源代码来改变数组的大小,并且重新编译。结果,数组的大小被配置成可以容纳最大数目的事务,但是在一个普通的测试中,大多数的存储空间却浪费了。

        面向对象编程(OOP)使用户能够创建复杂的数据类型,并且将它们跟使用这些数据类型的程序紧密地结合在一起。用户可以在更加抽象的层次建立测试平台和系统级模型,通过调用函数来执行一个动作而不是改变信号的电平。当使用事务来代替信号翻转的时候,你就会变得更加高效。这样做的附加好处是,测试平台跟设计细节分开了,它们变得更加可靠,更加易于维护,在将来的项日中可以重复使用。

        将数据和代码结合到一起有助于帮助我们编写和维护大型的测试平台,如何把数据和代码组合到一起?我们首先来想象一下测试平台是如何工作的。

        测试平台的目标是给一个设计施加激励,然后检查其结果是否正确。如果把流入和流出设计的数据组合到一个事务里,那么围绕事务以及其他操作实施测试平台就是最好的办法,在OOP中,事务就是测试平台的焦点。

        传统的测试平台强调的是要做的操作:创建一个事务,发送,接收,检查结果,然后产生报告。而在OOP中,我们需要重新考虑测试平台的结构,以及每部分的功能。发生器(generator)创建事务并且将它们传递给下一级,驱动器(driver)和设计进行会话,设计返回的事务将被监视器(monitor)捕获,记分板(scoreboard)会将捕获的结果跟预期的结果进行对比。因此,测试平台应该分成若干个块(block),然后定义它们相互之间如何通信。

二、类的封装

1、类的概述

        类是一种包含了数据和方法(function、task)的类型。 例如一个数据包,可能被定义为一个类,类中可以包含指令、地址、队列ID、时间戳和数据等成员。

         面向对象编程(OOP,Object-Oriented Programming)使用户能够创建复杂的数据类型,并且将它们跟使用这些数据类型的程序紧密地结合在一起。 用户可以在更加抽象的层次建立测试平台和系统级模型,通过调用函数来执行一个动作而不是简单地改变信号的电平。在验证环境中,包括stimulator、monitor、checker以及其它验证组件接下来都将按照OOP的方式来构建。

2、在哪里定义类

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

        当你创建一个项目的时候,可能需要将每个类保存在独立的文件中。当文件的数目变得太大的时候,可以使用SystemVerilog的包( package)将一组相关的类和类型定义捆绑在一起。例如,可以将所有的 SCSI/ATA事务组合到一个包中。这个包与系统的其他部分独立,可以单独地编译。其他不相关的类,例如事务、记分板或者不同协议( protocol)的类应该放在不同的文件中。

3、OOP 术语        

        作为一个OOP小白,还是很有必要了解以下OOP的一些术语和概念的。为了方便理解,这里把OOP的术语与我们熟悉的verilog进行了一个对应。

  • 类(class):包含变量和子程序的基本构建块。在Verilog中,与之对应的是模块(module)。
  • 对象(object):类的一个实例。在Verilog中,与之对应的是实例化一个模块。
  • 句柄(handle):指向对象的指针。在Verilog中,我们需要通过实例名在模块外部引用信号和方法。一个OOP句柄就像一个对象的地址,但是它保持在一个只能指向单一数据类型的指针中。
  • 属性(property):存储数据的变量。在Verilog中,就是寄存器(reg)或者线网(wire)类型的信号。
  • 方法(method):任务或者函数中操作变量的程序性代码。Verilog模块除了initial和always块以外,还含有任务和函数。
  • 原型(prototype):程序的头,包括程序名、返回类型和参数列表、程序体现包含了执行代码。

        下面是一个对这些OOP术语的比喻。将类视为一个房子的蓝图( blueprint),该设计图描述了房子的结构,但是你不能住在一个蓝图里,你需要建造一幢实际的房子。一个对象就是一个实际的房子。如同一组蓝图可以用来建造每个房子的各个部分,一个类也可以创建很多的对象。房子的地址就像一个句柄,它唯一地标志了你的房子。在你的房子里面,你有很多东西﹐例如带有开关的灯(开或者关)。类中的变量用来保存数值,而子程序用来控制这些数值。一个房子类可能具有很多盏灯﹐对turn_on_porch_light ()的一个简单调用就可以将一个房子的走廊灯变量值置为(N

4、创建新对象

         Verilog 和 OOP 都具有例化的概念,但是在细节方面却存在着一些区别。一个Verilog模块,例如一个计数器,是在代码被编译的时候例化的。而一个SystemVerilog类,例如一个网络数据包,却是在运行中测试平台需要的时候才被创建。Verilog的例化是静态的,就像硬件一样在仿真的时候不会变化,只有信号值在改变。而SystemVerilog 中,激励对象不断地被创建并且用来驱动DUT,检查结果。最后这些对象所占用的内存可以被释放,以供新的对象使用。

        OOP 和 Verilog 之间的相似性也有一些例外。Verilog 的顶层模块是不会被显式地例化的。但是SystemVerilog类在使用前必须先例化。另外,Verilog 的实例名只可以指向一个实例,而 SV 句柄可以指向很多对象,当然一次只能指向一个。 如果多个对象为了共享一个成员(变量/方法),那么可以为其添加关键字static。

        同时,SV并不像C++语言一样要求复杂的存储空间开辟和销毁的手段,而是采用了像Java一样空间自动开辟和回收的手段。 因此SV的类在定义时,只需要定义构建函数(constructor),而不需要定义析构函数(destructor)。类在定义时,需要定义构建函数,如果未定义,则系统会自动帮 助定义一个空的构建函数(没有形式参数,函数体亦为空)。

三、类的继承

         之前定义过的类Packet,可以进一步扩展构成一个新的类LinkedPacket。 通过extends,LinkedPacket继承于其父类Packet,包括继承其所有的成员(变量/方法)。

        如果子类中声明了与父类同名的成员(变量/方法),那么子类中对其同名成员的访问都将指向子类,而父类的成员将被隐藏。

         super是用来访问当前对象其父类的成员。 尤其当子类的成员如果与父类的成员同名,那么需要使用super来指定访问其父类成员,而非默认的子类成员。

四、总结

        使用面向对象编程是一个很大的跨越,尤其当Verilog是我们的第一种计算机语言时。使用OOP的成果是我们的测试平台将变得更加的模块化,这样就更加容易开发,调试和重用。

        要有耐心——我们的第一个OOP测试平台可能看起来很像是增加了几个类的Verilog。但是一旦掌握了这种思维方式,我们就能开始为测试平台中的事务和操作这些类的事务处理器创建和操作类了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/154962.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue h5页面手指滑动图片

场景: 四张图,要求随着手指滑动而滑动 代码: imgs是父盒子 poster-item是每个图片 .imgs {white-space: nowrap;overflow: hidden;overflow-x: auto;margin-bottom: 17px;.poster-item {display: inline-block;vertical-align: middle;wid…

渗透测试——2

zoomeye是一个非常厉害的搜索引擎。

MySQL存储架构

连接管理与安全性 每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个线程中执行。MySQL5.5以后支持了一个API叫线程池插件,可以用少量线程服务大量连接,因此不用每次都新建连接然后销毁。 客户端连接MySQL服务器时候&…

Excel vlookup 如何使用

Excel vlookup 如何使用 打开WX, 搜索 “程序员奇点” Excel vlookup可以说是利器,非常好用的工具,用来查询 Excel 或者进行数据匹配,十分方便。 VLookuP 如何使用,不常用的同学经常容易忘记,这次做个记录&#xff…

网络安全(大厂面试真题集)

前言 随着国家政策的扶持,网络安全行业也越来越为大众所熟知,想要进入到网络安全行业的人也越来越多。 为了拿到心仪的 Offer 之外,除了学好网络安全知识以外,还要应对好企业的面试。 作为一个安全老鸟,工作这么多年…

使用UART烧录N76E003AT20核心板

目录 模块简介烧录方式利用ISP对N76E003AT20核心板进行烧录ICP烧录BootloaderISP烧录程序(UART)测试现象 总结 模块简介 N76E003为带有flash的增强型8位8051内核微控制器(1T工作模式),指令集与标准的80C51完全兼容并具…

【数据结构】快速排序算法你会写几种?

👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和算法 ✈️专栏:数据结构 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵 希望大佬指点一二 如果文章对你有帮助…

论文技巧2

目录 1 找基准模型2 找模块小论文的三个实验怎么做对比试验Sota的挑选对⽐论⽂结果的获取3 消融实验什么是消融实验怎么做消融实验4 实例分析怎么做实例分析小论文必备三张图1 找基准模型 2 找模块 小论文的三个实验 怎么做对比试验

调整Windows键盘上只能看到拼音而无法看到实际的文本以及关闭输入法悬浮窗方法

一、输入法设置 如果您在键盘上只能看到拼音而无法看到实际的文本,这可能是因为您的输入法设置为中文拼音输入法或其他仅显示拼音的输入法。 要解决这个问题,您可以尝试以下方法: 1. 切换输入法:按下 Shift Alt 组合键或 Wind…

μC/OS-II---消息队列管理1(os_q.c)

目录 消息队列的主要优点消息队列和消息邮箱消息队列相关操作消息队列创建消息队列删除在消息队列等待消息 消息队列的主要优点 消息队列的主要优点是解耦和异步通信。发送者和接收者之间不需要直接建立连接,它们只需要知道消息队列的名称或标识符即可。发送者将消…

分布式教程从0到1【1】分布式基础

1 分布式基础概念 1.1 微服务 微服务架构风格,就像是把一个单独的应用程序开发为一套小服务,每个小服务运行在自己的进程中,并使用轻量级机制通信,通常是 HTTP API。这些服务围绕业务能力来构建,并通过完全自动化部署…

全链路压测:确保系统稳定性的关键一环

在当今高度数字化的业务环境中,系统的稳定性和性能至关重要。全链路压测作为确保系统在各种负载下依然可靠运行的关键工具,越来越受到企业的关注。本文将深入探讨全链路压测的概念及目的。 一、全链路压测概念 全链路压测是一种模拟真实用户行为、模拟全…

Python与ArcGIS系列(八)通过python执行地理处理工具

目录 0 简述1 脚本执行地理处理工具2 在地理处理工具间建立联系0 简述 arcgis包含数百种可以通过python脚本执行的地理处理工具,这样就通过python可以处理复杂的工作和批处理。本篇将介绍如何利用arcpy实现执行地理处理工具以及在地理处理工具间建立联系。 1 脚本执行地理处理…

ai剪辑矩阵系统源码+无人直播系统源码技术开发

开发AI剪辑矩阵系统和无人直播系统源码,需要以下步骤: 1. 市场调研:了解市场需求和竞品情况,明确系统的功能和特点。 2. 系统设计:设计系统的整体架构和功能模块,包括视频剪辑、直播推流、实时互动、数据分…

亚马逊EC2服务器搭建Linux系统宝塔环境

目录 📝摘要 💡引言 一. 购买亚马逊服务器EC2 二. 安装Linux系统 三. 在终端安装宝塔 3.1 安装宝塔 3.2安装成功 四. 配置宝塔 五 应用场景 六 代码案例演示 七 为什么选择亚马逊EC2服务器部署? 💪 可靠性和高可用性 灵…

Django部署时静态文件配置的坑

Django部署时静态文件配置配置的坑 近期有个需求是用django进行开发部署,结果发现静态文件配置的坑是真的多,另外网上很多的内容也讲不清楚原理,就是这样这样,又那样那样,进了不少坑,这里记录一下关于css,…

软件工程理论与实践 (吕云翔) 第六章 面向对象分析课后习题及其解析

第六章 面向对象分析 知识点: 一个典型的软件系统通常包括的内容为:它使用数据结构(对象模型),执行操作(动态模型),并且完成数据值的变化(功能模型)。 3种模型之间的关…

python科研绘图:面积图

目录 1、面积图 2、堆积面积图 1、面积图 面积图是一种数据可视化图表,用于展示数据随时间或其他有序类别的变化趋势。它与折线图相似,但在展示数据变化的同时,面积图还强调了各个数据点之间的累积关系。这种图表通常通过在折线下方填充颜…

二叉树(进阶)

文章目录 1.内容安排说明2. 二叉搜索树2.1二叉搜索树的概念2.2二叉搜索树的实现2.3二叉树的性能: 搜索二叉树的应用k 模型kv模型 1.内容安排说明 二叉树在前面c数据结构阶段;已经讲过了;本节取名二叉树进阶的原因是: 1.map和set特…

04-学成在线之系统管理服务模块之查询数据字典表中的内容,前后端联调测试

前后端联调 配置前端环境 实际开发中先由后端工程师将接口设计好并编写接口文档并交给前端工程师,前后端的工程师就开始并行开发 前端开发人员先自己mock数据即使用假数据进行开发,当后端代码完成后前端工程师尝试请求后端接口获取数据然后渲染到页面 第一步: 首…