数据类型 | Systemverilog 笔记 2

Posted by Kion on January 19, 2020

数据类型概述:

  1. Integer

    有四状态和双状态整数型。

    四状态 双状态
    logic;reg;wire;integer;time shortint;int;longint;byte;bit
  2. String

    可保存长度可变的字符串,单个字符是byte类型。常用字符串方法

  3. event

    event evt;/*声明evt事件*/
    -> evt;/*触发evt*/
    @(evt)/*捕获evt触发*/
    
  4. Typedef

    用户自定义类型

  5. Enumerations

    enum {RED,BLUE,GREEN} color;/*包含常量名称列表以及一个或多个变量*/
    /*常用函数*/
    enum_e.first,last,next,next(N),prev,prev(N)
    /*通常用do...while遍历*/
    do
        ...
    while (enmu_e!=enum_e.first)
    
  6. 定宽数组

    /*操作数组常用for和foreach*/
    for (int i=0;i<$size(array);i++) /*$size函数可以返回数组宽度*/
    foreach (array[i,j]) /*注意索引方式*/
    foreach (array[i])
    foreach (array[,j]) /*可以独立遍历维度*/
       
    bit a[5] = '{1,2,3,4,5};/*赋值方式*/
    /*两个数组可以直接进行相等比较*/
    /*合并数组的声明*/
    bit[3:0][7:0] bytes;/*4个字节组装成32比特*/
    
  7. 动态数组

    int dyn[],d2[];/*声明动态数组*/
    dyn=new[5];/*分配5个元素*/
    d2=dyn;/*复制动态数组*/
    dyn=new[20](dyn)/*分配20个整数值并复制原先的5个元素到相应位置*/
    dyn=new[40]/*分配40个新的整数值,舍弃原先的20个元素*/
    dyn.delete()/*删除所有元素*/
    
  8. 队列

    结合链表与数组,可以随地增删元素,可以索引访问。利用[$]进行声明。

    q[$]={3,4};/*声明队列*/
    int j=1;
    q.insert(1,j);/*第一个元素后插入j*/
    q.delete(1);/*删除第一个元素*/
    q=q[0:$-1];/*删掉末尾元素,$表示最大最小的索引,依位置而定*/
    q.push_front(6);/*开头插入6*/
    q={6,q};
    j=q.pop_back;/*末尾值赋予j*/
    q.push_back(8);/*末尾插入8*/
    q.delete();/*删除整个队列*/
    q={};
    
  9. 关联数组

    可以方便得存储稀疏矩阵的元素,只为实际写入的元素分配空间。保存关联数组时,同时保存其索引。利用索引获取元素,索引不一定是数值,可以是字符串。有点类似Python里的字典。

    bit [63:0] assoc[bit[63:0]],idx=1;/*声明关联数组assoc,索引为bit*/
    repeat (64) begin
        assoc[idx] = idx;
        idx = idx << 1;/*为数组中1,2,4,...等索引位置赋值*/
    end
    /*可以使用foreach遍历数组*/
    foreach(assoc[i])
        $display("assoc[%h]=%h",i,assoc[i]);
    /*找到并删除第一个元素*/
    assoc.first(idx);
    assoc.delete(idx);
    
  10. 数组的方法

    /*缩减方法*/
    array.sum()
    array.product,and,or,xor
    /*随机取一个元素*/
    $urandom_range($size(array)-1)
    /*数组定位方法,这种方式返回的是一个队列,而非标量*/
    array.min,max,unique
    /*数组搜索*/
    array.find with(item>3)
    array.find(x) with(x>3)/*也可以自定义参数*/
    array.find_first with (item==4)
    array.find_first_index with (item==8)
    /*数组的排序,会改变原有数组*/
    array.reverse,sort,rsort,shuffle
    
  11. 结构与联合

    与C语言类似,结构是数据的集合,数据存放在不同位置;联合中的数据共用一个位置,互相覆盖。

  12. 类型转换

    a. 静态转换

    reala=real'(intb)

    b. 动态转换 $cast(a,b);将b赋值给a,成功则返回1,否则返回0

    c. 流操作符 « »

    /*把其后的数据打包成比特流,<<为从右到左,>>从左到右*/
    bit [7:0] j[4]='{8'ha,8'hb,8'hc,8'hd};
    >>{j} /*0a0b0c0d*/
    <<{j} /*b030d050*/
    >>{byte{j}} /*0a,0b,0c,0d 可以拆分赋给新的数组*/
    
  13. 选择数据类型

    a. 灵活性(数据形式)

    b. 存储器用量(数据量)

    c. 速度(数组操作是否频繁)

    d. 排序(一次性存入还是多次存入)

    e. 选择最优的数据结构