数据类型转换有两种情况:

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

Logo

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

更多推荐