SystemVerilog学习(4)——自定义结构

news/2024/5/19 18:28:33 标签: fpga, SystemVerilog

一、 通过typedef来创建用户自定义类型

        typedef语句可以用来创建新的类型。例如,你要求一个算术逻辑单元(ALU)在编译时可配置,以适应8比特、16比特,24比特或32比特等不同位宽的操作数。在Verilog中,你可以为操作数的位宽和类型分别定义一个宏(macro),如例2.32所示。

          SV则提供了特性使得用户可以构建更高抽象层的数据类型。 就同C语言一样,用户可以利用已有的数据类型来定义新的数据 类型,一旦定义了新的数据类型,则此类型的变量则可以声明。

typedef int unsigned uint; 
...
uint a, b;   // two variables of type uint

         为了使代码更易读和维护,通常我们对于自定义的类型,都习惯 添加“_t”的后缀用来表示它是一个自定义类型(type)。

二、 通过enum来创建枚举类型

         枚举类型(enum)提供方法来描述抽象变量的合法值范围,其每一个值都需要提供一个用户自定义的名。

         Verilog语言自身不提供枚举类型,因此为了提供类似于枚举类型可实现的便利,我们不得不采用parameter常量来表示可取 的值范围,或者使用`define来定义各个合法值对应的宏名称。

        默认的枚举类型是int,即32位的二值逻辑数据类型。

        为了能够更准确地描述硬件,SV允许指明枚举类型的数据类型,例如:

enum bit {TRUE, FALSE} Boolean; enum logic [1:0] {WAITE, LOAD, READY} state;

        如果一个枚举类型数值被赋值,那么所赋的值必须符合其数据类型。

enum logic [2:0] {WAITE = 3’b001, LOAD = 3’b010, READY = 3’b100} state;

        如果枚举类型是四值逻辑数据类型,那么对枚举值赋为X或者Z也是合法的。

enum logic {ON=1’b1, OFF=1’bz} out; 

        枚举类型也可以声明为自定义类型,这就使得可以用同一个枚举类型来声明多个变量或者线网。

typedef enum {WAITE, LOAD, READY} states_t; states_t state, next_state;

        如果枚举类型并没有伴随着typedef,那么该枚举类型指的则是一个匿名枚举类型(anonymous enumerated type)。

        多数的Verilog或者SV数据类型之间可以通过不同类型的赋值完成“隐式”的数据转换,所以Verilog/SV的数据类型转换是宽松的。 

三、 通过struct来创建结构体类型

        Verilog的最大缺陷之一是没有数据结构。在System Verilog中你可以使用struct语句创建结构,跟C语言类似。但struct的功能比类少,所以还不如直接在测试平台中使用类,这一点在第5章中会有详述。就像Verilog 的模块( module)中同时包括数据(信号)和代码( always/initial代码块及子程序)一样,类里面也包含数据和程序,以便于调试和重用。struct只是把数据组织到一起。如果缺少可以操作数据的程序,那么也只是解决了一半的问题。 设计或者验证的数据经常会有逻辑相关的数据信号组,例如一个总线协议的所有控制信号,或者在一个状态控制器中用到的所有的信号。所以验证语言对于结构体的支持是非常必要的。

         SV添加了同C一样的结构体struct,而结构体的成员可以是任何变量类型,包括自定义类型或者其它常量类型。 结构体类型默认也是变量类型,用户也可以显示声明其为var或者wire类型。由于struct只是一个数据的集合,所以它是可综合的。如果你想在设计代码中对一个复杂的数据类型进行建模,例如像素,可以把它放到struct里。结构可以通过模块端口进行传递。


http://www.niftyadmin.cn/n/5111452.html

相关文章

基于食肉植物优化的BP神经网络(分类应用) - 附代码

基于食肉植物优化的BP神经网络(分类应用) - 附代码 文章目录 基于食肉植物优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.食肉植物优化BP神经网络3.1 BP神经网络参数设置3.2 食肉植物算法应用 4.测试结果…

Golang爬虫如何触发JavaScript代码

引言 在编写爬虫程序时,有时候我们需要触发页面中的JavaScript代码以获取到完整的页面内容或执行一些特定的操作。Golang作为一门强大的编程语言,提供了许多库和工具来实现这一功能。本文将介绍两种常用的方法来在Golang中触发JavaScript代码。 方法一…

如何检验下载的大模型checkpoint文件是否正确的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

C++中何时及如何使用构造函数

C中何时及如何使用构造函数 构造函数语法:类名(){} 需要注意的是, 没有返回值和返回值为空是两码事。返回值为空指的是该函数有返回值,其中返回值为void类型。而支持重载则说明,在一个类中,可以同时存在多个构造函数…

力扣第376题 摆动序列 c++ 贪心

题目 376. 摆动序列 中等 相关标签 贪心 数组 动态规划 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列…

php对接微信支付-详细教学

登录微信商户>开通对应功能 JSAPI支付>(微信收款-网页-小程序-PC端web) 官方文档:https://pay.weixin.qq.com/docs/merchant/products/ sapi-payment/preparation.html 1.设置你得API网址请求支付的链接 下载官网的api实例 推荐使用 PHP 包管理工具 Compo…

算法进修Day-35

算法进修Day-35 69. x的平方根 难度:简单 题目要求: 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 **注意:**不允许使用任何内置…

python之for循环的简单用法

python之for循环的简单用法 简介例子 简介 Python中的for循环是一种用于遍历可迭代对象(如列表,元组,字典,字符串,文件对象等)的循环结构。它通常用于迭代序列中的元素,或者对可迭代对象中的元…