数据类型
数据类型分类
双状态:bit byte shortint int longint real
四状态:logic integer time net-type(reg wire tri)
有符号:byte shortint int logint integer
无符号:bit logic reg net-type
定宽数组
多维数组声明
初始化与赋值
//声明
int a[0:15];
int a[16];
int a2[0:7][0:15];
int a2[8][16];
//初始化
int a[2] = '{1,2};
a[0:1] = '{3,4};
a = '{2{2}};
a = '{1,default:1}
合并数组:(从左到右维度依次降低) bit[3][7:0] a;占3*8=24bit,一个word
非合并数组:(高维度在右边) bit[7:0] a[3];占3个word
动态数组
声明 int a[];
new创建数组
int dyn[],d2[];//声明
initial begin
dyn = new[5];//分配元素
foreach(dyn[j]) dyn[j] = j;
d2 = dyn;//复制一个数组
dyn = new[20](dyn);//分配
dyn.delete();//删除
end
队列
声明int a[$]
赋值不需要’
insert(a,loc)
delete(loc)
push_back();push_front();pop_front();pop_back()
int q[$]={3,4};//声明与赋值,不需要';$表示末尾最后一个
q.insert(data,locs);//插入
q.delete(locs);//删除
q.delete();//删全部
q={};//删全部
q.push_back(data);//队尾输入
data = q.pop_front();//队首弹出
//不咋用//
q.push_front(data);//队首插入
data = q.pop_back();//队尾弹出
q={1,q};//队首插入
foreach(q[i])
$display(q[i]);//打印
end
关联数组
bit[8] a[string], idx = ‘a’;声明放数据类型
a[idx]=2;
assoc.first(idx),得到第一个索引存放在idx中
assoc.next(idx),得到下一个索引存放在idx中
assoc.delete(idx),删除该元素
bit [63:0] assoc[int], idx = 1;//声明,索引一定是类型
repeat (64) begin //对稀疏分布的元素进行初始化
assoc[idx] = idx;
idx=idx<<1;
end
foreach (assoc[i]) // 使用foreach遍历数组
$display("assoc[&h] = h", i, assoc[i]) ;
//使用函数遍历数组
if (assoc.first(idx)) begin //得到第一个索引
do
$display ("assoc[&h]=&h", idx, assoc[idx]) ;
while (assoc.next(idx)); // Get next index
end
//找到并删除第一个元素
assoc.first(idx) ;
assoc.delete(idx) ;
结构体
struct {bit [7:0] r, g, b;} pixel; //创建一个pixel结构体
//为了共享该类型,通过typedef来创建新类型
typedef struct {bit [7:0] r, g, b; } pixel_ s;
pixel_s my_pixel; //声明变量
my_pixel = '{'h10, 'h10, 'h10}; //结构体类型的赋值
枚举类型
typedef enum {INIT, DECODE, IDLE} fsmstate_e;//INIT:0.....
fsmstate_e pstate, nstate; //声明自定义类型变量
case (pstate)
IDLE: nstate = INIT; //数值赋值,不能将整型赋值给枚举类型
INIT: nstate = DECODE;//fsmstate_e'(1)
default: nstate = IDLE;//$cast(pstate,p);将整型显示转换为枚举类型
endcase
$display("Next state is号s", nstate.name()); //显示状态名
字符串
string s;//声明 ""
initial begin
s ="IEEE ";
$display(s.getc(0)); //显示‘I'
$display(s.tolower()); //显示ieee
s.putc(s.len()-1,"-"); // 将空格变为:-'
s = {s, "P1800"}; // "IEEE-P1800"
$display(s.substr(2,5)); //显示EE-P
//创建一个临时字符串并将其打印
my_log($psprintf("%s %5d", s, 42)) ;
end
task my_log (string message); //打印消息
$display("@80t: s", $time, message) ;
endtask
相关语法
- 静态转换与动态转换:
byte a = 8'1000_0000;
bit [8:0] a_s;
bit [8:0] a_d;
a_s = unsigned'(a);//静态转换
$cast(a_d,a);//动态转换
- for each:
bit[31:0] src[5],dst[5];//$size(src)
foreach (dst[i])
dst[i] = 2*src[i];
end
bit[31:0] src1[5],dst1[5];
foreach (dst1[i,j])
dst1[i][j] = 2*src[i][j];
end
3.$urandom_range(1,3); //产生1-3内的随机整数
相关题目
- 类型转换:有符号向无符号转换需要考虑高位的符号位
答案:'h180’h080