其他分享
首页 > 其他分享> > SV强制类型转换和常数

SV强制类型转换和常数

作者:互联网

1. 强制类型转换

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

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

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

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

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有两个变量:目标变量和源变量

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

$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提供了三种常数类型parameterspecparamlocalparam

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

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

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常数实质上是一个只能被初始化的变量

标签:类型转换,转换,int,SV,cast,state,强制,常数
来源: https://blog.csdn.net/I_learn_code/article/details/121915477