【SystemVerilog】数据类型(3)数组的方法

news/2024/5/19 17:25:47 标签: systemverilog, 数字IC

   

目录

一、数组缩减方法

二、数组定位方法

三、数组排序方法


             SV提供了很多数组的方法,可用于任何一种非合并的数组类型,包括定宽数组、动态数组、队列和关联数组。这些方法有繁有简,简单的如求当前数组的大小,复杂的如对数组排序。如果不带参数,则方法中的圆括号可以省略。

一、数组缩减方法

数组的缩减方法是将一个数组缩减为一个值。

方法名

描述

sum

数组求和

product

and

or

xor

异或

        最常用的是sum,对数组所有元素求和,但是必须注意的是SV对位宽的处理。如果是单比特数组求和,那么其和也是单比特的,但是如果使用该“求和”参与32bit的表达式运算,那么SV在数组求和的过程中使用32bit位宽。(此处为绿皮书的描述,经博主仿真验证,此处有误,运行结果仍为单比特数据。)

举个栗子:

bit aa[10];

int total;

initial begin

    foreach(aa[j])
        aa[j] = j;

    foreach(bb[j])
        bb[j] = j;

    $display("1:aa.sum=%0d",aa.sum);
    $display("2:aa.sum=%0d",aa.sum+32'd0);

    total = aa.sum;
    $display("3:total=%0d",total);
    $display("4:bb.sum=%0d",bb.sum);

    total = bb.sum;
    $display("5:total=%0d",total);

运行结果如下:

 

可知,数组缩减方法的结果与数组具有相同的位宽。所以在使用缩减方法的时候要注意这一点。

二、数组定位方法

        使用数组定位方法可以快速找到数组中的某个元素,但是需要注意的是:数组定位方法返回的是一个队列,而不是标量。

方法名

描述

max

找出最大值

min

找出最小值

unique

找出唯一值的元素

find

find有多种使用方式

如:find (x) with ( x == 4)

find_index with(item > 4)

找出数组元素大于4的索引号

find_first_index with(item == 4)

找出第一个数组元素等于4的索引号

find_last with

find_last_index with

...

举个栗子:

int f[6] = '{1,3,4,6,7,9};
int d[]  = '{2,3,5,8,12};
int q[$] = {1,3,5,7};
int tq[$];

tq = q.min();
$display("1:tq=%0p",tq); //{1}

tq = d.max();
$display("2:tq=%0p",tq); //{12}

tq = f.unique();
$display("3:tq=%0p",tq); //{1,3,4,6,7,9}

tq = d.find_index with(item == 8);
$display("4:tq=%0p",tq); //{3}

tq = d.find with(item > 2);
$display("5:tq=%0p",tq); //{3,5,8,12}

运行结果如下:

 

        在with语句中,item被称为重复参数,它代表了数组中的一个单独元素。item是缺省的名字,也可以使用其他的名字,只要在数组的参数列表中列出来即可,如下所示,几条语句是等效的:

右侧4个条件语句是等同

tq = d.find_first with(item == 4);

tq = d.find_first() with(item == 4);

tq = d.find_first(item) with(item == 4);

tq = d.find_first(x) with(x == 4);

数组定位方法与条件语句with结合使用又是怎样的呢?

如:

total = d.sum with (item >7);

绿皮书说的是返回条件表达式为真的次数,即元素大于7的个数,为什么运行结果跟其描述又不一致,醉了醉了。先挖个坑。

三、数组排序方法

SV有几个可以改变数组中元素顺序的方法,如下所示:

方法名

描述

reverse

倒序

sort

从小到大排序

rsort

从大到小排序

shuffle

随机排序

注:

  1. 数组定位方法是新建了一个队列来保存结果,而排序方法则是改变了原数组。
  2. shuffle、reverse方法不能带with条件语句,作用范围是整个数组。
  3. sort、rsort方法可以带with条件语句,进行范围内排序。

举个栗子:

int d[] = '{2,3,5,8,7,7,12};

d.reverse();
$display("1:d[]=%0p",d);

d.sort();
$display("2:d[]=%0p",d);

d.rsort();
$display("3:d[]=%0p",d);

d.shuffle();
$display("4:d[]=%0p",d);

运行结果如下:

 

PS :书上内容也不能尽信啊!实践出真理!


http://www.niftyadmin.cn/n/1076117.html

相关文章

localStorage新手必看不容错过

1先看一个留言板的小例子 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Document</title></head> <body><fieldset><legend>留言板</legend><textarea name…

【SystemVerilog】数据类型(4)队列、枚举

本篇文章对SV的其他数据类型进行介绍。包括&#xff1a;链表、队列、枚举、typedef重定义、用户自定义、常量、字符串。 目录 一、队列 二、枚举 三、字符串 四、其他 一、队列 SV 引进了一种新的数据类型——队列&#xff0c;它结合了链表和数组的优点。队列与链表相似&am…

mybatis generator 生成javabean自定义类型转换

因为默认mybatis generator自动生成的&#xff0c;带小数的都转成了bigdecimal了&#xff0c;而且长度不同的整数转成了不同的类型。 但是我想要带小数的转成double&#xff0c;整数转成integer。 所有自定义类型转换 代码如下&#xff1a; /** Copyright 2005 The Apache Sof…

【SystemVerilog】SV对设计意图的细化always和unique/priority

always、always_comb、always_latch、always_ff&#xff1b; unique /priority case &#xff1b; unique /priority if...else &#xff1b; 一、SV中的always 在Verilog中&#xff0c;设计组合逻辑和时序逻辑时&#xff0c;都要用到always&#xff1a; always (*)begin…

建造者模式——笔记

建造者模式 概念 将一个复杂对象的构建层与其表示层相互分离&#xff0c;同样的构造过程可以采用不同的表示。使用及与工厂模式的区别 比如说我们在网站上给别人推送一些简历的时候&#xff0c;我们就需要隐藏一些求职者的信息来获取利益&#xff0c;这时我们就需要抽象提取应聘…

第4章 用position定位方法实现自适应效果的三列布局

第4章 用position定位方法实现自适应效果的三列布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>第4章 用position定位方法实现自适应效果的三列布局</title><style type"text/css&…

PE文件格式分析

void pe_print(){ IMAGE_DOS_HEADER myDosHeader; IMAGE_FILE_HEADER myFileHeader; int nSectionCount;//PE文件ection数目 LONG e_lfanew;//为DOS头部的偏移 FILE *fp; if(fpfopen("e:\\1000.exe","rb")) //打开一个文件 { …

Google kickstart 2017 Round A

Problem A. Square Counting 数由格点组成的所有正方形个数&#xff0c; 正方形的边可以不和坐标轴平行。 对于每个由个点组成的正方形&#xff0c;存在一个最小的格点正方形&#xff0c;这个正方形的边平行于坐标轴。 考虑边长为k的平行于坐标轴的格点正方形&#xff0c;它正好…