数字硬件建模systemverilog(五)-文本值
system verilog 扩展了 verilog 的 教据类型 , 增强了指定文本值的方法。在介绍文本值之前我们先简单回忆一下hdl中的四个状态数据值。
四个状态数据值对于rtl建模,system verilog使用硅中可能出现的值的四值表示。
0表示抽象数字低电平,没有与之相关的电压或电流。1表示抽象数字高电平,无电压或电流,z表示抽象数字高阻抗,在多驱动器电路中,值为0或1将覆盖z。一些编程运算符和编程语句将z值视为无关紧要的值。x表示多驱动器电路中的未初始化值、不确定值或值冲突。在某些rtl模型上下文中,综合编译器将x值视为不关心值。0、1和z的值是实际硅中可能存在的值的抽象。
x的值不是实际的硅值。仿真器使用x来表示物理硅在特定情况下的行为的不确定性程度,例如,当仿真无法预测实际硅值是0还是1(或三态器件的z)时,对于综合,x值还为设计工程师提供了一种方法来指定“don’t-care”条件,工程师不关心实际硅在特定条件下是否具有0值或1值。
文本值-literal values (numbers)system verilog 扩 展 了 verilog 的 教 据 类 型 , 增 强 了 指 定 文 本 值 的 方 法。这里的literal values是直译,即字面量或常量、文本值。在我理解来看,literal是指某一数据类型的具体值。
文本值是整数或实数(浮点数)。systemverilog提供了几种指定文本值的方法,还有一些文本值的语义规则,在编写rtl模型时需要理解这些规则。
文本整数值-literal integer values文本整数值是一个整数,没有小数点。(ieee 1800 systemverilog标准使用术语“整数文本integer literal”而不是“文本整数literal integer”),文本整数可以通过多种方式指定:
简单的十进制整数值二进制、八进制、十进制或十六进制整数值大小文本整数值有符号或无符号文本整数值仿真和综合工具都需要知道或假设文本整数值的特定特征。这些特点是:
值的位宽度(向量大小)值的有符号性(有符号或无符号)值的基数(也称为基数)2-state or 4-state value这些特征影响值的操作和赋值。
简单的十进制文本整数文本整数值可以指定为简单的数字,如数字9,如以下代码段所示:
result = d + 9;仿真和综合将简单的文本数视为:
32位宽的值有符号十进制值2态值(没有位可以是z或x)这些特征以及 d 的特征将影响加法的执行方式以及结果赋值的执行方式。
二进制、八进制、十进制和十六进制文本整数。可以为文本整数值指定二进制、八进制、十进制或十六进制的特定基数,该基数使用撇号(’)指定(有时称为“勾号”),后跟一个字母:b或b表示二进制,o或o表示八进制,d或d表示十进制,h或h表示十六进制。一些示例包括:
result=‘d9 + ‘h2f + ‘bl010;仿真和综合将未指定大小的显式基本文本数视为:
32位宽的值无符号值(注意与有符号的简单文本整数的差异)规定的基准值4态值(任何或所有位可以是x或z)二进制值的每个位可以是0、l、x或z;八进制值的每个3位组可以是07、x或z;十进制值的每个位可以是09、x或z;十六进制值的每个4位组可以是09、af、x或z。
有符号文本整数。默认情况下,具有指定基的文本值在操作和赋值中被视为无符号值。可以通过在撇号之后和基本说明符之前添加字母s或s来覆盖此默认值。
result=’sd9 + ‘sh2f + ‘sbl0l0;在某些操作和赋值语句中,有符号值与无符号值的处理方式不同。后面讨论了有符号和无符号值对运算符和运算的影响。
调整文本整数的大小默认情况下,在操作、编程语句和赋值语句中,简单文本数和指定了基数的文本数被视为32位值。此默认值不能准确表示使用其他向量大小的硬件模型。
具有特定基的值也可以指定特定的位宽度。用于表示值的位数在撇号、有符号性和基本规范之前指定:
result = 16 ‘d9 + 8 ‘h2f + 4 ‘bl010;笔记
当文本值的大小与赋值语句左侧的变量不同时,综合编译器和lint检查器可能会生成警告消息。这些大小不匹配警告消息可能会隐藏其他需要注意的消息。使用显式大小的文本值将防止大小不匹配警告。
最佳做法准则3-1
在rtl模型中仅使用二进制和十六进制文本整数。这些数字基在数字逻辑中具有直观的意义
八进制值的使用已经过时几十年了。文本十进制值很容易与其他数字混淆。
有个老工程笑话适用于这里。。。
there are 10 types of people in the world, those that understand binary,and those that don’t世界上有10种人,懂二进制的和不懂二进制的不匹配的大小和值检测规则下面的规则是编写hdl代码中最难检查的,也是大部分人不注意的!
指定一个位宽不同于表示该值所需位数的文本整数是合法的。例如:
systemverilog始终调整该值以匹配指定的大小。这些规则是:
当大小小于值的位时,值的最左边位被截断。当大小大于该值的位数时,该值保持扩展。使用以下规则填充附加位:如果值的最左边位为0或l,则额外的高位用0填充。如果该值的最左边位为z,则附加的高位用z填充如果该值的最左侧位为x,则额外的高位用x填充。请注意,即使将文本整数指定为有符号整数,该值也不会进行符号扩展。符号扩展发生在有符号文本值用于操作和赋值语句时,这将在后面中讨论。
前面代码段的值调整为:
4’hface//截断为4’he16’sh8//延伸至16’sh000832’bz//扩展到32’bzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz最佳做法准则3-2
在综合rtl模型之前,将lint检查程序(也称为建模规则检查器)与仿真结合使用。
当发生截断时,仿真器可能会报告非致命警告消息,但不需要报告警告。仿真器将无声地扩展文本值以匹配大小,而不会生成任何警告。存在在仿真中验证设计功能而未意识到尺寸/值不匹配的风险。使用lint检查器时将显示文本值中的任何不匹配。
附加文本值规则问号(?)可以用来代替z来表示高阻抗。在大多数情况下,字母z是表示高阻抗的更直观的方式。然而,有些运算符和编程语句使用高阻抗值来表示不关心状态。对于这些不关心的情况,使用问号表示高阻抗会更直观。
在文本值中的任何位置都可以使用分割以下的字符(_),仿真、综合编译器等都可以解析,同时systemverilog代码的工具会忽略下划线。在数字中添加一个下划线有助于使长数字更具可读性,尤其是二进制值-下划线也可用于显示值中的子字段,
向量填充文本值systemverilog提供了一种特殊形式的无大小文本整数,它将任何大小的向量的所有位设置为0、l、x或z。文本值的向量大小根据其上下文自动确定。
‘0用0填充左侧的所有位‘1用1填充左侧的所有位‘z或’z用z填充左侧的所有位t‘x或’x用x填充左侧的所有位使用向量填充文本整数的示例如下:
向量填充文本整数是建模可伸缩设计的一个重要构造,对于不同的设计配置,可具有不同的向量宽度。本章后面章节讨论了可配置向量大小的建模。
这些向量填充文本整数不是传统verilog的一部分。它们是作为原始verilog语言的systemveri1og扩展的一部分添加的。
浮点文本值(实数)systemverilog将浮点值称为实数。实数使用64位双精度浮点表示。文本浮点值是通过在文本数字中使用小数点来指定的。必须在小数点的两侧指定一个值。
3.15675.00.5笔记
rtl综合编译器通常不支持实(浮点)表达式。高级综合(hls)工具可用于复杂的算法设计。浮点和定点设计不在本系列rtl建模的范围之内-
基于Blockchain技术的去中心化基础架构Amino介绍
海信金刚4手机体验评测 外观大气硬朗
恢复软件是如何工作的
CS5210的参数详情
NPN与PNP三极管的导通条件
什么是文本值?
QuickChip Design Example 2 Low
iPhone15定档9月13日 苹果连夜预告iPhone15系列发布会
Arango DB Enterprise—智能图形
NVIDIA特供中国的芯片,AI性能大降10%售价依然高
Cadence和台积电合作开发N16 79GHz毫米波设计参考流程,助力雷达、5G和无线创新
雅俊 ALPHA 5.2 扩音机
基于微处理器MCF5307定时器实现嵌入式系统驱动程序的开发设计
新能源汽车百花齐放,无线充电却是明显的痛点
英特尔最新FPGA芯片有哪些黑科技
尼康新机D820曝光:翻转屏/双卡槽/4600万像素
虹科案例 | 如何以最少的软件配置和干预来调查和监控关键系统上的CANopen数据?
BMP280气压传感器的制作
新技术可以让互动反馈在现实与虚拟之间传递
磁簧开关工作原理_磁簧开关的作用