SV中的数据类型

摘要:
Verilog-1995中指定的数据类型是:SV将reg类型扩展为逻辑,有符号双状态浮点64位实数$Isunknown()----当操作数中存在X和Z时,$bits(表达式)----返回表达式占用的位宽。默认值为0。许多SV仿真器在存储数据元素时使用32位字边界。

Verilog-1995中规定的数据类型有:变量(reg), 线网(wire), 32位有符号数(integer), 64位无符号数(time), 浮点数(real)。

SV扩展了reg类型为logic,除了reg类型的功能外,可以用在连续赋值,门单元和模块所驱动。但是不能用在双向总线建模,不能有多点驱动。

其他数据类型:无符号双状态  bit,

                    有符号双状态32位   int,

                    有符号双状态8位     byte,                            //可以用内置函数  $isunknown

                    有符号四状态32位   integer,

                    无符号四状态64位   time,

                    有符号双状态浮点64位    real.

$isunknown()----在操作数中存在X、Z时,返回1。

$bits(expression)----返回expression占的位宽。

对于四状态类型的数据,缺省值为X,双状态类型的数据,缺省值是0.

很多SV仿真器在存放数据元素的时候都是使用32bit的字边界。所以byte、shortint、int都是存放在一个字中,longint则存放在两个字中。

对于四状态的数据,SV仿真器通常使用两个连续的字或更多的连续的双字来存放它们的值,所以四状态的变量会消耗双倍的空间。

连续的双字,一个字存放数据的0/1值,另一个字存放x/z状态。

foreach可以进行多维数据的递归调用,foreach(A[i,j])

定宽数组:

        (pack)合并数组:将数组大小的定义放在等式左边            bit [3:0][7:0] bytes;          //4个字节组成一个字,储存空间一个字。

        (unpack)非合并数组:将数组大小的定义放在等式右边         bit [7:0] bytes [4];            //4个字节,这个仍是合并数组,但是4个存储空间不连续,这是非合并数组

    unpacked array会被认为是一个vector,packed array会被认为是一个scalar。

    unpacked array的声明有两种方式:

      1. int array [0:7][0:31];  array delaration using ranges

      2. int array [8][32];        array delaration using size

        当需要和标量进行数据交换时,使用合并数组很方便,而且@操作符的数据只能是标量和合并数组。所以推荐使用合并数组,还节省空间。

        bit [3:0][7:0] barray[3];   //当使用@操作符时,只能使用@(barray[0] or barray[1] or barray[2])不能使用整个barray。

        bit [31:0] src[5] = `{0,1,2,3,4},   dst[5] = `{5,4,3,2,1};                       //数组的直接初始化

        if(src == dst)   $display("src==dst");                                                    //数组可以直接进行整体的比较

        dst = src; src[0] = 5;                                                                           //数组可以直接进行整体的赋值和单个的赋值。

        数组的系统函数sum, min, max, unique, with, reverse, sort, resort, shuffle

        int q[4] = ‘{1,3,5,7}, tq[10];

        tq = q.min();                  //{1}      

        tq = q.max();                   //{7}

        tq = q.unique();                 //{1,3,5,7}

        tq = q.find with (item > 3);          //{5,7}所有大于3的元素,item这里是缺省值,也可以显式的指出。

        tq = q.find with(x) (x > 3);

        tq = q.find_index with (item > 3);    //{2,3}所有大于3的元素的index。

        tq = q.find_first with (item > 99);     //返回第一个大于99的元素,{}无

        tq = q.find_first_index with (item > 6);   //{3}

        tq = q.sum with (item > 6);             //{7}

        tq = q.reverse();                             //{7,5,3,1}

        tq = q.sort();                                  //{1,3,5,7}

        tq = q.resort();                               //{7,5,3,1} 

        tq = q.shuffle();                              //{3,5,1,7} 再随机化一个          

动态数组:声明时使用空[],位宽在编译时不指出,在运行时动态分配。使用前必须用new[]来初始化并分配空间。系统函数size,delete

              int dyn[];

              dyn = new[5];

              dyn = new[20](dyn);   //分配20个空间,并复制原来的5位数据,放在新的20个空间的前五个。

              dyn.delete;        //删除整个数组

              $size(dyn);        //动态数组的个数

队列:在SV中结合了链表和数组的优点,集插入与查询的优点于一体。声明时使用美元符号[$],系统函数insert, delete, push_front, push_back, pop_front,

         pop_back。推荐后边的pop, push操作。

               int q[$] = {0,2,5};        //初始化,不需要‘

               q.insert(1,1);           //{0,1,2,5},在第一个元素之前,插入1

               q.delete(1);             //删除第一个元素,{0,2,5}

               q.push_front(6);      //{6,0,2,5}在队列前插入6

               q.push_back(8);      //{6,0,2,5,8}在队列后插入8

               j = q.pop_front;      //pop出队列的第一个元素,j=6 q={0,2,5,8}

               j = q.pop_back;      //pop出队列的最后一个元素,j=8 q={0,2,5}

关联数组:SV采用树或哈希表的形式来保存,声明时在方括号中放置数据类型,如[int], [bit[8:0]]。

              bit [63:0] assoc[bit[63:0]], idx =1;

              repeat(64)  begin                                   

                                    assoc[idx] = idx;      idx = idx<<1;          //赋值

                                end 

              foreach (assoc[i])     $display ("assoc[%h] =%h", i , assoc[i]);      //用foreach来遍历

              if(assoc.first(idx))    begin

                                                do   $display("assoc[h] = %h",idx,assoc[idx]);       //do...while遍历,first/next

                                                while(assoc.next(idx));

                                            end

              if(assoc.exists(idx) )                            //exists 系统函数

    num()函数和size(),返回哈希的个数,

枚举类型:声明包含一个常量名称列表以及一个或多个变量。系统函数name(),由变量值返回字符串。first(), last(), next(), prev(),

         typedef enum {INIT, DECODE=2, IDLE} fsmtype_e;            //INIT的值为0,IDLE的值为2

         typedef enum {FIRST=1, SECOND, THILD} ordinal_e;    ordinal_e  position;   //枚举类型默认会存储为int类型,缺省值为0,所以FIRST只能是0

         typedef enum {FIRST=0, SECOND, THILD} ordinal_e;   right

         color = color.first;         do    begin

                                                        $display("Color = %d/%s",color,color.name);

                                                        color = color.next;

                                                    end   while(color != color.first);      //枚举遍历 

  num(),返回enum中的个数。

字符串:string类型可以用来保存字符串,单个字符串是byte类型,采用动态分配的储存方式,长度为N的字符串,元素编号0-N-1,结尾不带'

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Windows Server 2012 R2提示 “这可能是由于 CredSSP 加密 Oracle 修正”(转载)Oracle 字符集的查看和修改下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

oracle查询数据中包含字段替换其他内容

有个需求,三个页面类型的表单调用同一个数据表(反馈、计划、汇总三大类),为了区分三大类,我在表单加了反馈类型字段。 计划表单手动维护,反馈表单的时候,自动填充数据(需要查询计划表单维护的数据,反馈类型是计划了,但是现在是做反馈表单) 通过sql的函数replace,实现查询的时候如果是计划的,替换成反馈汉字,这样查询的数据返回表单是反馈类型了,用户维护其...

数据库的日志

数据库都具有事务日志,用于记录所有事务以及每个事务对数据库所做的修改。事务日志是数据库的重要组件,如果系统出现故障,则可能需要使用事务日志将数据库恢复到一致状态。删除或移动事务日志以前,必须完全了解此操作带来的后果。事务日志支持以下操作:    恢复个别的事务。    在 SQL Server 启动时恢复所有未完成的事务。    将还原的数据库、文件、文件...

hive 存储,解析,处理json数据

 hive 处理json数据总体来说有两个方向的路走 1、将json以字符串的方式整个入Hive表,然后通过使用UDF函数解析已经导入到hive中的数据,比如使用LATERAL VIEW json_tuple的方法,获取所需要的列名。 2、在导入之前将json拆成各个字段,导入Hive表的数据是已经解析过得。这将需要使用第三方的SerDe。 测试数据为新浪...

转载 java枚举类型enum的使用 (原文地址:http://blog.csdn.net/wgw335363240/article/details/6359614)

java枚举类型enum的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java中定义的常量值不采用enmu枚举类型,而采用public final static 类型来定义呢?以前我们都是采用这种方式定义的,很少采用enum定义,所以也都没有注意过,面对突入起来的问题,还真有点不太清楚为什么有这样的定义。既然不明白就抽时间研究下吧。 Java中的...

ElementUI的el-select怎样实现下拉多选并实现给下拉框赋值和获取值

场景 要实现的效果如下 官方示例代码实现多选 为el-select设置multiple属性即可启用多选,此时v-model的值为当前选中值所组成的数组。 默认情况下选中值会以 Tag 的形式展现,你也可以设置collapse-tags属性将它们合并为一段文字。 <template> <el-select v-model="valu...

Learning Scrapy笔记(六)- Scrapy处理JSON API和AJAX页面

摘要:介绍了使用Scrapy处理JSON API和AJAX页面的方法 有时候,你会发现你要爬取的页面并不存在HTML源码,譬如,在浏览器打开http://localhost:9312/static/,然后右击空白处,选择“查看网页源代码”,如下所示: 就会发现一片空白 留意到红线处指定了一个名为api.json的文件,于是打开浏览器的调试器中的Netw...