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

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

3天内不再提示

RTL表达式和运算符

OpenFPGA 来源:OpenFPGA 作者:OpenFPGA 2022-07-21 09:11 次阅读

数字硬件建模SystemVerilog-运算符/表达式规则

经过几周的更新,SV核心部分用户自定义类型和包内容已更新完毕,接下来就是RTL表达式和运算符。

马上HDLBits-SystemVerilog版本也开始准备了,基本这一部分完成后就开始更新~

18d043e0-088d-11ed-ba43-dac502259ad0.png

介绍

运算符对操作数执行操作。大多数运算符都有两个操作数。例如,在运算a+b中,+(加法)运算的操作数是a和b。每个操作数都被称为表达式,表达式可以是文字值、变量、网络;函数调用的返回,或另一个操作的结果。表达式有许多影响操作执行方式的特征。这些特征在后面章节中讨论。

4-state(4态)和2-state(2态)操作

表达式可以是2态或4态。2态表达式的每个位只能有0或1的值。2态表达式不能具有高阻抗值(由字母Z表示)、未知值(由字母X表示)或不关心值(也由X表示)。4态表达式可以在表达式的任何位中包含0、l、Z或X的值。

对2态和4态表达式进行运算的规则很简单——当任何操作数都是4态表达式时,运算的结果将是4态表达式。所有操作数都必须是2态表达式才能得到2态结果。如果结果被用作另一个操作的操作数,或在编程语句(如if-else)中求值,则此规则可能会影响其他操作。

该章中建议的编码准则是,RTL建模只使用4态类型。一个主要原因是,运算结果中任何一位的X都可以很好地表明其中一个操作数有问题。当使用2态类型时,设计问题可能会被隐藏,因为操作结果中没有X值指示潜在的错误(之前的文章有详细讨论这部分)。

X-OPTIMISM和X-PESSIMISM

大多数SystemVerilog运算符都是X-optimism,这意味着即使操作数中有X或Z值,该操作也可能产生已知结果。一些SystemVerilog运算符,如算术运算符和关系运算符,是X-pessimism,这意味着,如果任何操作数的任何位具有X或Z值,则结果的所有位将自动为X。

X-OPTIMISM。即使一个或两个操作数的位具有X或Z值,X-optimism也可以产生有效的结果。考虑下面的示例和所示的逻辑值:

18e7c466-088d-11ed-ba43-dac502259ad0.png

该运算的结果是值4’b0000。这是因为&运算符为其操作数的每一位建模一个数字and逻辑门。在数字逻辑中,0与任何值的AND运算将产生0,操作数a中的高阻抗位(由Z表示)和未知位(由X表示)在result中变为0,因为这些位与b中对应的位进行AND运算,b的值为0。这种行为被称为X-OPTIMISM。仿真将有一个已知的结果,即使操作数的位具有X或Z值。

X-OPTIMISM仅适用于仿真可以准确预测实际逻辑门行为的值。在下面的示例中,b操作数是全1而不是全0。

1907d094-088d-11ed-ba43-dac502259ad0.png

运算的结果是值4’b01xx。对于这些操作数值,X-optimism不适用于最右边的两个位。在实际逻辑门中,高阻抗AND (与)X,可能会产生0或1,其值取决于一系列条件,例如用于构建与门的晶体管类型、晶体管电路的阻抗和电容、工作电压,甚至环境温度。抽象RTL和运算符没有此详细信息。如果没有这些细节,数字仿真无法预测0或1是否会由1与Z相加产生。类似地,X代表未知值,这意味着实际逻辑门值可能是0、1或Z,如果存在这种模糊性,数字仿真无法预测0或1是否会由1与X相加产生。

**X-pessimistic。少数SystemVerilog运算符更"悲观"**。如果任何操作数的任何位具有X或Z值,则该操作会自动返回一个值,其中所有位都为X。X-pessimistic如算术运算符(如加法运算符)和关系运算符(如小于运算符)。

1922694a-088d-11ed-ba43-dac502259ad0.png

运算的结果是4’bxxxx。出现这种X是因为算术加法运算符执行基于数字的加法,而不是按位加法。操作数a的值为4’b000x,这不是一个数字,因此运算结果是一个未知值。

后面会更详细地研究SystemVerilog RTL运算符,以及每个运算符是X-optimistic or X-pessimistic。为了编写能够正确表示的RTL模型,理解这些影响硬件行为至关重要。

运算向量大小和自动向量扩展

运算符的每个操作数可以是任意大小的向量;包括标量(1位)。操作数的向量大小可能会影响操作的执行方式。一个重要的考虑因素是当运算符的操作数是不同的向量大小时。

自定义操作数Self-determined operands。有些运算符独立处理每个操作数。操作数是否为不同的向量大小并不重要。这些运算符的操作数称为自定数self-determined。在下面的示例中,运算符执行逻辑“&&”运算,测试两个操作数是否都为真。如果是,则该操作返回的结果为true,否则,该操作返回的结果为false:

193eb276-088d-11ed-ba43-dac502259ad0.png

操作数a和b是自定数。每个操作数的计算结果可以是真或假,与另一个操作数的向量大小无关。

上下文确定的操作数。许多运算符需要将操作数展开为相同的向量大小,然后才能执行操作。这些运算符的操作数被称为上下文确定的操作数(context-determined)。该操作将使最短的操作数向左扩展,使其与最大的操作数的向量大小相同。在下面的示例中,&运算符执行按位AND运算,将每个操作数的每一位相加,并返回布尔结果。

195c1e92-088d-11ed-ba43-dac502259ad0.png

为了将a的每一位与b的每一位进行AND,该操作将两个操作数调整为相同的向量宽度。该操作将检查操作的上下文以确定最大的操作数,然后左扩展较短的操作数以匹配最大操作数的大小。扩展规则如下:

如果最左边的位为0或l,且操作数为无符号类型,则操作数为零扩展(每个附加位的值为0)。

如果最左边的位是0或l,并且操作数是有符号类型,则操作数是符号扩展的(每个额外的位被赋予最左边位的值或原始值。最左边的位被称为符号位)。

如果最左边的位是Z,则操作数是Z扩展的(每个额外的位都有Z的值)。

如果最左边的位是X,则操作数是X扩展的(每个附加位的值为X)。

算术运算的上下文推断大小比其他运算符的上下文推断大小更复杂,上下文推断大小不仅考虑运算符的操作数,还考虑赋值语句右侧和左侧所有表达式的向量大小,如以下代码所示:

19767648-088d-11ed-ba43-dac502259ad0.png

有符号和无符号表达式

算术、比较和移位运算符可以执行有符号或无符号运算。规则很简单——如果执行运算的所有操作数都是有符号的,则执行有符号运算。如果任何受影响的操作数是无符号的,则执行无符号操作——以下代码段说明了这些规则。注释中注明了操作类型。

1998130c-088d-11ed-ba43-dac502259ad0.png

运算符的符号性完全由操作运算符的操作数决定。它不受赋值语句左侧的符号性影响。

整数(向量)和实数(浮点)表达式

所有SystemVerilog运算符都可以对整数值执行操作。IEEE SystemVerilog标准将整数值称为整数表达式——由一个或多个连续位组成的值。工程师通常将这些整数或整数值称为向量。

SystemVerilog将定点和浮点表达式称为实数表达式。大多数类型的运算都可以在实数表达式上执行,包括:赋值运算、算术运算、逻辑(真/假)运算、比较运算和递增/递减运算。有一些操作无法在实数表达式上执行。这些操作主要包括向量的位处理,例如位和部分选择操作、按位操作、移位操作、连接操作和流操作。

可以对整数和实数表达式的混合执行操作。混合类型运算的规则是,如果任何操作数是实数表达式,则另一个操作数将转换为实数表达式,并执行浮点运算。

笔记
RTL综合编译器通常不支持实数(浮点)表达式。高级综合(HLS)工具可用于复杂的算法设计。浮点和定点设计不在本系列文章的范围之内。

19b8ed52-088d-11ed-ba43-dac502259ad0.jpg

SystemVerilog-使用结构体和联合体的例子

原文标题:SystemVerilog-运算符/表达式规则

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

审核编辑:彭静

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

    关注

    11

    文章

    2922

    浏览量

    64791
  • 编码
    +关注

    关注

    6

    文章

    835

    浏览量

    54457
  • RTL
    RTL
    +关注

    关注

    1

    文章

    377

    浏览量

    59068
  • 运算符
    +关注

    关注

    0

    文章

    163

    浏览量

    10947

原文标题:SystemVerilog-运算符/表达式规则

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

收藏 人收藏

    评论

    相关推荐

    数字硬件建模SystemVerilog-按位运算符

    经过几周的更新,SV核心部分用户自定义类型和包内容已更新完毕,接下来就是RTL表达式运算符
    的头像 发表于 08-12 14:27 1977次阅读

    关于数字硬件建模SystemVerilog

    经过几周的更新,SV核心部分用户自定义类型和包内容已更新完毕,接下来就是RTL表达式运算符
    的头像 发表于 09-01 08:50 977次阅读

    JAVA语言的运算符表达式

    JAVA语言的运算符表达式3.5 运算符表达式数据的类型除了限定数据的存储方式、取值范围之外,还定义了对该数据类型可进行的操作即运算。表
    发表于 12-06 00:28

    数据类型、运算符表达式

    数据类型、运算符表达式2.1   程序设计概述2.2  C语言的数据类型 2.3  常量和变量 2.4 
    发表于 03-10 15:05

    C语言单片机第七课 运算符表达式(关系运算符)

    第七课 运算符表达式(关系运算符)关系运算符,同样我们也并不陌生。单片机C语言中有六种关系运算符,这些东西同样是在我们小时候学算术时就已经
    发表于 10-21 09:38

    关于C语言的运算符表达式--笔记1

    关于C语言的运算符表达式学好C语言的基础运算,还是很有必要,无论在C语言,还是后面单片机,都会用到基础运算。如果不能很好运用,会给我们编程带来很多麻烦,废话不多说,现在开始写一些个人
    发表于 07-19 00:48

    单片机C语言教程-运算符表达式

    单片机C语言教程-运算符表达式   单片机C语言教程-运算符表达式  运算符的种类、优先级和结合性  c语言中运
    发表于 03-27 17:13 2122次阅读

    RTL表达式运算符

    经过几周的更新,SV核心部分用户自定义类型和包内容已更新完毕,接下来就是RTL表达式运算符
    的头像 发表于 07-27 09:11 1210次阅读

    关于RTL表达式运算符

    经过几周的更新,SV核心部分用户自定义类型和包内容已更新完毕,接下来就是RTL表达式运算符
    的头像 发表于 09-01 09:13 1283次阅读

    RTL表达式运算符

    经过几周的更新,SV核心部分用户自定义类型和包内容已更新完毕,接下来就是RTL表达式运算符
    的头像 发表于 10-11 10:15 1189次阅读

    RTL表达式运算符

    决策语句(Decision statements)允许程序块的执行流程根据设计中信号的当前值分支到特定语句。SystemVerilog有两个主要的决策语句:if…else语句和case语句,使用关键字case、case…inside,casex和casez。
    的头像 发表于 10-21 09:04 997次阅读

    RTL表达式运算符

    经过几周的更新,SV核心部分用户自定义类型和包内容已更新完毕,接下来就是RTL表达式运算符
    的头像 发表于 11-03 09:14 909次阅读

    逻辑运算符表达式

    在C语言中,我们通常会进行真值与假值的判断,这时我们就需要用到逻辑运算符与逻辑表达式。如果表达式的值不为0,则通通返回为真值。只有当表达式的值为0时,才会返回假值。
    的头像 发表于 02-21 15:16 1442次阅读
    逻辑<b class='flag-5'>运算符</b>与<b class='flag-5'>表达式</b>

    位逻辑运算符表达式

    位逻辑运算符与位逻辑表达式可以实现位的编辑,比如位的清零、设置、取反和取补等操作。使用位逻辑运算符与位逻辑表达式可以在不使用汇编的情况下实现部分汇编的功能
    的头像 发表于 02-21 15:22 940次阅读
    位逻辑<b class='flag-5'>运算符</b>与<b class='flag-5'>表达式</b>

    C语言基本的算术运算符表达式

    注意:自增和自减运算符只能用于变量,而不能用于常量或表达式 **C语言算术表达式运算符的优先级与结合性 ** 在表达式求值时,
    的头像 发表于 03-09 10:44 1279次阅读