System verilog【1】基础语法和数据类型+容器+结构体+不可综合的数据类型

news2025/1/12 5:54:55

前言

某种事情是不可能重新复原的,只能向前推进……不管什么地方,两人能去哪里就去哪里好了——《国境以南太阳以西》


         \;\\\;\\\;

目录

    • 前言
    • 内建数据类型
      • reg和wire和logic
      • logic和bit
      • 四值和二值类型
      • 位宽
      • 类型转换
      • 隐式转换
    • 常见数据类型
      • 定宽数组
      • 动态数组
      • packed数组与unpacked数组
    • for与foreach
    • 容器
      • 队列
      • 关联数组
    • 结构体
    • 枚举
    • 不可综合(synthesis)的数据类型

内建数据类型

reg和wire和logic

reg               寄存器,由always块驱动

wire              线网,只能用assign语句赋值

logic             sv较verilog新引入的类型,方便验证人员驱动与
				  连接硬件模块,不用讨论用reg还是wire
				  四值逻辑

         \;\\\;\\\;

logic和bit

logic贴近硬件,bit贴近软件。

logic            0   1   X(不确定,其他正数)   Z(高阻,没被驱动)
bit              0   1

         \;\\\;\\\;

四值和二值类型

四值逻辑类型(默认为x):
	integer        (32bit,默认有符号)
	logic
	reg
	wire
	time           (64bit)

二值逻辑类型(默认为0):
	byte           (默认有符号)
	shortint       (默认有符号)
	int            (默认有符号)
	longint        (默认有符号)
	bit

有符号 的意思是有负数,即二进制格式中第一位为1,那么就是负数。

有无符合可以通过signedunsigned关键字设置。

         \;\\\;\\\;

位宽

  • reg、logic、bit只有1位
  • byte是8位
  • shortint是16位
  • int、integer是32位
  • longint是64位

         \;\\\;\\\;

类型转换

如果左右运算的类型不一致,需要先转换再计算(安全性)。

module yishijun;
    //sv语法练习    
    
    byte activate=8'b1000_0000;//#8位,有符号
    bit [8:0] result;//#9位,无符号
    initial begin

        //#有符号8位扩展成9位,高位补一:1_1000_0000
        result=activate;
        $display("@1 result='h%x?",result);//#@1 result='h180?

        //#无符号8位扩展成9位,高位补零:0_1000_0000
        result=unsigned'(activate);
        $display("@2 result='h%x?",result);//#@2 result='h080?
    end

endmodule
  • unsigned '() 是静态转换,在编译时就能完成检查。
  • $cast(dst,src) 是动态转换

         \;\\\;\\\;

隐式转换

module yishijun;
    
    logic [3:0] x='b111x;
    bit [2:0] y;
    initial begin
        $display("x='b%b",x); //#x='b111x
        y=x;
        $display("y='b%b",y); //#y='b110
    end

endmodule
  • 转换过程是右对齐的,多余位被删除。
  • X转化bit时只会为0

         \;\\\;\\\;

常见数据类型

定宽数组

默认顺序是从0到N-1

数组赋值的时候禁止在{ }内添加default

//0->4
int a[5]='{4,3,2,1,0};           
int b[0:4];
b='{3,4,5,6,7};
b='{5{0}};             //#0 0 0 0 0


//5X3
int a[5][3];       
int a[0:4][0:2];    
int [0:2] a[0:4];
module yishijun;
    
    int b[5];
    initial begin
       b='{5{0}};  
       $display("%p",b);           
       b[0:2]='{1,0,3};
       $display("%p",b);
       //#b='{1,0,3,default:-1}; //无论如何都运行不了
       //#$display("%p",b);
    end

endmodule

         \;\\\;\\\;

动态数组

  • 动态数组刚声明的时候是空的!

  • =可以做复制

module yishijun;
    
   
    int a[],b[]; //#声明动态数组
    initial begin
        //#申请空间
        a=new[3];
        //#初始化
        foreach(a[i])
            a[i]=i;
        //#复制
        b=a;

        //#
        b[0:2]='{3,2,1};
        $display(a[0],a[1],a[2]);//# 0 1 2
        $display(b[0],b[1],b[2]);//# 3 2 1


        //#申请并复制
        a=new[2](a);
        $display(a[0],a[1]);//# 0 1

        //#删除
        a.delete();

    end

endmodule
module yishijun;
    
   
    initial begin
        int a[]='{1,2,3,4,5};
        int b[]=a;
        a=new[3];//#原本的空间'{1,2,3,4,5}消失了,b复制的数据放在b申请的空间内
        foreach(a[i])
            a[i]=i;


        $display(a[0],a[1],a[2]);           //# 0 1 2
        $display(b[0],b[1],b[2],b[3],b[4]); //# 1 2 3 4 5  
    end

endmodule

         \;\\\;\\\;

packed数组与unpacked数组

如果总线为16位,那么16bit=1word
如果总线为24位,那么24bit=1word
如果总线为32位,那么32bit=1word
如果总线为64位,那么64bit=1word

logic a_pack[3][8];        //3,列8,连续24X2=48=2word
logic [2:0][7:0] a1_pack;  //3,列8,连续24X2=48=2word
logic [7:0] b_unpack[3];   //3,列8,但是每行之间不连续,单行8X2=16-> 1word,33个word

在这里插入图片描述

         \;\\\;\\\;

for与foreach

module yishijun;
    
    
    initial begin
        bit [31:0] a[5],b[5];
        for(int i=0;i<$size(a);i++)
            a[i]=i;
        //#不要end
        $display(a[0],a[1],a[2],a[3],a[4]);
        //#  0   1   2   3   4   

        foreach(b[j])
            b[j]=a[j] * 2;
        //#不要end
        $display(b[0],b[1],b[2],b[3],b[4]);
        //#  0   2   4   6   8   

    end

endmodule

         \;\\\;\\\;

容器

队列

  • 用[$]声明队列
module yishijun;
    
    int j=1;
    //#队列不用'{}
    int a[$]={3,4};
    int b[$]={0,2,5};
    int c[$];

    initial begin
        b.insert(1,j);   //0 1 2 5
        //b.insert(3,a); //不能把队列插入队列
        b.delete(0);     //1 2 5
        $display(b);     //1 2 5

        $display(b.size);//3

        b.push_front(99);
        b.push_back(-99);
        $display(b);     //99 1 2 5 -99

        b.pop_front();
        b.pop_back();
        $display(b);     //1 2 5

        //队列复制,不能在用的时候定义,要在开头定义
        c=b;
        b={a[0:1],b[1:$]}; //正确的队列插入
        $display(c);     //1 2 5


        foreach(b[i])
            $display(b[i]);
            //3
            //4
            //2
            //5
        
        
        $display("last element is %p",b[$]);                   //last element is 5
        $display("sum of b is %p",b.sum);                      //sum of b is 14
        $display("product of b's elements is %p",b.product);   //product of b's elements is 120
        $display("max of b is %p",b.max);                      //max of b is '{5}
        $display("min of b is %p",b.min);                      //min of b is '{2}
        $display("unique elements of b was %p",b.unique);      //unique elements of b was '{2,3,4,5}


        
        b.reverse();  //颠倒
        $display(b);  
        //5 2 4 3

        b.sort();     //排序小到大
        $display(b);
        //2 3 4 5

        b.rsort();    //排序大到小
        $display(b);
        //5 4 3 2

        b.shuffle();  //重新打乱
        $display(b);
        //4 5 2 3

        c.delete();
        b.delete();
        a.delete();

    end

endmodule

         \;\\\;\\\;

关联数组

用来保存稀疏矩阵的元素,即只为实际写入的元素分配空间;这种方法所需的内存比定宽动态数组所占用的小

类似哈希表

module chertanis;


    
    initial begin
      
        bit [63:0] arr[int] , key=1;


        //初始化稀疏分布的元素
        repeat (64) begin
            arr[key]=key;
            key=key<<1; //X2
        end

        //打印看看
        foreach (arr[i])
            $display("arr[%h]=%h",i,arr[i]);


        if(arr.first(key)) begin //first
            do
                $display("arr[%h]=%h",key,arr[key]);
            while(arr.next(key)); //next
        end 

        //删除第一个元素
        arr.first(key);//first
        arr.delete(key);//delete

    end
endmodule
# arr[80000000]=0000000080000000
# arr[00000000]=8000000000000000
# arr[00000001]=0000000000000001
# arr[00000002]=0000000000000002
# arr[00000004]=0000000000000004
# arr[00000008]=0000000000000008
# arr[00000010]=0000000000000010
# arr[00000020]=0000000000000020
# arr[00000040]=0000000000000040
# arr[00000080]=0000000000000080
# arr[00000100]=0000000000000100
# arr[00000200]=0000000000000200
# arr[00000400]=0000000000000400
# arr[00000800]=0000000000000800
# arr[00001000]=0000000000001000
# arr[00002000]=0000000000002000
# arr[00004000]=0000000000004000
# arr[00008000]=0000000000008000
# arr[00010000]=0000000000010000
# arr[00020000]=0000000000020000
# arr[00040000]=0000000000040000
# arr[00080000]=0000000000080000
# arr[00100000]=0000000000100000
# arr[00200000]=0000000000200000
# arr[00400000]=0000000000400000
# arr[00800000]=0000000000800000
# arr[01000000]=0000000001000000
# arr[02000000]=0000000002000000
# arr[04000000]=0000000004000000
# arr[08000000]=0000000008000000
# arr[10000000]=0000000010000000
# arr[20000000]=0000000020000000
# arr[40000000]=0000000040000000
# arr[0000000080000000]=0000000080000000
# arr[0000000000000000]=8000000000000000
# arr[0000000000000001]=0000000000000001
# arr[0000000000000002]=0000000000000002
# arr[0000000000000004]=0000000000000004
# arr[0000000000000008]=0000000000000008
# arr[0000000000000010]=0000000000000010
# arr[0000000000000020]=0000000000000020
# arr[0000000000000040]=0000000000000040
# arr[0000000000000080]=0000000000000080
# arr[0000000000000100]=0000000000000100
# arr[0000000000000200]=0000000000000200
# arr[0000000000000400]=0000000000000400
# arr[0000000000000800]=0000000000000800
# arr[0000000000001000]=0000000000001000
# arr[0000000000002000]=0000000000002000
# arr[0000000000004000]=0000000000004000
# arr[0000000000008000]=0000000000008000
# arr[0000000000010000]=0000000000010000
# arr[0000000000020000]=0000000000020000
# arr[0000000000040000]=0000000000040000
# arr[0000000000080000]=0000000000080000
# arr[0000000000100000]=0000000000100000
# arr[0000000000200000]=0000000000200000
# arr[0000000000400000]=0000000000400000
# arr[0000000000800000]=0000000000800000
# arr[0000000001000000]=0000000001000000
# arr[0000000002000000]=0000000002000000
# arr[0000000004000000]=0000000004000000
# arr[0000000008000000]=0000000008000000
# arr[0000000010000000]=0000000010000000
# arr[0000000020000000]=0000000020000000
# arr[0000000040000000]=0000000040000000

         \;\\\;\\\;

结构体

struct只是一个数据的集合

module chertanis;


   
    initial begin
      
      //#struct { bit [7:0] r, g,b;}pixel;  
      //#简化结构体的变量声明
      typedef struct { bit [7:0] r,g,b;}pixel2;

      pixel2 a = '{'h10,'h10,'h10};

      $display(a.r,a.g,a.b); // 16 16 16
       
    end
endmodule

         \;\\\;\\\;

枚举

module chertanis;


   
    initial begin
      
        typedef enum {INIT,DECODE,IDLE} state_t;
        state_t a,b;

        case (a)
            INIT: b = INIT;
            IDLE: b=DECODE;
            default: b=IDLE;
        endcase
     
        //#打印状态名
        $display("state is %s",b.name());  //# state is INIT
    end
endmodule

         \;\\\;\\\;

不可综合(synthesis)的数据类型

  • real :双精度浮点double
  • shortreal:单精度浮点float
  • time:具有timeunit和timeprecision属性的64位无符号4态变量
  • realtime:和real一样
  • string:可存储8位ASCII字符字符串的字节类型的动态大小数组(字符串char数组)

   \;

  • event:存储仿真同步对象句柄的指针变量
  • class handle:存储类对象句柄的指针变量(声明类型是类的名称,而不是关键字类)
  • chandle:一个指针变量,用于存储从SystemVerilog直接编程接口(DPI,Direct Programming Interface)传递到仿真中的指针
  • virtual interface: 存储接口端口句柄的指针变量(interface关键字是可选的)

         \;\\\;\\\;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/489413.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在Transformer模块上用CNN网络搭建方式解决图像分类问题

来源&#xff1a;投稿 作者&#xff1a;摩卡 编辑&#xff1a;学姐 论文标题&#xff1a;DeepViT: Towards Deeper Vision Transformer Motivation 本文受到传统CNN网络搭建方式的启发(深层的CNN网络可以学习到关于图像更加丰富和复杂的表示), 于是思考是否可以将这种搭建方式…

我的“测试开发”成长之路

我相信&#xff0c;有很多测试人员会不断问自己&#xff0c;自己到底要不要坚持做测试&#xff0c;测试的职业发展到底怎么样&#xff1f;如果你还在迷茫&#xff0c;在到处找各种大牛问类似的问题&#xff0c;我希望这篇文章&#xff0c;你看完能够结束你的这个烦恼&#xff0…

Sketch会不会出windows版本?

Sketch会不会出windows版本&#xff1f;Sketch 可以在线编辑吗&#xff1f;先说结论&#xff0c;不能。 但有一个更好用易用的 Windows 也能用的「协作版 Sketch」&#xff0c;最大的特点3个&#xff1a;在线、免费、Windows也能用&#xff01; Windows 也能用的「协作版 Ske…

JavaScript全解析——canvas 入门(上)

●canvas 是 HTML5 新增的一个标签, 表示画布 ●canvas 也是 h5 的画布技术, 我们通过代码的方式在画布上描绘一个图像 canvas 标签 ●向进行 canvas 绘图, 首先我们先要了解到 canvas 标签 ●是 html5 推出的一个标签 <html> <head>... </head> <body&…

mysql详细教程

目录 1、初识数据库 1.1、什么是数据库 1.2、数据库分类 1.3、相关概念 1.4、MySQL及其安装 1.5、基本命令 2、操作数据库 2.1、操作数据库 2.2、数据库的列类型 2.3、数据库的字段属性 2.4、创建数据库表 2.5、数据库存储引擎 2.6、修改数据库 3、MySQL数据管理…

基于numpy的鸢尾花数据获取、处理等操作。

这是搬运的。 Python 3 可信的 FileEditViewInsertCellKernelHelp 运行 代码标记原生 NBConvert标题- 《基于numpy的鸢尾花数据操作》 一、 实验准备 1.1 实验概述 我们本次实验将会使用的编程语言是Python&#xff0c;在本次实验当中我们将会使用结合我们学习过的numpy 中的知…

SPSS如何进行判别分析之案例实训?

文章目录 0.引言1.一般判别分析2.逐步判别分析3.决策树分析 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对SPSS进行了学习&#xff0c;本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结&#xff0c;本文对判别分析进行阐述。 1…

Mysql Sql 优化之 Explain

在开发中&#xff0c;往往遇到一些慢查询语句&#xff0c; 我们需要对慢查询进行优化。Explain工具就是用来分析某个慢查询执行情况的工具。通过在select 语句前加上explain 关键字&#xff0c;然后执行就会得到某个sql 执行计划信息&#xff0c;通过分析执行计划&#xff0c;我…

JavaWeb:JavaScript 教程 笔记

1 JavaScript html完成了架子&#xff0c;css做了美化&#xff0c;但是网页是死的&#xff0c;我们需要给他注入灵魂&#xff0c;所以接下来我们需要学习JavaScript&#xff0c;这门语言会让我们的页面能够和用户进行交互。 1.1 介绍 通过代码/js效果演示提供资料进行效果演…

SettingsProvider单编生效

SettingsProvider单编生效 1、单编SettingProvider, make SettingsProvider&#xff0c;会生成apk&#xff0c;apk的路径为&#xff1a; product/qssi/system/priv-app/SettingsProvider/2、将手机恢复出厂设置&#xff0c;在过google向导之前 3、删除SettingProvider对应的…

【Redis】Redis分布式锁的10个坑

文章目录 前言1. 非原子操作&#xff08;setnx expire&#xff09;2.被别的客户端请求覆盖&#xff08; setnx value为过期时间&#xff09;3. 忘记设置过期时间4. 业务处理完&#xff0c;忘记释放锁5. B的锁被A给释放了6. 释放锁时&#xff0c;不是原子性7. 锁过期释放&…

复杂系统层级原理与模型驱动软件体系结构

最近看到模型驱动在国内渐渐被更多的人注意&#xff0c;前几天又看到一些关于UML优劣和应用方面的争论。作为繁忙工作中的一种休息&#xff0c;从过往的研究笔记中整理一点东西放在这里&#xff0c;与大家交流。 层级理论是构建复杂软件体系的基本原则 诺贝尔奖获得者赫伯特 A.…

RocketMQ第三节(生产者和消费者)

目录 1&#xff1a;生产者&#xff08;同步、异步、单向&#xff09; 1.1&#xff1a;同步发送消息&#xff08;每发送一条等待mq返回值&#xff09; 1.2&#xff1a;异步发送消息 1.3&#xff1a;单向发送消息&#xff08;不管成功失败&#xff0c;只管发送消息&#xff09…

学会以下几点,拍出人像大片很简单

很多人拍照&#xff0c;都是用手机拍的&#xff0c;虽然手机的摄影功能并没有相机那么齐全&#xff0c;但我们依然可以借助一些技巧拍出美美的照片&#xff0c;下面是为大家整理出了一份手机拍照指南&#xff0c;拍出人像大片很简单。 1、捕捉光影 光影是拍照的重要元素之一&…

【Unity编辑器】拓展Inspector视图

目录 1、拓展源生组件 2、拓展继承组件 3、组件不可编辑 4、Context菜单 1、拓展源生组件 摄像机就是典型的源生组件。它的局限性就是拓展组件只能加在源生组件的最上面或者最下面&#xff0c;不能插在中间&#xff0c;不过这样也就够了 using UnityEngine; using UnityEd…

接口测试之Jmeter+Ant+Jenkins接口自动化测试平台

目录 平台简介 环境准备 Jenkins简介 下载与安装 平台搭建 依赖文件配置 build.xml配置 Ant构建 阿里大佬倾情演绎&#xff0c;3天让你学会Jmeter接口测试&#xff0c;学不会算我输_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Q84y1K7bK/?spm_id_from333.99…

如何设置渗透测试实验室

导语&#xff1a;在本文中&#xff0c;我将介绍设置渗透实验室的最快方法。在开始下载和安装之前&#xff0c;必须确保你使用的计算机符合某些渗透测试的要求&#xff0c;这可以确保你可以一次运行多个虚拟机而不会出现任何问题。 在本文中&#xff0c;我将介绍设置渗透实验室的…

Python | 人脸识别系统 — 用户操作

本博客为人脸识别系统的摄像头画面展示代码解释 人脸识别系统博客汇总&#xff1a;人脸识别系统-博客索引 项目GitHub地址&#xff1a; 注意&#xff1a;阅读本博客前请先参考以下博客 工具安装、环境配置&#xff1a;人脸识别系统-简介 UI界面设计&#xff1a;人脸识别系统-UI…

错题汇总03

1.以下对二维数组a进行正确初始化的语句是 A int a[2][]{{0,1,2},{3,4,5}} B int a[][3]{{0,1,2},{3,4,5}} C int a[2][4]{{0,1,2},{3,4},{5}}; D int a[][3]{{0,,2},{},{3,4,5}} A数组列不能省略 C数组越界 D数组初始化每一行必须连续初始化 2.能把函数处理结果的二个数据…

msvcr110.dll丢失的解决方法-计算机中丢失msvcr110.dll怎么办?

看到您遇到了msvcr110.dll丢失的问题&#xff0c;这是由于您的计算机缺少必要的系统文件导致的。为了解决这个问题&#xff0c;您可以尝试以下几个步骤方法&#xff1a;就可以轻松解决msvcr110.dll丢失的问题。 msvcr110.dll修复方法一 重新安装Microsoft Visual C msvcr110.d…