SV强制类型转换和常数

SV学习(4)——数据作用域和类型转换 $cast() SV学习(4)1. 数据作用域2. 数据类型转换2.1. 静态类型转换2.2. 动态类型转换 1. 数据作用域 在一个静态任务、函数或者块内声明的变量默认情况下具有静态的生命周期并具有本地的作用范围。 Verilog允许将函数和任务声明成自动的(automatic),这使得任务或函数内的所有存储空间都是自动的。 SV允许一个静态的任务或函数内的特定数据被显式地声明成自动地(automatic)。声明成自动的变量具有调用块内的生命周期,并且在每次进入调用或者块内的时候i女性初始化。 SV也允许变量被显式地声明 阅读详情
AI摘要

本文探讨了Verilog和SystemVerilog中的强制类型转换,包括静态转换(数据类型、向量宽度和符号转换)及其仿真示例,以及常数的不同类型(parameter、specparam和localparam)及const的使用。着重讲解了动态强制类型转换的规则和系统函数$cast的应用。


历史内容合集

1. 强制类型转换

1.1 静态转换(编译时转换)

静态转换有三种,分别是数据类型强制转换、向量宽度强制转换和符号强制转换,格式分别为:

  • 数据类型强制转换:'()

    7 + int'(2.0 * 3.0);	//将(2.0 * 3.0)的结果转换成整型
    				    //然后加7
    
  • 向量宽度强制转换:'()

    logic	[15:0]	a, b, y;
    y = a + b ** 16'(2);	//将文本值2强制转换为16位宽
    
  • 符号强制转换:'()

    shortint	a, b;
    int			y;
    y = y - singed'({a, b});	//将拼接结果强制转换成有符号值
    

静态强制转换是编译时的转换,转换的操作总会运行,而不会检查结果的有效性

下面对数据类型强制转换和向量宽度强制转换做了仿真:

module trans_static_tb;
    int         i;
    logic [2:0] a;

    initial begin
        i = 1 + int'(1.0 + 2.0); //静态类型转换,
                                //强制转换成 int类型
        a = 3'b100;
    end

    initial begin
        $display ("\n \t the var i is: %0d", i);
        $display ("\n \t the array is: %b", 8'(a)); //静态类型转换,
                                                     //打印时将为宽拓展至8位
    end
endmodule

仿真结果如下:

1.2 动态强制类型转换

系统函数$cast是动态的,并且在运行时进行带转换数值的检查

动态强制类型转换的格式为:$cast(dest_var, source_var);,系统函数$cast有两个变量:目标变量和源变量

下面几种情况会导致无效的强制类型转换:

  • 将real类型转换成int类型,而实数太大,没有办法用int来描述

    int	radius, area;
    always @(posedge clock)
        $cast (area, 3.154 * radius ** 2);	//强制转换操作符的结果被装换为area类型
    
  • 将一个数值转换成枚举类型,而它不在枚举类型的合法值列表中

    typedef enum {s1, s2, s3} state_t;
    state_t	state, next_state;
    
    always_latch begin
        $cast (next_state, state + 1);
    end
    

$cast可以作为任务调用也可以作为函数调用,作为任务调用时,如果转换不成功,会报告运行时错误,但作为函数调用时,不会报告运行时错误

系统函数$cast具有返回值,如果转换成功,返回1;转换失败,返回0

例如:

typedef enum {s1, s2, s3} state_t;
state_t	state, next_state;

always_comb begin
    status = $cast(next_state, state + 1);
    if(status == 0)	//如果强制转换不成功
        next_state = s1;	
end

$cast函数不能和直接修改源表达式的操作符(++, +=)一块用

$cast函数主要用途是将表达式的结果赋给枚举类型变量

静态强制转换是可综合的,动态强制转换由于一些综合工具可能不支持$cast系统函数

系统函数和系统任务都是不可综合的

下面这个例子,将0.25*8动态装换成int类型,并通过系统函数$cast判断转换是否成功

module trans_auto_tb;
    bit a;
    int value;

    initial begin
        a = $cast(value, 0.25 * 8); //将0.25*8的值转换成int类型
                                    //若转换成功,a为1,否则a为0
    end

    initial begin
        $display ("\n \t a is: %b", a);
        $display ("\n \t value is: %d", value);
    end
endmodule

仿真结果如下:

2. 常数

2.1 Verilog中的常数

Verilog提供了三种常数类型parameter、specparam和localparam

  • parameter:可以在确立时使用defparam或者内嵌参数重定义进行重新定义的常数
  • specparam:可以在确立时从SDF文件中重定义的常数
  • localparam:确立期常数,不能重定义,但其价值可以基于其他常数

确立实质上是软件工具建立模块实例代表的设计层次的过程

Verilog限制parameter、specparam和localparam常数的声明只能在模块、静态任务和静态函数中,不允许在动态任务和动态函数中

2.2 SV中的常数

关键字const允许将任何变量声明为常数,const形式的常数直到确立完成后才被赋值

const常数的使用范围:

  • 在动态任务和函数等动态环境中声明
  • 被赋予一个线网或变量值而非常数表达式
  • 被赋予一个对象值,这个值可以在任何设计层次定义

const常数的声明必须包含数据类型,例如:

const	logic	[23:0]	C1 = 7;	//24位常数
const	int		C2 = 15;	//32位常数
const	real	C3 = 3.14;	//实数常数
const	C4 = 5;	//错误,因为没有给定数据类型

const常数实质上是一个只能被初始化的变量

[sv]非强制类型转换 int‘() real‘() 28‘() /* //使用二进制实现 function bit[27:0] chopper_iq_ref_base_model::ul_add_round33_28(input bit[32:0] data, input bit[3:0] exp_shift); //round for ul add logic signed[27:0] round_res, round_res_tmp; bit[32:0] data_tmp; bit point_right; bit signed_bit; bit 阅读详情

相关推荐

[SV]local和protected的区别

local和protected的区别

元直的博客 1674

sv类型转换

sv 类型转换

whddddddddddd的博客 1146

【SystemVerilog基础】SV的位宽处理规则探究

【代码】【SystemVerilog基础】SV的位宽处理规则探究。

MoorePlus的博客 324

[SV基础] 数据类型和类型转换

IC验证岗面试常问知识总结~

weixin_42636450的博客 2051

[SV]SystemVerilog語法小結

1、包的定义: package _name; …… endpackage 引用包时必须先行导入,通配符导入: import _name::*; 端口列表中依然要引用包的名称。除非首先将包导入$unit编译单元,即可将import语句放到每个文件模块或接口定义之前。此外,`include “_name.pkg”应该放在文件的开始。 为了能够综合,包中定义的任务和函数声明为...

元直的博客 8452

Appstore 3.2(f)违规自救指南:从触发到申诉的完整应对策略

本文详细解析了Appstore 3.2(f)违规的应对策略,从触发原因到申诉流程,帮助开发者有效自救。文章涵盖隐瞒行为、账户关联和信息造假三大违规场景的判定逻辑,并提供申诉信写作的黄金法则和长期合规防御措施,确保开发者能够顺利通过苹果审核。

weixin_29304985的博客 664

为什么要强制类型转换?什么情况下使用强制类型转换?说说强制类型转换的优点和缺点...

因为不是同一类型的数据间传递信息,为了可以,需要强制类型转换 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需要强制转换。因为子类拥有比父类更多的属性、更强的功能,所以父类转换为子类需要强制。那么,是不是只要是父类转换为子类就会成功呢?其实不然,他们之间的强制类型转换是有条件的。 当我们用一个类型的构造器构造出一个对象时,这个对象的类型...

weixin_30500105的博客 3848

相机中的归一化实现讲解

本分讲解了图像处理中常出现的两个相机归一化操作

weixin_42102084的博客 1475

SV学习笔记—类型转换

program test; initial begin $display("int'(42+1.1) is",int'(42+1.1));//将43.1强制转换为整型 $display("(42+1.1) is",(42+1.1));//SV默认为浮点型 $display("real'(42+1.1) is",real'(42+1.1)); end endp

不定期分享IC验证学习笔记 2143

TCGA之GDC-client工具下载安装与使用

文章主要是对GDC-client工具下载TCGA数据库数据整个过程的一个记录 1.下载GDC-client工具 GDC-client工具网址:GDC Data Transfer Tool | NCI Genomic Data Commons (cancer.gov) 我这里下的是上图中红圈中的版本, 2.解压安装 从网上了解的是不能解压到带中文的路径里,解压后是一个.exe文件,为了能直接在cmd命令行下使用,将其加入系统环境: 点击新建之后,输入将文件解压到的路径,然后...

better_strong的博客 1万+

Dify插件离线部署全攻略:从下载到安装的完整流程

本文详细介绍了Dify插件离线部署的完整流程,针对企业内网等无网络环境需求。核心步骤包括在联网环境下载插件包、在特定Python 3.12.9环境下使用专用工具进行离线重打包,以及最终在离线Dify环境中安装验证。重点解决了离线安装的核心难题,并提供了环境配置、批量处理和故障排查等实用技巧,帮助用户实现Dify插件的顺利离线部署。

seed的博客 659

汇川伺服 (2)DDR、MSI电机、SV510、SV520、SV660软件简单调试

运控

weixin_39354845的博客 2821

GEE:关于遥感生态指数(RSEI)的若干疑问

本文记录了若干关于在 Google Earth Engine (GEE)平台上,计算基于主成分分析(PCA)的遥感生态指数(RSEI)的问题。并记录了解决这些问题的一些答案。问题包括,主成分分析的特征值的正负,主成分的占比,去云后空值像素的处理方法,异常值处理方法,如何看载荷等。

养乐多的博客 3418

SV学习视频记录

1、引入接口的目的是方便模块输入输出信号的管理 2、接口中存在modport,可以用于将一组信号归类 3、接口中存在clocking,用于信号同步,避免竞争冒险,只能用于平台。时钟在默认情况下存在input #1step output #0 4、#n表示经过n个时间单位,##n表示经过n个周期 5、SV中的时间分区:将某一个时钟(?也可能是某段短时间片)分成四个区间,active(执行duv中的仿真代码),observed(执行断言),reactive(执行平台中的oop操作),postpone(采

waddle_pig的博客 1036

三连杆平面机器人的动力学

0.前言 在这个例子中推导并实现三连杆平面机器人的运动方程。特别的,这里使用拉格朗日法推导运动方程。系统模型如下: 其中在枢轴点处Tm为驱动力矩【一般由伺服电机提供】; b*theta_d:为粘性阻尼扭矩 1、系统方程符号推导前--简介 首先明确欧拉-拉格朗日运动方程: 同样也可以根据作用在多体系统上的非保守力和非保守扭矩来定义广义力Qk。 作用在系统上的广义力的公式为: 其中: Qk:是与广义坐标关联的广义力 Nf_nc :是作用的非保守力的数量 Nt_nc:是作用的非保守扭矩的.

weixin_39090239的博客 4932

PCL 区域生长分割【2026最新版】

区域生长算法原理介绍、代码实现以及一个具体实验场景的应用案例进一步实现将分割结果的分类保存至本地文件夹。最近一次更新时间为:2026年5月4日。

点云侠的博客 40万+

sv标准研读第十三章-task和function

sv标准研读第十三章-task和function

yunduor909的博客 1887

HyperLynx(十三)Hyperlynx前放置之对网络的EMC分析

在“Spectrum Analyzer”对话框的“Stimulus”(激励)栏中,设置激励源频率为100MHz,选择“IC modeling”为“Fast-Strong”,并按图所示设置其他选项。显然,在仿真的基频上,它的幅值最大,将鼠标光标置于柱状图上,可以读取其值为64.28mA,这个数值是由选定的驱动芯片决定的。按上图所示的原理图,在接收端增加一个并联的RC负载,再次运行仿真,结果如图所示。在对话框左侧的“Pins”列表中,显示出了已添加电流探针的引脚,可以在此列表中选择所要仿真的目标。...

小幽余生不加糖 4681

sv 运算时 数据类型转换的例子

在 sv 中 无符号数 -无符号数 的结果始终大于等于0,需要做类型转换

qq_43436188的博客 1149

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

栈和托管堆.值类型和引用类型.强制类型转换.装箱和拆箱[C#]

一、栈和托管堆    通用类型系统(CTS)区分两种基本类型:值类型和引用类型。它们之间的根本区别在于它们在内存中的存储方式。.NET使用两种不同的物理内存块来存储数据—栈和托管堆。如下图所示: 值类型总是在内存中占用一个预定义的字节数(例如,int类型占4个字节,而string类型占用的字节数会根据字符串的长度不同而不同),当声明一个值类型变量时,会在栈中分配适当大小的内存(除了引用类型的值

人生咏叹调 687

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

SV和VUM中$cast()的功能

cast() 是 SystemVerilog 中一个用于强制类型转换的系统函数,它可以将一个表达式的值转换为指定类型。它可以将一个表达式的值转换为指定类型,即使该表达式原本不属于目标类型。目标类型,可以是任何 SystemVerilog 数据类型,例如 int、real、string、struct 等。$cast() 也可以进行显式类型转换,即使目标类型与表达式类型不同,并且转换操作可能导致数据丢失。$cast() 可以进行隐式类型转换,即使目标类型与表达式类型不同,只要转换操作是合法的。

minsixiang的博客 867

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

sv标准研读第五章-词法

sv标准研读第五章-词法

yunduor909的博客 1467

Google Play将强制推行两步验证(2SV)政策

Google Play 明确宣布,自 2025 年 5 月 12 日起,将强制推行两步验证政策,该政策全方位覆盖 Google Play 开发者控制台、应用发布流程、财务操作等各个关键环节。

Android出海 1952

c语言 void**类型转换,void指针类型强制转换

如何将一个void*强制转换成行指针类型?void*指针可以转换成任何类型的指针。 强制转换即可,比如 (int *)(void *)p; 假设你的数组有N行M列的int型数据。 int arr[N][M]; int (*p)[M]=arr; 假设pV为一个void型指针 p=(int (*)[M])pV;c语言的,void指针不能++,那该怎么改?#include #include void a...

weixin_42221297的博客 9824

sv过程语句和子程序

写在前面:类似c语言,多练习就好。 sv过程语句 与verilog相比,SV加入了与C/C++类似的自增自减操作符、continue、return等语句。 实例:自增自减操作符、for、while //systemverilog绿皮书 //例题3.1 新的过程语句和操作符 //仿真结果是45 module procedure(); //自增自减操作符 //i++和i--是先把值赋给下一语句,然后+1或-1 //++i和--i是先+1或-1,然后把值赋给下一语句 initial begin:ex.

杰之行的博客 2219
上一篇: Verilog学习--UDP用户自定义原语
下一篇: SystemVerilog package
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值