我的 System Verilog 学习记录(11)



 引言

本文简单介绍 SystemVerilog 的其他程序结构。

前文链接:

我的 System Verilog 学习记录(1)

我的 System Verilog 学习记录(2)

我的 System Verilog 学习记录(3)

我的 System Verilog 学习记录(4)

我的 System Verilog 学习记录(5)

我的 System Verilog 学习记录(6)

我的 System Verilog 学习记录(7)

我的 System Verilog 学习记录(8)

我的 System Verilog 学习记录(9)

我的 System Verilog 学习记录(10)



program 块

模块是用于构建设计的基本结构,每个模块可以包含其他模块、线网、变量和其他程序块的层次结构,以描述任何硬件功能。另一方面,testbench 是一个验证设计的完整环境,因此重点放在它的建模方式上,以使其更可重用和有效。必须正确地初始化和同步,避免设计和 testbench 之间的竞争条件。

program 块的需求是啥?

SV 的 program 块被引入的原因如下:

  • 为执行测试工作台提供一个入口点
  • 创建一个容器来保存所有其他的测试台数据,如任务、类对象和函数
  • 通过在仿真周期的反应区域内执行来避免设计中的竞争条件

反应区域是模拟时间提前之前的最后几个阶段之一,到那时,所有的设计元素语句都已经被执行,测试台将看到更新的值。在设计的执行和测试台语句之间有这种划分是很重要的,因为它将在模拟器之间提供更具确定性的输出。

语法

示例

 程序块可以嵌套在模块和接口中,因此同一模块中的多个程序可以共享该作用域的本地变量。在下面的示例中,模式是TB内的局部变量,可以由程序p1和p2访问。



动态的强制类型转换

当需要在两个不同的数据类型变量之间分配值时,普通分配可能无效,而应该使用一个名为$cast的系统任务。
$cast 可以用作任务或函数,区别是,当作为函数使用时,如果转换是合法的,它返回1。它在处理无效的赋值时变得很有用。

语法

在这里,targ_var是目标变量,而source_exp是应该计算并分配给目标变量的源表达式。

以 函数 / 任务 调用

当$cast作为任务调用时,它将尝试将源表达式分配给目标变量,如果它无效,将会发生运行时错误,而目标变量将保持不变。
当$cast作为函数调用时,它将尝试将源表达式分配给目标变量,如果成功则返回1。如果它失败并返回0,则不会进行分配。请注意,在这种情况下,将不会出现运行时错误,并且仿真将以目标变量的不变值继续进行。

示例

使用 $cast 

 不用 $cast

有一些仿真器会给出编译警告,有些则会报错。

强转无效数据

 枚举变量里面没有数值为 75 的元素,运行期间会报错。

以函数形式调用



package

package 提供了一种存储和共享数据、方法、属性、参数的机制,这些数据、方法、属性和参数可以在多个其他模块、接口或程序中重复使用。它们显式命名了与顶级模块位于同一级别的作用域。因此,所有参数和枚举都可以通过该作用域引用。将这样的定义和声明放在包中还可以避免使全局名称镜变得混乱。然后,可以将包导入到可以使用该包中的项的当前范围中。请注意,包中的项不能具有对标识符的分层引用,除非那些在包中创建的项或通过导入另一个包而可见的项。

示例

上面显示的包可以导入到其他模块和类范围中,以便可以重用其中定义的项。这可以使用关键字import ,然后使用范围解析操作符 :: ,然后指定要导入的内容。在下面的示例中,我们导入包中定义的所有内容,如下面的 * 运算符所示,以便能够使用任何项。

 请注意,必须导入程序包,编译器才能识别绿色的定义位置。如果没有导入程序包,则会出现如下所示的编译器错误。

如果您确切地知道代码中使用了什么,也可以单独导入它们,而不是导入包中的所有定义。但是,这被视为一种开销,特别是当从包访问更多成员时。

省略这三个导入语句中的任何一个都会导致编译器错误,因为它不知道它们是在哪里定义的,除非它是导入的。

namespace 冲突

考虑下面的示例,其中存在相同的定义,一个在顶层,另一个通过导入的包。

请注意,即使my_pkg是导入的,e_rd_wr变量OPC2的值Read也是1,这意味着不考虑包中的枚举值。

 为了让仿真器应用来自包的值,应该使用 :: 操作符显式地提到包名,如下所示。



命令行输入

有时,您需要避免重新编译testbench,而是能够像任何脚本语言(如bash或perl)一样接受来自命令行的值。在SystemVerilog中,此信息作为始终以字符开头的可选参数提供给仿真。这些从命令行传递的参数可在SV代码中通过以下称为plusargs的系统函数进行访问。

语法

$test$plusargs

函数 $test$plusargs 通常在不需要参数的值时使用。它在加号列表中搜索用户指定的字符串。变量也可以用来指定字符串,任何空字符都将被忽略。如果提供的加号之一的前缀与提供的字符串中的所有字符匹配,该函数将返回一个非零整数,否则返回零。

示例

当使用运行时参数+STANDBY编译和模拟上面显示的代码时,其中STANDBY是提供给模拟工具的字符串plusarg,我们会得到如下所示的输出。请注意,plusarg区分大小写,即使提供的字符串是“STANDBY”,它也匹配“S”和“STAND”。

$value$plusargs

$value$plusargs 系统函数也搜索plusargs列表,和$test$plusargs一样,但它有能力获取指定用户字符串的值。如果提供的一个plusarg的前缀与给定用户字符串中的所有字符匹配,该函数将返回一个非零值,并将结果值存储在提供的变量中。如果没有找到用户字符串,则该函数将返回一个非零值,并且该变量将不会被修改。
用户字符串应为“plusarg_string format_string”,其中格式字符串与$display 任务相同。这些格式标识符用于将通过命令行提供的值转换为给定的格式,并存储在一个变量中。

 示例:

对于不同的输入参数,我们将得到不同的输出。还要注意,用户字符串、= 和命令行表达式中的值之间不应该有任何空格。

具体示例:

SystemVerilog Command Line Arguments



文件操作

打开/关闭文件

可以使用$fopen()系统任务打开文件以进行读取或写入。此任务将返回一个称为文件描述符的32位整数句柄。此句柄应用于读取和写入该文件,直到它关闭。文件描述符可以使用$flose()系统任务关闭。一旦关闭,就不允许对文件描述符进行进一步的读取或写入。

示例

 如何在读取和追加模式下打开?

示例

如何对文件读写?

写文件时,文件的打开方式为 w (w+) 或者 a (a+) ;写入文字使用 $fdisplay() 或者 $fwrite() ;

读文件时,在 r 或者 r+ 模式下打开文件,$fgets() 每调用一次读取一行;

示例

怎么知道有没有读到文件尾?

使用 $feof(); 系统任务。如果读到文件尾,返回1;

示例

 如何解析行内数据?

使用 $fscanf() 系统任务。示例如下:



SV的域作用符

域作用操作符 :: 用于引用类的范围内的标识符。
作用域解析运算符 :: 的左侧应该是类类型名称、程序包名称、覆盖组类型名称、覆盖点或交叉名称、类型定义(typedef)名称。运算符的右侧应该是类似于变量或方法名称的标识符。

域作用符的意义何在?

类和其他作用域可以有相同的标识符的名称,可能创建一个名称空间冲突如果不指定范围。
范围解析操作符唯一地标识一个给定的类的一个成员或参数。
他们也用于访问静态变量和方法,参数和局部参数以外的类的类。它还允许访问公共基类的成员和保护成员在子类中。

示例

定义外部函数

访问静态方法/函数

使用package

避免命名空间冲突

 

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

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

相关文章

Linux lvm管理讲解及命令

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放&#xff0…

软件行业的最后十年【ChatGPT】

在这篇文章中,我将说明像 ChatGPT 这样的生成式人工智能 (GAI) 将如何在十年内取代软件工程师。 预测被离散化为 5 个阶段,总体轨迹趋向于完全接管。 但首先,一个简短的前言。 推荐:用 NSDT场景设计器 快速搭建3D场景。 1、关于AI…

二叉搜索树:AVL平衡

文章目录一、 二叉搜索树1.1 概念1.2 操作1.3 代码实现二、二叉搜索树的应用K模型和KV模型三、二叉搜索树的性能分析四、AVL树4.1 AVL树的概念4.2 AVL树的实现原理4.3 旋转4.4 AVL树最终代码一、 二叉搜索树 1.1 概念 二叉搜索树( Binary Search Tree,…

LeetCode刷题记录---数位DP算法

😄 学会数位dp算法,可以连杀好几道力扣困难题,加油~ 🚀题目: 难度题目困难2376. 统计特殊整数困难1012. 至少有 1 位重复的数字困难233. 数字 1 的个数困难面试题 17.06. 2出现的次数🚀学习资料: 数位dp算法,我是跟着灵神学的,感谢灵神!数位 dp 通用模板参考灵神…

Python数据分析案例24——基于深度学习的锂电池寿命预测

本期开始案例较为硬核起来了,适合理工科的硕士,人文社科的同学可以看前面的案例。 案例背景 这篇文章是去年就发了,刊物也印刷了,现在分享一部分代码作为案例给需要的同学。 原文链接(知网文章 C核)&…

python如何快速采集美~女视频?无反爬

人生苦短 我用python~ 这次康康能给大家整点好看的不~ 环境使用: Python 3.8 Pycharm mou歌浏览器 mou歌驱动 —> 驱动版本要和浏览器版本最相近 <大版本一样, 小版本最相近> 模块使用: requests >>> pip install requests selenium >>> pip …

不是,到底有多少种图片懒加载方式?

一、也是我最开始了解到的 js方法&#xff0c;利用滚动事件&#xff0c;判断当时的图片位置是否在可视框内&#xff0c;然后进行渲染。 弊端&#xff1a;代码冗杂&#xff0c;你还要去监听页面的滚动事件&#xff0c;这本身就是一个不建议监听的事件&#xff0c;即便是我们做了…

【selenium学习】数据驱动测试

数据驱动在 unittest 中&#xff0c;使用读取数据文件来实现参数化可以吗&#xff1f;当然可以。这里以读取 CSV文件为例。创建一个 baidu_data.csv 文件&#xff0c;如图所示&#xff1a;文件第一列为测试用例名称&#xff0c;第二例为搜索的关键字。接下来创建 test_baidu_da…

百度生成式AI产品文心一言邀你体验AI创作新奇迹:百度CEO李彦宏详细透露三大产业将会带来机遇(文末附文心一言个人用户体验测试邀请码获取方法,亲测有效)

百度生成式AI产品文心一言邀你体验AI创作新奇迹中国版ChatGPT上线发布强大中文理解能力超强的数理推算能力智能文学创作、商业文案创作图片、视频智能生成中国生成式AI三大产业机会新型云计算公司行业模型精调公司应用服务提供商总结获取文心一言邀请码方法中国版ChatGPT上线发…

贪心算法的原理以及应用

文章目录0、概念0.1.定义0.2.特征0.3.步骤0.4.适用1、与动态规划的联系1.1.区别1.2.联系2、例子3、总结4、引用0、概念 0.1.定义 贪心算法&#xff08;greedy algorithm &#xff0c;又称贪婪算法&#xff09;是指&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是…

Java怎么实现几十万条数据插入(30万条数据插入MySQL仅需13秒)

本文主要讲述通过MyBatis、JDBC等做大数据量数据插入的案例和结果。 30万条数据插入插入数据库验证实体类、mapper和配置文件定义User实体mapper接口mapper.xml文件jdbc.propertiessqlMapConfig.xml不分批次直接梭哈循环逐条插入MyBatis实现插入30万条数据JDBC实现插入30万条数…

第十九天 Maven总结

目录 Maven 1. 前言 2. 概述 2.1 介绍 2.2 安装 3. IDEA集成Maven 3.1 集成Maven环境 3.2 创建Maven项目 3.3 Maven坐标详解 3.4 导入maven项目 4. 依赖管理 4.1 依赖配置 4.2 依赖传递 4.3 依赖范围 4.4 生命周期 4.5 插件 Maven 1. 前言 1). 什么是Maven? …

Linux实操之服务管理

文章目录一、服务(service)管理介绍:service管理指令查看服务名服务的运行级别(runlevel):CentOS7后运行级别说明chkconfig指令介绍一、服务(service)管理介绍: 服务(service)本质就是进程&#xff0c;但是是运行在后台的&#xff0c;通常都会监听某个端口&#xff0c;等待其它…

原力计划来了【协作共赢 成就未来】

catalogue&#x1f31f; 写在前面&#x1f31f; 新星计划持续上新&#x1f31f; 原力计划方向&#x1f31f; 原力计划拥抱优质&#x1f31f; AIGC&#x1f31f; 参加新星计划还是原力计划&#x1f31f; 创作成就未来&#x1f31f; 写在最后&#x1f31f; 写在前面 哈喽&#x…

依赖注入~

依赖注入之setter注入&#xff1a; 依赖注入是IOC具体的一种实现方式&#xff0c; 这是针对资源获取的方式角度来说的&#xff0c;之前我们是被动接受&#xff0c;现在IOC具体的实现叫做依赖注入&#xff0c;从代码的角度来说&#xff0c;原来创建对象的时候需要new&#xff0…

Phoenix基础命令_视图映射和表映射_数字存储问题---大数据之Hbase工作笔记0036

然后我们再来看看,用Phoenix来操作hbase,的基本用法 具体的其他的命令在官网都能找到,这里就说几个 https://phoenix.apache.org/language/index.html 首先是创建表,这里注意,默认表名给弄成大写的 这里的varchar对应的其实就是hbase中的string 然后这里的id表示行的rowkey 可…

chatgpt3.5和chatgpt4的区别

ChatGPT4是基于GPT-3模型的一个实例&#xff0c;但ChatGPT4已经进行了进一步的改进和优化。GPT-3&#xff08;第三代生成式预训练模型&#xff09;是OpenAl开发的一个大型语言模型&#xff0c;它在很多自然语言处理任务中表现出色。ChatGPT4继承了GPT-3的基本架构和能力&#x…

复旦微ZYNQ7020全国产替代方案设计

现在国产化进度赶人&#xff0c;进口的芯片只做了个功能验证&#xff0c;马上就要换上国产的。国内现在已经做出来zynq的只有复旦微一家&#xff0c;已经在研制的有上海安路&#xff0c;还有成都华微&#xff08;不排除深圳国威也在做&#xff0c;毕竟这个市场潜力很大&#xf…

如何在Unity中实现AStar寻路算法及地图编辑器

文章目录AStar算法简介实现Node节点节点间的估价算法核心邻节点的搜索方式地图编辑器简介实现绘制地图网格障碍/可行走区域地图数据存储AStar算法 简介 Unity中提供了NavMesh导航寻路的AI功能&#xff0c;如果项目不涉及服务端它应该能满足大部分需求&#xff0c;但如果涉及服…

树莓派(3B):启动流程,系统初始化配置,引脚图图示说明

目录 一&#xff0c;树莓派刷机及串口方式登陆 ① 准备工具 ② 操作步骤 二&#xff0c;配置树莓派接入网络 ① 树莓派入网 ② 固定树莓派的ip地址 三&#xff0c;网络SSH方式登陆树莓派 ① 打开树莓派SSH功能 ② 登陆SSH 四&#xff0c;用国内的源更新vim 五&…
最新文章