当前位置:网站首页>SystemVerilog-结构体(一)
SystemVerilog-结构体(一)
2022-06-29 01:57:00 【碎碎思】
数字硬件建模SystemVerilog-结构体(一)


结构体
结构体用于将多个变量组合在一个通用名称下。设计通常具有逻辑信号组,例如总线协议的控制信号,或状态控制器内使用的信号。结构体提供了将这些相关变量捆绑在一起的方法。结构体中的所有变量都可以单个赋值,或者每个变量都可以单独赋值。结构体包可以复制到具有相同定义的另一个结构体,并通过模块端口、任务或函数进出。
结构体声明
结构体是使用struct关键字声明的,类似于C语言。struct关键字后面跟着一个开始的大括号( { )变量声明列表,结束的大括号(}),然后是结构体的名称。

一个结构体可以将任意数量的变量数据类型捆绑在一起,用户自定义类型、Parameter和localparam常量也可以包含在一个结构体中,结构体中的Parameter不能像模块中的Parameter那样重新定义,结构体中的参数被视为localparam。
结构体成员赋值
结构体中的变量称为结构体成员。每个成员都有一个名称,可用于从结构体中选择该成员。使用结构体的名称引用结构体成员,后跟句点(.)然后是成员的名字。这与C中的语法相同。例如,要为前面结构体的address成员赋值,引用为:

结构体不同于数组,因为数组是所有类型和大小相同的元素的集合,而结构体是不同类型和大小的变量和常量的集合。另一个区别是,数组的元素是通过在数组中使用索引来引用的;结构体的成员是通过使用成员名称来引用的。
整个结构体赋值
可以为整个结构体指定一个结构体表达式。结构体表达式是使用逗号分隔的值列表形成的,这些值包含在标记’{}之间,这与将一组值分配给数组的方式相同,大括号必须包含结构体中每个成员的值。例如:

结构体表达式中的值必须按照在结构体中定义的顺序列出,如前一示例所示。或者,结构体表达式可以指定要为其赋值的结构体成员的名称,其中成员名称和值用冒号(:)分隔。结构体表达式中的成员名称称为tags。指定成员名称后,表达式列表可以是任意顺序。

在同一个结构体表达式中混合按名称和按顺序赋值是非法的。
结构体表达式中的默认值。结构体表达式可以通过指定默认值为一个结构体的多个成员指定值,默认值是使用default关键字指定的。

结构体表达式还可以包含对特定结构体成员的混合赋值,以及对所有其他成员指定默认值。

结构体中的枚举数据类型。前两个带有默认值的示例存在语义错误,分配给结构体成员的默认值必须与成员的数据类型兼容。由于大多数SystemVerilog变量都是弱类型的,因此几乎所有默认值都是兼容的。然而,枚举数据类型变量的类型更强。对枚举数据类型变量的赋值必须是其枚举列表中的标签,或者是同一枚举数据类型定义的另一个枚举变量。
上述instruction_word 的两个赋值语句试图将opcode的默认值赋值为0。这是opcode的非法值,它是一个opcode_t枚举数据类型变量(opcode_t的typedef定义是之前枚举变量章节)。当结构体的成员是枚举数据类型变量时,结构体表达式必须为该成员指定合法的显式值。可以为所有其他成员指定默认值。例如:

自定义和匿名结构体
用户自定义类型可以使用typedef关键字从结构体中创建。将结构体声明为用户自定义类型不会分配任何存储空间。在使用该结构体之前,必须声明该用户自定义类型的网络或变量。

不使用typedef的结构体被定义为匿名结构体。使用typedef声明的结构体被视为自定义结构体。匿名结构体和自定义结构体都可以在模块中定义,但这些本地(局部)定义只能在该模块中使用。自定义结构体也可以在包中定义,并导入到需要结构体定义的设计块中。包中定义的自定义结构体可用于多个模块和验证测试台。
结构体复制
一个自定义结构体可以复制到另一个自定义结构体,只要这两个结构体是从同一个自定义结构体定义声明的。以下示例使用了上节中所示的结构体定义和声明。
匿名结构体不能作为一个整体复制,但可以一次复制一个成员:

边栏推荐
- Interviewer: with the for loop, why do you need foreach??
- SQL splits strings into tables
- I want to buy stocks today, OK? Is it safe to open an account online now?
- 如何成为一名高级数字 IC 设计工程师(6-4)数字 IC 验证篇:测试点分解
- Near consensus mechanism
- 为什么建议大家尽可能选择自研公司
- In MySQL database, the two data written when creating tables with foreign keys are the same. Do I copy them or fail to display them
- Qt基础教程:数据类型与容器
- Query any field of any table in JPA to the util method of entity class dto
- 想请教一下,如何选择券商?现在网上开户安全么?
猜你喜欢

Exclusive analysis | real situation of software test about resume and interview

Analysis of advantages and disadvantages of environment encryption and transparent encryption

Tiflash compiler oriented automatic vectorization acceleration

Analysis of sending principle of OData metadata request for SAP ui5 application

Test a CSDN free download software

Using autogluon to forecast house price

Zhongyi technology resumed the review status of the gem IPO, and xuxiaofei no longer acted as a practicing lawyer

Magic Quadrant of motianlun's 2021 China Database

In simple terms, server intrusion prevention

The metadata request parsing principle of OData XML format applied by SAP ui5 is based on domparser
随机推荐
Which is the best billing method for okcc call center
Magic Quadrant of motianlun's 2021 China Database
直播预告|SQL也能玩转工业级机器学习?MLOps meetup V3带你一探究竟!
How to prevent virus
分享自己平时使用的socket多客户端通信的代码技术点和软件使用
我把整个研发中台拆分过程的一些心得总结
Battle drag method 1: moderately optimistic and build self-confidence (2)
MySQL详解 --- 聚合与分组
How to become a senior digital IC Design Engineer (4-2) script: file read / write operation realized by Verilog HDL code
Scala 基礎 (三):運算符和流程控制
SAP ui5 beginner tutorial 22 - development and use of filter
基于 FPGA 的 RISC CPU 设计(4)关于项目的 36 个问题及其答案
How does flush open an account? Is it safe to open an account online?
How to become a senior digital IC Design Engineer (1-1) Verilog coding Grammar: Introduction
如何成为一名高级数字 IC 设计工程师(5-1)理论篇:时钟技术、复位技术
Dialogue with opensea co creation Alex: we still only touch the tip of the iceberg of NFT capability | chain catcher
Utiliser kubernets Resource Lock pour compléter son application ha
Callback function of unity after importing resources
Typescript (7) generic
TiFlash 面向编译器的自动向量化加速
