System Verilog

数据类型

​ 数据类型用来定义存储值或者用于线连接的变量

数据类型 位宽 符号
reg 可变 无符号 四态(0, 1, x, z)
wire 可变 无符号 四态(0, 1, x, z)
logic 可变 无符号 四态(0, 1, x, z)
bit 1 无符号 二态(0, 1)
byte 8 有符号 二态(0, 1)
shortint 16 有符号 二态(0, 1)
int 32 有符号 二态(0, 1)
longint 64 有符号 二态(0, 1)
Integer 32 有符号 四态(0, 1, x, z)

​ ⚠️:使用有符号数据类型声明无符号变量,可以加 unsigned; 例如:byte unsigned i

Logic 数据类型只能一对一驱动,

数组

可综合:静态数组

仿真使用:动态数组、队列、关联数组

定宽数组

初始化数组
//非紧凑型数组
bit [31:0] cnt[3:0] = '{ 4, 3, 2, 1 } ; // 使用'{} 对一个元素进行初始化

//紧凑型
bit [31:0] cnt[4] = '{ 4, default:1} ; // 使用'{} 对一个元素进行初始化,  default:1 后面元素都为 1
foreach
foreach(cnt[i]) == for(int i = 0; i<4; i++)  //遍历数组元素,
合并数组
bit [31:0]     cnt1[8];   //非合并数组,8 个 32 位元素
bit [3:0][7:0] cnt2[8];  //合并数组,8 个 4*8 元素 

// cnt1[5][2] 为 1 位数据
// cnt2[5][2] 为 8 位数据。
// cnt2[5][2][4] 为 1 位数据。

动态数组

声明数组
int cnt[] ;  // 使用空的[]
cnt = new[5]; // 使用 new[] 中括号的值来传递数组空间 cnt[4:0]
cnt.delete(); //删除所有元素
常数数组赋值
bit [7:0] cnt[] = '{8'b0000_0000,8'b1111_1111};  // cnt[1:0]

队列

声明
int cnt[$] = {3, 4}; //不需要 ' 来初始化或赋值
  • cnt.push_front(6) 在队列前插入 6;
  • cnt.pop_back. 将队列末尾的数移除并赋给别人;
  • cnt.push_back(6) 在队列末尾插入 6;
  • cnt.pop_front. 将队列末尾的数移除并赋给别人;
  • cnt.insert(1,2) 在 cnt 的第二位前插入 1

​ $ 在等式左边:表示最小值; [$: 2] 即 [0:2]

​ $ 在等式右边:表示最大值; [$: 1] 即 [1:2]

关联数组

声明

​ 需要在中括号里放置数据类型来声明

bit [31:0] cnt[bit[31:0]]; 
  • cnt.first(ides) ; 找到第一个索引
  • cnt.next(ides) ; 找到下一个索引
  • cnt.delete(ides) ; 删除当前索引

数组方法

​ 缩减方法

  • cnt.sum ; 对数组内所有元素进行求和 .product(乘).and(与); .xor (异或).or (或)

​ 定位方法

int cnt1[6] = '{1,2,2,6,6,7};  					//	定宽数组
int cnt2[] = '{1,2,2,6,6,7};	 					// 	动态数组
int cnt3[$] = '{1,2,2,6,6,7}, tq[$];	 	// 	队列

tq = cnt1.min();  // 最小值 {1}
tq = cnt2.max();	//最大值 {7}	
tq = cnt3.unique(); //唯一值 {1,2,6,7}
tq = cnt1.find with(item > 3); // 找到元素中大于 3 的所有元素 {6,6,7}

tq = cnt1.find_first_index with(item == 1); // 第一个找到元素为 1 的索引 [0]
tq = cnt1.find_last_index with(item == 1); // 最后找到元素为 1 的索引 [0]

​ **with为条件语句 ** ,with (item >3) 为元素中大于 3 的元素。

​ 其中,也可以将缩减方法与 with 条件语句结合

​ 排序方法

  • sort() 从小到大rsort() 从大到小reverse() 倒序shuffle() 从小到大

    其中,reverse 和 shuffle 不能和 with 条件语句结合使用

自定义类型

  • typedef
  • enum 创建枚举类型 ---> 适合创建常量列表
  • struct 创建结构体
typedef int unsigned uint;  // uint 表示 前面的 int unsigned ,相当于 define; uint表示的是变量类型 

​ 在枚举中,loat 代表缺省值 0, waite 为 2,idle 为 3;

enum {loat, wait} state_t; // state_t 表示的是枚举变量,是变量
typedef enum {loat, waite=2,idle} state_t; //定义枚举类型,这个 state_t 是枚举类型
//初始化
state_t pstate , nstate ;
case(pstate)
  loat: nstate = waite ;
  waite: nstate = loat ;
endcase
  • first()返回第一个 枚举常量last(); next()返回第下一个 枚举常量;next(N)返回下 N 个 枚举常量;prev()前一个枚举变量
typedef struct { int a; bit b ;} state_t; //同理,是结构变量
// 初始化
state_t cnt = '{32'haaaaaaaa, 32'd2}; 

字符串

​ 单个字符转是 byte 类型,字符串使用动态存储方式,不用担心存储空间会用完。

posted @ 2023-10-05 21:12  TTBond  阅读(97)  评论(0)    收藏  举报