• SystemVerilog学习(2)——数据类型


    一、概述

            和Verilog相比,SV提供了很多改进的数据结构。它们具有如下的优点:

    1. 双状态数据类型:更好的性能,更低的内存消耗
    2. 队列、动态和关联数组:减少内存消耗,自带搜索和分类功能
    3. 类和结构:支持抽象数据结构
    4. 联合和合并结构:允许对同一数据有多种视图(view)
    5. 字符串:支持内建的字符序列
    6. 枚举类型:方便代码编写,增加可读性

    二、数据类型

            Verilog-1995有两种基本的数据类型:变量和线网(net)。它们各自都可以有四种取值:0、1、X、Z。

            RTL代码使用变量来存放组合和时序值。变量可以是单比特或多比特的无符号数(reg[7:0]m),32比特的有符号数(integer),64比特的无符号数(time)或浮点数(real)。若干变量可以被一起存放到定宽数组里。所有的存储都是静态的,意味着所有的变量在整个仿真过程当中都是存活的,子程序(routine)不能通过堆栈来保存形式参数和局部变量。线网可以用来连接设计当中的不同部分,例如门和模块实例。尽管线网有很多种用法,但是大多数设计者还是使用标量或矢量wire来连接各个设计模块的端口。

            SV增加了很多新的数据类型,以便同时帮助设计和验证工程师。我们直接进行一个简单的总结,当我们谈到SV中的数据类型的时候,我们一般进行3个维度的区分:

    • 变量(variable) 或者 线网(wire)
    • 逻辑类型(logic) 或者 双状态数据类型(bit等)
    • 有符号 或者 无符号

    2.1 变量 or 线网

            我们知道在verilog中也有线网(wire)和变量(reg)的区分,并且在verilog中wire类型只能通过连续赋值(assign)进行驱动,reg类型只能通过过程赋值(always/inital)进行驱动。

            与verilog像类似,SV中也把线网类型描述成wire,并且也是只能够过连续赋值进行驱动,但是对于变量类型的描述有所不同,SV中对于经典的reg类型进行了改动,改成了variable,缩写为var。其最大的不同就在于它除了作为一个变量之外,还可以被连续赋值,门单元和模块所驱动(最简单的理解:reg不能用assign,但是var可以用assign赋值)。

            到这里可能就会产生一个疑问,既然var这么万能,那我们还保留wire干什么,反正都可以assign,wire似乎显得多此一举了。但是有要求是var类型不可以有多个结构性驱动,例如在对双向总线模型(inout)进行建模的时候。此时,需要使用wire类型,SV会对多个数据来源进行解析并确定最终值。

            默认为var类型(例如只写一个logic(下面马上说),含义就是var logic)。

    2.2 逻辑 或者 双状态数据

            verilog中所有的数据有4种可能的取值类型:0,1,X,Z。其中0,1不用过多的解释,X表示未知,Z表示高阻,也可以理解为没有驱动。但是在实际的硬件上是不存在所谓的X的,对于硬件,其并不存在X,只是我们无法获知其到底是什么状态,所以引入了X来对硬件进行建模。

            在SV中,数据类型被分成了两种,逻辑logic类型(四值逻辑)和双状态数据类型(二值逻辑)。对于logic来说,其可能的取值与verilog一致,也是上述的4种,但是为了更有利提高仿真器的性能并减少内存的使用量,SV引入了双状态数据类型,最简单的双状态数据类型是bit,它是无符号的,另外四种带符号的双状态数据类型是 byte,shortint,int 和 longint。

    2.3 有符号 和 无符号

             没啥好说的:

    三、补充说明 

    1. 四值逻辑变量例如reg、logic或者integer等,在仿真开始时的初值为X
    2. 二值逻辑变量例如bit等,在仿真开始时的初值为0
    3. 如果在四值逻辑与二值逻辑的数据类型之间发生默认转换,那么Z和X值将转换为0。
    4. 二值逻辑也可以用来实现可综合电路,只是二值逻辑由于没有 X 和 Z 值,因此对于硬件的描述会产生偏差,可能会出现仿真行为同综合电路结果不一致的情况。
    5. SV添加void类型来表示空类型,经常用在函数定义时表示不会返回数值,同C语言的void使用方法
    6. SV添加shortreal表示32位单精度浮点类型,同C语言的float;而Verilog的real类型表示双精度浮点类型,同C语言的double。

  • 相关阅读:
    继承-学习2
    采用arm-none-eabi-gcc交叉编译工具链 以及使用xmake构建 STM32 RT-Thread nano工程 笔记
    『Java安全』XStream 1.4.13反序列化漏洞CVE-2020-26217复现与浅析
    针对支付宝-当面付实现的个人支付
    CUDA 高性能计算面试问题总结
    sqlmap直接嗦 dnslog注入 sqllibs第8关
    【Gazebo入门教程】第一讲 Gazebo的安装、UI界面、SDF文件介绍
    【elasticsearch】使用自建证书搭建elasticsearch8.0.1集群
    【LeetCode】链表题解汇总
    Springboot之nacos注册中心
  • 原文地址:https://blog.csdn.net/apple_53311083/article/details/133954778