sv中的数据类型转换
流操作符<<和>>用在赋值表达式的右边,后面带表达式、结构或数组,流操作符用于把其后的数据打包成一个比特流。操作符>>把数据从左至右变成流,而<<则把数据从右至左变成流。动态转换函数是$cast,它允许你对越界的数据进行检查。1.如果源变量和目标变量的比特位分布完全相同,例如整数和枚举类型,那它们之间可以直接相互赋值;静态转换操作不对转换值进行检查,转换时指定目标类型,并在需要转换的表达式前加上单
·
数据类型转换有两种情况:
1.如果源变量和目标变量的比特位分布完全相同,例如整数和枚举类型,那它们之间可以直接相互赋值;
2.如果比特位分布不同,例如字节数组和字数组,则需要使用流操作符对比特分布重新安排。
转换的方式有三种:
第一种是静态转换:
静态转换操作不对转换值进行检查,转换时指定目标类型,并在需要转换的表达式前加上单引号即可。例如
int i;
real r;
i = int'(10.0-0.1);
r = real'(42);
verilog对整数和实数类型,或者不同位宽的向量之间进行隐式转换;
第二种动态转换:
动态转换函数是$cast,它允许你对越界的数据进行检查。其实就是如果是越界的数据它的返回值是0,即代表数据类型转换失败,下面是个例子:
typedef enum {RED, BLUE, GREEN} COLOR_E;
COLOR_E color1, color2;
int c;
initial begin
color1 = BLUE;
c=color; #这里是隐式转换,枚举变量值为BLUE,隐式转换为整型变量为1;
c++;
if(!cast(color, c)) #这里是动态转换,c=2,对应GREEN,所以cast函数检查后没有越界,返回1,转换成功,color等于GREEN,不会进行下面的打印
$display("cast failed for c=%0d", c);
c++;
if(!cast(color, c)) #这里是动态转换,c=3,cast函数检查后发现枚举变量没有index=3的variant, 越界,返回0,进入if语句,开始下面的打印
$display("cast failed for c=%0d", c);
第三种是用流操作符来转换:
流操作符<<和>>用在赋值表达式的右边,后面带表达式、结构或数组,流操作符用于把其后的数据打包成一个比特流。操作符>>把数据从左至右变成流,而<<则把数据从右至左变成流。
initial begin
bit [15:0] wq [$]={16'h1234, 16'h5678};
bit [7:0] bq[$];
bq={>>{wq}};//12,34,56,78 字队列转换成字节队列
end

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)