| ||
2.1内建数据类型
logic拥有的功能:变量所有功能(reg,integer,time,real),被连续赋值(assign语句中),被门驱动(直接使用not()等),被模块驱动(直接调用模块)。注:只能有一个驱动。
数据类型:bit,int,shortint,longint,byte,integer,time,real。
2.2定宽数组
声明时可以只给出数组宽度。多维数组声明时同样可以只给出数组宽度。
从越界地址读数时会返回数组元素类型的缺省值。
使用单引号加大括号来初始化数组。初始化多维数组。
foreach数组和多维数组的格式。遍历二维数组的一个维度。
数组的复制和比较可采用聚合操作,而算数运算和逻辑操作不能采用聚合操作。
Verilog-2001和sv均可同时使用位下标和数组下标。
合并数组的声明与使用方法,合并/非合并混合数组的声明与使用方法。任何数组类型都可以合并,包括动态数组、队列、关联数组、定宽数组。需要等待数组的变化时(@),为了方便建议使用合并数组。
2.3动态数组
动态数组声明、初始化、分配空间、分配空间同时复制,有了数据之后重新分配空间将会删除原来的数据。可将定宽数组复制给一个动态数组。
2.4队列
声明,不要对队列使用new[],初始化与定宽数组和动态数组不同。操作有:insert、delete、push_front、push_back、pop_front、pop_back。上述操作还有一种新的方法可以实现。$在下标串联时的用法。
当然可将定宽数组和动态数组复制给队列。
2.5关联数组
声明、初始化和使用。和hash类似,关联数组也可以使用字符串作为索引进行寻址。可用exists()来检查元素是否存在。
例2.22有sv读取文件的用法。
2.6链表
建议不使用。
2.7数组的方法 à不适用于合并数组
数组缩减:sum、product、and、or、xor。
利用$urandom_range来随机选取一个元素。$size()(适用于定宽数组、动态数组、队列、关联数组)与.size(适用于动态数组与队列)的适用范围不同。针对关联数组需要逐个访问之前的元素。
数组定位:返回一个队列。数组定位函数有:max、min、unique(采用.function的方式)。with(item关系式)的用法。find相关函数有:find、find_index、find_first、find_last、find_first_index、find_last_index。
数组排序:函数有reverse、sort、rsort、shuffle。其中reverse与shuffle不能带with条件语句。
可使用数组定位方法建立记分板。
2.8选择存储类型
2.9使用typedef创建新的类型(定义一种通用的类型)
约定用户自定义类型带后缀_t。新的数组类型定义。
2.10创建用户自定义结构
struct创建新类型(_s标示)。初始化方式与数组类似。
创建不同类型的联合union(_u标示)。
合并结构struct packed(_p_s标示)。
2.11类型转换
静态转换:转换时指定目标类型,并在需要转换的表达式前加上单引号即可,表达式用括号包围。
动态转换:$cast。
流操作符:《从左向右,》从右向左。用法:{《或者》{单个或者多个数组}}。
2.12枚举类型
enum(_e标示)。
可遍历枚举类型的函数:first、last、next、next(N)、prev、prev(N)。
枚举类型缺省值为双状态int,因此可被赋给其他非枚举变量int。
$cast(a,b):将b赋给a,如果数值越界,不进行赋值,该函数返回0。
2.13常量
2.14字符串
sv中string类型可用来保存长度可变的字符串,单个字符为byte类型。字符串相关的函数:getc(N)、toupper、tolower、putc(M,C)、substr(start,end)。
2.15表达式的位宽