systemverilog中的类型转换$cast_甲六乙的博客-程序员宅基地

技术标签: SystemVerilog  芯片验证  systemverilog  芯片  verilog  

0. 介绍

在SV中类型转换有很多,在这里先将类型转换分成两种,静态类型转换和动态转换。

静态转换就是用cast operator——单引号(‘)。

动态转换用$cast。

1. 静态转换 static cast(’)

语法如下:

1

2

constant_cast ::= // from A.8.4(来自1800)

casting_type ' ( constant_expression )

如果casting_type和表达式类型相同,那么会返回casting_type类型的值给到左值。如果类型不匹配,也会强行转换(string类型也会转换成int类型),但会出现问题:

1. casting_type是枚举类型,转换可能出界。

1

2

3

4

5

6

7

typedef enum {RED,BLUE,GREEN} color_e;

color_e color;

int c;

initial begin

    c=10;

    color=color_e'(c);

end

上面的转换会成功,color的值变成10,但这除了color_e这个枚举类型的界限了。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

typedef enum {RED,BLUE,GREEN} COLOR_E;

COLOR_E color;

int c;

string str;

initial begin

  str="hh";

  c=int'(str);

  $display("c is %0d",c);

  c=1;

  color=COLOR_E'(c);

  $display("Color is %d / %s",color,color.name);

  c=3;

  color=COLOR_E'(c);

  $display("Color is %d / %s",color,color.name);

end

// 输出

c is 26728    

Color is           1 / BLUE

Color is           3 /

从上面输出可以看出string类型转换成了int值;第二个color越界了。

2. casting_type是bit_stream type。

比特流类型先不整理了,没遇到过,在1800 6.24.3节,如果以后遇到再看吧。

2. 动态转换($cast)

上面static cast不会检查表达式的类型,可能会发生string转换成int,枚举越界等问题。

动态转换$cast可以作为function,也可以作为task(这个问题地平线一面的时候被问过,$cast是函数还是任务),语法如下:

1

2

3

function int $cast( singular dest_var, singular source_exp );

or

task $cast( singular dest_var, singular source_exp );

Use of $cast as either a task or a function determines how invalid assignments are handled.

When called as a task, $cast attempts to assign the source expression to the destination variable. If the

assignment is invalid, a run-time error occurs, and the destination variable is left unchanged.

When called as a function, $cast attempts to assign the source expression to the destination variable and returns 1 if the cast is legal. If the cast fails, the function does not make the assignment and returns 0. When called as a function, no run-time error occurs, and the destination variable is left unchanged.

It is important to note that $cast performs a run-time check. No type checking is done by the compiler, except to check that the destination variable and source expression are singulars.

至于$cast是作为function还是task,主要看$cast使用的语境是否需要返回值。

$cast作为function

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

typedef enum {RED,BLUE,GREEN} COLOR_E;

COLOR_E color;

int c;

initial begin

  c=1;

  if(!$cast(color,c))

    $display("cast failed for c=%0d",c);

  $display("Color is %d / %s",color,color.name);

  c=3;

  if(!$cast(color,c))

    $display("cast failed for c=%0d",c);

  $display("Color is %d / %s",color,color.name);

end

// 输出

Color is           1 / BLUE

cast failed for c=3

Color is           1 / BLUE

第二次$cast失败之后,color的值不变。

$cast作为task

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

typedef enum {RED,BLUE,GREEN} COLOR_E;

COLOR_E color;

int c;

initial begin

  c=1;

  if(!$cast(color,c))

    $display("cast failed for c=%0d",c);

  $display("Color is %d / %s",color,color.name);

  c=3;

    $cast(color,c); // 作为任务,没有返回值的语境

  $display("Color is %d / %s",color,color.name);

end

// 会报错

Error-[STASKE_DCF] Dynamic cast failed

./svt.sv, 108

  Dynamic cast using '$cast' failed. The source expression is not yielding a

  valid value for the destination variable.

3. 其他类型转换

在IEEE 1800的20.5节中,还介绍了一些integer2string或者signed2unsigned的函数

$itor converts integer values to real values (for example, 123 becomes 123.0).

$realtobits converts values from a real type to a 64-bit vector representation of the real number.

$bitstoreal converts a bit pattern created by $realtobits to a value of the real type.

$shortrealtobits converts values from a shortreal type to the 32-bit vector representation of the real number.

$bitstoshortreal converts a bit pattern created by $shortrealtobits to a value of the shortreal type

$signed—returned value is signed

$unsigned—returned value is unsigned

1

2

3

4

5

6

7

8

9

10

11

module driver (net_r);

output [64:1] net_r;

real r;

wire [64:1] net_r = $realtobits(r);

endmodule

module receiver (net_r);

wire [64:1] net_r;

input [64:1] net_r;

real r;

initial assign r = $bitstoreal(net_r);

endmodule

  

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_38037810/article/details/102641559

智能推荐

TRACE的用途及用法_darkdragonking的博客-程序员宅基地_trace用法

用法如下:1.在MFC中加入TRACE语句2.在TOOLS->MFC TRACER中选择 “ENABLE TRACING”点击OK3.进行调试运行,GO(F5)(特别注意:不是执行‘!’以前之所以不能看到TRACE内容,是因为不是调试执行,而是‘!’了,切记,切记)4.然后就会在OUTPUT中的DEBUG窗口中看到TRACE内容了,调试执行会自动从BUILD窗口跳到DEBUG窗口,

tomcat8 启动项目pom.xml配置_我是大头鸟的博客-程序员宅基地_pom tomcat8

tomcat8 启动项目pom.xml配置 <build> <finalName>WebTest</finalName> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId&g...

C++_缓存相机图像数据到内存_不可_收_圾的博客-程序员宅基地_c++ 拷贝图像数据到共享内存

相机原始输出的图像数据是Byer格式,可以塞进内存中的图像数组unsigned char* imgData[150] ;//创建图像数据数组//初始化时申请缓存150张图像的内存空间for (int i = 0; i < 150; i++){ imgData[i] = new unsigned char[1280 * 1024];}//采集到图像后将图像数据拷贝到数组中,pBuffer为相机图像帧数据的内存地址memcpy(imgData[Pic_num], pBuffer,

python3 练习题100例 (六)_daxia5398的博客-程序员宅基地_python.<实验三—习题

题目六:斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……。#!/usr/bin/env python3# -*- coding: utf-8 -*-&quot;&quot;&quot; 题目六:斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、2...

百度地图不显示问题_天天少一点的博客-程序员宅基地_新版百度地图不显示

可能的原因: 1、发布版SHA1没有配置正确 2、开发版SHA1没有配置正确 3、包名注意 发布版SHA1和开发版SHA1是不一样的。 在android studio中获取开发版SHA1的方法keytool -v -list -keystore debug.keystore在android studio中获取发布版SHA1的方法,然后输入签名文件的密码keytool -v -list -k

Java自动化测试系列[v1.0.0][Maven开发环境]_Davieyang.D.Y的博客-程序员宅基地

Maven是一个项目管理工具,它包含 了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。当你使用Maven的时候,你用一个明确定 义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件

随便推点

探索如何使用Flink CEP_dapanbest的博客-程序员宅基地

写在前面前言的前言本文转自我自己的掘金主页,原文链接:https://juejin.im/post/5de1f32af265da05cc3190f9在学习Flink的过程中,我看过很多教程。无论是视频还是博文,几乎都把Flink CEP作为进阶内容来讲授。究其原因,大概是CEP涉及到的计算机基础知识很多,而我对于诸如NFA、DFA之类名词的印象,基本只停留在很多年前编译原理的课本上。那么如...

Ext.Net 1.x_Ext.Net.GridPanel之右键菜单_厦门德仔的博客-程序员宅基地

function deleteuser() { var record = ItemGrid.getSelectionModel().getSelected(); alert("删除物料:"+record.data.MB001.toString()); //Ext.net.DirectMethods.De

Java学习历程基础篇_李旭me的博客-程序员宅基地_java 学习历程

接下来让我们继续来了解Java一、发展历程及体系1996年1月,Sun公司发布了Java的第一个开发工具包(JDK 1.0),标志着Java成为一种独立的开发工具。从首次发布开始,Java就跃到了Internet编程的前沿,后续的每一个版本都进一步巩固了这一地位。如今,Java依然是开发基于Web的应用程序的最佳选择。此外,Java还是智能手机变革的推手,Android编程...

边缘模式EPOLLET EPOLLOUT简单例子___xa__的博客-程序员宅基地_epoll et 例子

给群里写的,简单的EPOLLET 例子:EPOLLOUT详细说明下面2个服务器例子 ,一个没有处理EPOLLOUT, 另一个处理了;第一个例子只用来展示EPOLLET 的特点第2个例子是一个echo服务器, 处理了EPOLLOUT,如果要看EPOLLOUT的直接往下拉到第个例子, 主要还是看 errno == EAGAIN 这些地方在ET模式下:对于EPOLLIN...

数据处理如同流水——介绍下偶的数据流引擎Samsara_daxi1047的博客-程序员宅基地

前言代码、源码不重要,重要的是思想,希望大家多给建议。正文微软有个叫SSIS,引用了数据流概念,不过更加强大的是,他基于了sql server,能够进行数据分析,构造数据仓库。数据挖掘的目标的确远了,不过数据引擎我导开发了一个。先看个demo。需求:我有个订单表POS_SALESORDER, 需要生成一张订单的消费凭证:POS_SALESORD...

大数据岗位面试失败的经历总结,这些面试的坑莫在踩_李旭me的博客-程序员宅基地

本人住在有人间天堂之称的城市,6年多开发经验,最近2年主要在做大数据相关的开发,最近考虑换工作,基本也只考虑大数据相关岗位。目前新工作已经找好,但想分享一下最近面试的失败一些经历(成功的那些就不讲了),吐槽吐槽,跟广大吃瓜群众分享一下过程中的经历心得,我的语文体育老师教的,还请大家莫怪。1.公司:国内知名电信运营商,其下面的大数据研究院,面两轮一面:技术人员面,先自我介绍,...

推荐文章

热门文章

相关标签