《systemverilog验证》阅读笔记 -- 数据类型

  • 数据类型
    • 內建数据类型
      • logic
      • 双状态四状态
      • 带符号无符号
      • 双精度浮点数
    • 多维数组循环嵌套的例子
      • 合并数组和非合并数组
      • 动态数组
    • 队列
    • 关联数组
    • 链表
    • 数组的方法
      • sumproduct积andorxor
      • minmaxunique
      • findfind_firstfind_lastfind_first_indexfind_last_index
      • sortrsortreverseshuffle
    • 枚举
      • 枚举的方法
        • firstlastnextnextNprepreN
    • string
      • string的方法

数据类型

內建数据类型

logic

绝大多数,都可以用logic替换verilog的reg、wire变量声明。
唯一不适合的,就是inout双向的信号,比如传输门、PAD会出现;这种情况必须声明为wire型。

logic默认值是X;
wire默认值是Z;
建议所有变量,都要有初始值;不确定是否存在的变量,可以利用exists相关命令判断。

双状态、四状态

四状态变量:0、1、x、z
双状态变量:0、1
四状态变量更符合实际芯片的工作情况,针对四状态变量,有$isunknown可以判别是否处于X或者Z,如果是,则返回1。
双状态变量,尽量少用;用的时候,务必了解清楚功能含义。
int和integer不同点,就是,int是四态,integer是双态。

带符号、无符号

最高位是符号位,表明正负。
所以logic[7:0]与byte表示的数据范围是不一样的,分别是0~255;-127~+127

双精度浮点数

real型变量,属于64bit的float。

多维数组、循环嵌套的例子

int ascend[4] = ‘{ 0 1 2 3 };
24页:打印一个多位数组。
这个理解就明白数组的基本概念了。

合并数组和非合并数组

如果操作针对的经常是数组的部分;那么使用非合并数组比较合适。
bit [3:0][7:0] bytes[4]
这是一个合并和非合并混合的数组定义。表示4个数组,内容是4个8bit数据
bit [3:0][7:0] bytes
是非合并数组。[3:0]代表数组索引号。

动态数组

new
delete

队列

队列和数组的表示方法不一样,不需要单引号加大括号。只需要大括号。
systemverilog尽量避免使用列表,相关需求,可以用队列。因为队列更加高效易用。
int q[$] = {0 2 5};
q.insert(下标序号,待插入的内容);
q.delete(下标序号);//没有下标序号,表示整个队列删除
q.push_front
q.push_back
q.pop_front
q.pop_back

关联数组

个人理解:
类似与perl的哈希数组。就是数组的键值(key-value)是成对出现的。可以根据key作为索引号。
另外,systemverilog的key可以是数字,也可以是字符串。
bit [63:0] assoc[bit[31:0]];
其中,key就是bit[31:0];value就是bit[63:0]

链表

systemverilog尽量避免使用列表,相关需求,可以用队列。因为队列更加高效易用。

数组的方法

只有非合并的数组,才提供方法。

sum/product(积)/and/or/xor

注意,sum的数据宽度,默认与数组的数据宽度是一致的。除非特别注明sub的数据宽度。
比如

int total;
bit on[4];
....
total = on.sum;
或者
on.sum with (int '(item));//这个要注意,当with内容是判断语句的话,on.sum是匹配成功的次数之和。这里with的内容,表示on数组的类型转换为int;并且不是判断语句。

min/max/unique

注意,返回值是队列,而不是标量。
即{0}这样的格式。

find/find_first/find_last/find_first_index/find_last_index

返回值是队列,而不是标量。
另外要注意的是,find_index的返回值是队列,而且队列类型是int(四态,而非双态integer)。否则编译报错。
一般与with表达式配合使用。
如:
aaaa= arrayAAAA.find with (item > 3);//item是默认变量名
完整的命令,是
aaaa= arrayAAAA.find(x) with (x > 3);

sort/rsort/reverse/shuffle

sort:从小到大的顺序
rsort:从大到小的顺序
reverse:翻转顺序。注意不能使用with条件语句
shuffle:洗牌,打乱顺序。注意不能使用with条件语句

枚举

typedef enum {INIT,DECODE,IDLE} fsmtype_e;
fsmtype_e pstate,nstate;
枚举变量,默认会认为是int类型;而且枚举值默认从0地址。
所以
typedef enum {INIT,DECODE=1,IDLE} fsmtype_e;//正确
typedef enum {INIT=1,DECODE,IDLE} fsmtype_e;//错误
typedef enum {INIT=0,DECODE=1,IDLE} fsmtype_e;//正确

枚举的方法

first/last/next/next(N)/pre/pre(N)

string

string的方法

getc
putc
toupper
tolower
串接字符串{}
len
substr

你可能感兴趣的:(verilog)