0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

数字硬件建模SystemVerilog-结构体

OpenFPGA 来源:OpenFPGA 作者:OpenFPGA 2022-06-30 09:54 次阅读

数字硬件建模SystemVerilog-结构体(二)

ad48a850-f80c-11ec-ba43-dac502259ad0.png

结构体

结构体用于将多个变量组合在一个通用名称下。设计通常具有逻辑信号组,例如总线协议的控制信号,或状态控制器内使用的信号。结构体提供了将这些相关变量捆绑在一起的方法。结构体中的所有变量都可以单个赋值,或者每个变量都可以单独赋值。结构体包可以复制到具有相同定义的另一个结构体,并通过模块端口、任务或函数进出。

结构体复制

一个自定义结构体可以复制到另一个自定义结构体,只要这两个结构体是从同一个自定义结构体定义声明的。以下示例使用了上节中所示的结构体定义和声明。

匿名结构体不能作为一个整体复制,但可以一次复制一个成员:

ad5d799c-f80c-11ec-ba43-dac502259ad0.png

压缩和非压缩结构体

默认情况下,结构体会被非压缩的。这意味着结构体的成员被视为独立变量或常量,并以一个共同的名称分组在一起。SystemVerilog没有指定软件工具应该如何存储非压缩结构体的成员。不同的软件工具具对于结构体的存储分布也是不同的。

通过使用关键字packed,将结构体显式声明为压缩结构体。

ad70cfc4-f80c-11ec-ba43-dac502259ad0.png

压缩结构体以与向量相同的形式将结构体的所有成员存储为连续位。结构体的第一个成员是向量最左边的字段。结构体中最后一个成员的最右边的位是向量的最低有效位,编号为位0。如图4-2所示。

ad8710c2-f80c-11ec-ba43-dac502259ad0.png

图4-2:压缩结构体存储为向量

压缩结构体的所有成员都必须是整数值。整数值是可以表示为向量的值,例如byte、int和使用bit或logic类型创建的向量。如果结构体的任何成员不能表示为向量,则该结构体不能被压缩。这意味着压缩结构体不能包含实数或短实数变量、非压缩结构体、非压缩联合体体或非压缩的数组。

引用压缩结构体和结构体成员。压缩结构体可以复制,或分配一个结构体表达式值列表,方法与非压缩结构体相同。压缩结构体的成员可以通过成员名称引用,方式与非压缩结构体相同。

压缩结构体也可以被视为一个向量。因此,除了结构体分配,向量值还可以分配给压缩结构体

ad9eaf84-f80c-11ec-ba43-dac502259ad0.png

向量赋值是合法的,因为赋值左边的结构体成员已压缩在一起,形成一组连续的位,方式与向量相同。因为压缩结构体存储为一组连续的位,所以对压缩结构体执行向量操作也是合法的,包括位选择和部分选择。以下两个赋值都将分配给data_word的tag成员:

adb4bff4-f80c-11ec-ba43-dac502259ad0.png

可以在向量上执行的数学运算、逻辑运算和任何其他运算也可以在压缩结构体上执行。

有符号压缩结构体。压缩结构体可以用signed和unsigned关键字声明。当在运算或关系运算中用作向量时,这些修饰符会影响整个结构体的识别方式。它们不会影响结构体成员的识别方式。结构体的每个成员都被视为有符号或无符号,这取决于该成员的类型声明。压缩结构体的部分选择是无符号的,与向量的部分选择相同。

adcd0686-f80c-11ec-ba43-dac502259ad0.png

通过端口传递结构体

自定义结构体可以通过模块和接口的端口传递,结构体必须首先使用 typedef 定义为用户自定义数据类型,然后才允许将模块或接口的端口声明为结构体类型。

ade708c4-f80c-11ec-ba43-dac502259ad0.png

非压缩的结构体必须是自定义结构体,才能通过端口传递该结构体。与端口的连接必须是与端口类型完全相同的结构体。也就是说,端口和端口两侧的连接都必须从相同的typedef定义声明。此限制仅适用于非压缩结构体。通过模块端口的压缩结构体被视为向量。端口的外部连接可以是相同类型的压缩结构体,也可以是任何类型的向量。

通过将任务或函数参数声明为结构体类型,自定义结构体也可以作为参数传递给任务或函数。

adfc7dbc-f80c-11ec-ba43-dac502259ad0.png

当调用一个任务或函数时,如果该任务或函数有一个非压缩的结构体作为正式参数菜单,则必须将一个完全相同类型的结构体传递给该任务或函数。压缩结构体形式参数被视为向量,可以传递给任何类型的向量。

传统的Verilog与结构体

最初的Verilog语言没有一种方便的机制来将常见信号收集到一个组中。在传统的Verilog样式的模型中,工程师必须使用特殊的分组方法,例如命名约定,其中一组中的每个信号都以一组公共字符开始或结束。最初的Verilog语言也无法通过模块端口或任务和函数传递信号集合,每个信号都必须通过单独的端口或参数传递。

在原始Verilog语言中添加结构体是一种强大的RTL建模构造,反之亦然。它提供了一种更简洁、更直观、更可重用的复杂模型功能建模方法。包中定义的自定义结构体可以在多个模块中重复使用,也可以在用于验证RTL模型的验证测试台中重复使用。

综合指导

非压缩结构体和压缩结构体都是可综合的。综合工具支持结构体通过模块端口传递 , 也支持作为输入或输出传递给任务和函数 , 也支持使用成员名和值的列表对结构体进行赋值。

综合编译器可能比压缩结构体更好地优化非压缩结构体。非压缩结构体允许软件工具确定存储或实现每个结构体成员的最佳方式,而压缩结构体则决定如何组织每个成员。

ae189c40-f80c-11ec-ba43-dac502259ad0.jpg

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 变量
    +关注

    关注

    0

    文章

    596

    浏览量

    28112
  • 控制信号
    +关注

    关注

    0

    文章

    118

    浏览量

    11837
  • 结构体
    +关注

    关注

    1

    文章

    125

    浏览量

    10750

原文标题:SystemVerilog-结构体(二)

文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    分享一些SystemVerilog的coding guideline

    本文分享一些SystemVerilog的coding guideline。
    的头像 发表于 11-22 09:17 320次阅读
    分享一些<b class='flag-5'>SystemVerilog</b>的coding  guideline

    为什么我定义的结构不能用--&gt;来调用结构的元素?

    结构代码部分 typedef unsigned int uint_32t; typedef unsigned short uint_16t; typedef struct { uint_32t
    发表于 11-11 19:06

    ESL设计的核心——事务级建模介绍

    设计、软硬件划分、软硬件协同设计和验证,都离不开事务级建模。 在系统级的设计中,首先要解决的问题是如何描述系统也就是所谓系统建模。在当前的集成电路设计中,算法层次上建立的功能模型(AL
    的头像 发表于 11-02 14:38 515次阅读

    SystemVerilog相比于Verilog的优势

    我们再从对可综合代码的支持角度看看SystemVerilog相比于Verilog的优势。针对硬件设计,SystemVerilog引入了三种进程always_ff,always_comb
    的头像 发表于 10-26 10:05 367次阅读
    <b class='flag-5'>SystemVerilog</b>相比于Verilog的优势

    SystemVerilog硬件设计部分有哪些优势

    Language,硬件描述语言),而SystemVerilog则是HDVL(Hardware Design and Verification Language,硬件设计与验证语言)。由此可见,
    的头像 发表于 10-19 11:19 458次阅读
    <b class='flag-5'>SystemVerilog</b>在<b class='flag-5'>硬件</b>设计部分有哪些优势

    如何在DEBUG的时候实时观察SYSTICK结构的数据?

    在DEBUG这个delay函数的时候,想要观察SysTick指向的结构数据变化,但是添加了SysTick到Watch1中,观察不了。 目前是定义了一个u32 temp采用了将SysTick中
    发表于 10-18 06:29

    结构struct和联合体union的区别?

    结构struct和联合体union的区别?
    发表于 10-11 08:21

    SystemVerilog中的联合(union)介绍

    SystemVerilog 中,联合只是信号,可通过不同名称和纵横比来加以引用。
    的头像 发表于 10-08 15:45 651次阅读
    <b class='flag-5'>SystemVerilog</b>中的联合(union)介绍

    SystemVerilog的随机约束方法

    上一篇文章《暗藏玄机的SV随机化》介绍了SystemVerilog的各种随机化方法,本文将在其基础上引入SystemVerilog的随机约束方法(constraints)。通过使用随机约束,我们可以将随机限制在一定的空间内,有针对性地提高功能覆盖率。
    的头像 发表于 09-24 12:15 474次阅读

    verilog-2005和systemverilog-2017标准规范

    作为逻辑工程师,在FPGA和数字IC开发和设计中,一般采用verilog,VHDL或SystemVerilog等作为硬件描述语言进行工程设计,将一张白板描绘出万里江山图景。
    的头像 发表于 09-04 10:10 1366次阅读
    verilog-2005和<b class='flag-5'>systemverilog</b>-2017标准规范

    verilog/systemverilog中隐藏的初始化说明

    在Verilog和SystemVerilog中经常需要在使用变量或者线网之前,期望变量和线网有对应的初始值
    的头像 发表于 08-25 09:47 619次阅读
    verilog/<b class='flag-5'>systemverilog</b>中隐藏的初始化说明

    SystemVerilog里的regions以及events的调度

    本文讲一下SystemVerilog的time slot里的regions以及events的调度。SystemVerilog语言是根据离散事件执行模型定义的,由events驱动。
    的头像 发表于 07-12 11:20 838次阅读
    <b class='flag-5'>SystemVerilog</b>里的regions以及events的调度

    SystemVerilog的覆盖率建模方式

    为了确保验证的完备性,我们需要量化验证目标。SystemVerilog提供了一套丰富的覆盖率建模方式。
    的头像 发表于 06-25 10:44 574次阅读

    Systemverilog中的Driving Strength讲解

    systemverilog中,net用于对电路中连线进行建模,driving strength(驱动强度)可以让net变量值的建模更加精确。
    的头像 发表于 06-14 15:50 847次阅读
    <b class='flag-5'>Systemverilog</b>中的Driving Strength讲解

    带你了解SystemVerilog中的关联数组

    SystemVerilog中,我们知道可以使用动态数组实现数组元素个数的动态分配,即随用随分
    的头像 发表于 06-09 09:46 4741次阅读
    带你了解<b class='flag-5'>SystemVerilog</b>中的关联数组