当前位置:网站首页>SystemVerilog-条件(三元)运算符
SystemVerilog-条件(三元)运算符
2022-08-04 05:38:00 【碎碎思】
数字硬件建模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 input
input logic data_select, // 1-bit input
input logic [WIDTH-1:0] d1, d2, // scalable input size
output 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 d2
endmodule: 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 buffer
endmodule: 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的综合结果:条件运算符(三态输出)
边栏推荐
猜你喜欢

如何用matlab做高精度计算?【第三辑】(完)

狗都能看懂的Vision Transformer的讲解和代码实现

ResNet详解:ResNet到底在解决什么问题?

A semi-supervised Laplace skyhawk optimization depth nuclear extreme learning machine for classification

天鹰优化的半监督拉普拉斯深度核极限学习机用于分类

Microsoft computer butler 2.0 beta experience

matlab封闭曲线拟合 (针对一些列离散点)

CMDB 腾讯云部分实现

基于爬行动物搜索RSA优化LSTM的时间序列预测

在线公众号文章内容转音频文件实用小工具
随机推荐
MySQL重置root密码
如何画好业务架构图。
花了近70美元入手的学生版MATLAB体验到底如何?
VS 2017编译 QT no such slot || 找不到*** 问题
类图规范总结
RHCE之路----全
matlab的2DCNN、1DCNN、BP、SVM故障诊断与结果可视化
[漏洞问题] log4j漏洞 关于2.17.0升级到2.18.0 方案
IoU, GIoU, DIoU and CIoU in target detection
SegNet——论文笔记
基于EEMD+GRU+MLR的时间序列预测
av_read_frame 阻塞,基于回调的解决办法
this关键字,构造函数
MySQL大总结
网络端口大全
GRNN、RBF、PNN、KELM之间究竟有什么联系?
golang rtsp拉流测试
DropBlock: 卷积层的正则化方法及复现代码
字符串的一些方法
数据库知识:SQLServer创建非sa用户笔记

