数字硬件建模SystemVerilog-条件(三元)运算符

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

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

介绍

RTL建模中广泛使用的运算符是条件运算符,也称为三元运算符,该运算符用于在两个表达式之间进行选择——表5-2列出了用于表示条件运算符的重点。

表5-2:RTL建模的条件(三元)运算符

运算符 示例用法 描述
?: s?m:n 如果s为真,则选择m;如果s为假,则选择n,否则(s不为真不为假)对m和n进行按位比较

问号(?)前面列出的表达式被称为控制表达式(control expression),表示它可以是一个简单的整数值(任何大小的向量,包括1位),也可以是另一个返回整数值的操作的结果。例如:

使用以下规则将控制表达式计算为true或false:

  • 如果所有位为l,则表达式为true。

  • 如果所有位均为0,则表达式为false。

  • 如果未设置任何位且并非所有位均为0,则表达式未知,如果某些位为X或Z,则可能出现这种情况。

对于4-state值,控制表达式可能既不是真的也不是假的。在下面的值中,没有一个位是l,但不是所有的位都是0。

当控制表达式未知时,条件运算符对两个可能的返回值进行按位比较。如果对应位均为0,则该位位置返回0,如果对应位均为l,则该位位置返回1。如果对应的位不同,或者任一位有X或Z值,则返回该位位置的X。下面的示例演示了这种仿真行为。

条件运算符的行为通常类似于硬件多路复用器。示例5-3说明了如何使用条件运算符在寄存器的两个输入之间进行选择。图5-3显示了综合该示例的结果。条件运算符映射到四个多路复用器,四位d1和d2输入的每一位对应一个多路复用器。

示例5-3:使用条件运算符:4位多路复用寄存器D输入

// 4-bit register with multiplexed D input, using conditional
// operator.
//
//`begin_keywords "1800-2012" // use SystemVerilog-2012 keywords
module muxed_register
#(parameter WIDTH = 4)                 // register size
(input  logic             clk,         // 1-bit inputinput  logic             data_select, // 1-bit inputinput  logic [WIDTH-1:0] d1, d2,      // scalable input sizeoutput logic [WIDTH-1:0] q_out        // scalable output size
);timeunit 1ns; timeprecision 1ns;always_ff @(posedge clk)q_out <= data_select? d1 : d2;     // store d1 or d2endmodule: muxed_register
//`end_keywords图形5-3:示例5-3的综合结果:条件运算符(多路复用寄存器)

图5-3所示的电路是综合编译器将电路映射到特定ASIC或FPGA目标实现之前的中间通用综合结果。用于生成图5-3的综合编译器使用了具有未连接的set和rst输入的通用触发器,使用ASIC或FPGA库的最终实现可能能够使用没有这些输入的触发器(如果目标设备中可用)。不同的综合编译器可能会使用不同的通用型组件来表示这些中间结果。

条件运算符并不总是作为多路复用器实现。综合编译器可能会根据操作数的类型和运算的上下文,将条件运算符映射并优化为其他类型的门级逻辑。在示例5-4中,条件运算符表示三态缓冲器,而不是多路复用逻辑,图5-4显示了综合该示例的结果,

示例5-4:使用条件运算符:带三态输出的4位加法器

// 4-bit adder with tri-state outputs, using conditional operator
// (no carry).
//
//`begin_keywords "1800-2012" // use SystemVerilog-2012 keywords
module tri_state_adder
#(parameter N = 4)                // N-bit adder size
(input  logic             enable, // output enable
input  logic     [N-1:0] a, b,   // scalable input size
output tri logic [N-1:0] out     // tri-state output, net type
);timeunit 1ns; timeprecision 1ns;assign out = enable? (a + b) : 'z;  // tri-state bufferendmodule: tri_state_adder
//`end_keywords

在本例中,条件运算符(?)选择输出端口应分配(a+b)或高阻抗。如果en为false,则将out赋值为z。’z标记是一个文字值,用于将表达式的所有位设置为高阻抗,并自动缩放到表达式的向量大小。有关向量填充文字值的更多详细信息,请参见之前的文章。

在示例5-4中观察,out三态输出端口被声明为3-state logic类型,而不是通常的逻辑类型,logic数据类型只定义端口时可以有四态值,它不定义端口类型是网络类型或者变量类型。输出端口默认为变量类型,除非显式声明为NET(网络)类型。(相反,输入端口将默认为NET类型,除非显式声明为变量类型),关键字•tri声明网络类型。tri类型在各个方面都与wire类型相同,但tri关键字可以帮助记录网络或端口的预期三态(高阻抗)值。

图5-4:示例5-4的综合结果:条件运算符(三态输出)

SystemVerilog-连接和复制运算符

SystemVerilog-运算符/表达式规则

SystemVerilog-条件(三元)运算符相关推荐

  1. html三元运算符 模板,JavaScript ——条件 (三元) 运算符介绍

    运用条件运算符将你的 if 语句缩短为一行代码 由基础开始--if 语句 运用条件语句,比如 if,当 if 语句满足的情况下,允许我们执行指定一些代码块 比如下面的例子 person 对象包含 na ...

  2. JavaScript的条件判断语句以及三元运算符

    1.简单的if语句 if语句是最简单的常用判断语句 if("条件表达式"){语句块1 }语句快2 2.if-else语句 if-else语句是条件分支语句,如果条件表达式的值为tr ...

  3. java 三元 代替 if_关于性能:Java中的三元运算符比“ if”条件快吗?

    本问题已经有最佳答案,请猛点这里访问. 我容易出现"如果条件综合症",这意味着我倾向于一直使用if条件. 我很少使用三元运算符. 例如: //I like to do this: ...

  4. php 三元运算判断,PHP 条件判断语句和三元运算符

    $n1=1000; $n2=1000; $n3=100; $n4=100; // if 语句 - 如果指定条件为真,则执行代码 // if...else 语句 - 如果条件为 true,则执行代码:如 ...

  5. java运算符-逻辑、三元运算符

    1.逻辑运算符 逻辑运算符,它是用于布尔值进行运算的,运算的最终结果为布尔值true或false. 运算符 运算规则 范例 结果 & 与 false&true False | 或 fa ...

  6. 如何在剃须刀中使用三元运算符(特别是在HTML属性上)?

    借助WebForms视图引擎,我通常将三元运算符用于非常简单的条件,尤其是在HTML属性中. 例如: <a class="<%=User.Identity.IsAuthentic ...

  7. 关系运算符、逻辑 运算符与三元运算符

    1 关系运算符 返回值是boolean 一般用于判断语句当中 ==等于 !=不等于 >= <= 2 逻辑运算符 &逻辑与 |逻辑或 !逻辑非运算 &&短路与 ||短 ...

  8. php 三元运算符 为空,PHP中三元运算符和Null合并运算符的简单比较

    在PHP中,三元运算符(?:)和Null合并运算符(??)的用法相似,那么它们之间有什么差异?下面本篇文章就来带大家了解一下三元运算符和Null合并运算符,希望对大家有所帮助. 三元运算符 三元运算符 ...

  9. java三目运算符判断boonlean,java三元运算符

    首先看一下三元运算符的格式 [条件语句] ? [表达式1] : [表达式2] 其中如条件语句为真执行表达式1,否则执行表达式2.简单的例子就不举了,来点其它的.在JDK1.5以前的版本中,表达式1和表 ...

  10. python三元运算符怎么使用_Python的三元运算符使用方法

    Python的三元运算符使用方法 发布于 2014-09-23 21:00:43 | 104 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种面向对象.解释型计算 ...

最新文章

  1. IE6 / IE7 / Firefox 的margin问题解决办法
  2. php的pathinfo,php中PathInfo的用法举例(图文)
  3. Java常用API(六)Date 日期类介绍及使用
  4. Android学习指南 第六讲:用户界面 View(二)
  5. 五天学习MySQL 数据库教程(一)1.2SQL介绍
  6. 我想和你一起去这样一个地方
  7. php概率计算_PHP指定概率算法
  8. Java静态方法与非静态方法的泛型
  9. 混合App开发,HBuilder开发移动App
  10. 2014年5月生日会
  11. 廖雪峰--python教程:笔记四-函数式编程
  12. js检查数据类型的方法
  13. 初学web前端开发,你必要了解的基本概念与工具技术
  14. Linux - ATT汇编基础
  15. matlab设计模拟带通滤波器
  16. 服务器远程桌面连接限制ip,服务器设置防火墙规则,实现远程桌面连接的ip限制...
  17. g9008v android7,三星G9008V Android 4.4 (GALAXY S5 移动4G)图文刷机教程,最新教程,简单明了...
  18. git clone 使用代理加速
  19. 整数在计算机里的表示
  20. 2022年9月各大学网络教育统考大学英语B考试复习题库

热门文章

  1. 去除lt;!--[if gte mso 9]......lt;![endif]--gt;字符串
  2. 全国计算机应用统考试题,全国计算机统考试题及答案
  3. macos 下载brew命令
  4. 什么是 Asciidoc
  5. 怎么把电脑桌面的计算机隐藏,怎么把电脑桌面的图标隐藏了
  6. BLE 信道和自适应跳频
  7. 信息学奥赛学习、训练、测试的顺序,思路及方法
  8. html重置按钮代码用法,HTML Input Reset value用法及代码示例
  9. 小程序学习之旅---解析html代码-wxParse
  10. .NET基础示例系列之二十四:家谱软件(1)