SystemVerilog静态变量和动态变量

在Verilog-2001标准中任务或函数中的变量可以定义为动态变量

动态变量的存储区是由软件工具动态分配的(每次调用都会建立新的存储区),访问结束后空间被释放

动态变量主要用来描述在测试程序、抽象系统级、交易级或总线功能模型中的验证程序

动态变量也可以用来编写可重入的任务(当一个任务的前一次调用仍在进行时,可以再次调用)

在SV中,有staticautomatic两个关键字,用来表示声明的变量是静态还是动态

在模块一级中,所有的变量必须是静态变量,而在任务、函数、begin…end或fork…join中的变量可以根据关键字进行显示声明

例如下面的代码,在静态函数中显示声明动态变量:

function int count_ones (input	[31:0]	data);
    automatic	logic	[31:0]	count = 0;
    automatic	logic	[31:0]	temp = data;
    
    for(int i = 0; i <= 32; i++) begin
        if(temp[0])	
            count++;
        temp >>= 1;  //等价于 temp = temp >> 1;
    end
    
    return count;
endfunction

1. 静态变量和动态变量的区别

调用时的区别

  • 动态变量:每次调用时会重新开辟新的空间

  • 静态变量:在两次调用期间变量的值会保持

    因此,如果希望知道某个变量被调用的次数,那么这个变量应该声明为静态变量

缺省声明时的区别

  • 在模块、begin…end、fork…join以及非动态的任务和函数中,缺省时为静态变量
  • 在动态的任务和函数中,缺省时为动态变量
  • 模块一级的变量必须是静态变量

2. 变量的初始化

  • 在Verilog中

Verilog只有模块级声明的变量可以内嵌初始化

  • 在SV中

SV在Verilog的基础上,允许任务和函数声明的变量有内嵌初始化

静态变量和动态变量初始化的区别

  1. 静态变量初始化是不可综合的,动态变量的初始化可以综合

  2. 静态变量在仿真开始前便完成初始化,动态变量是在被调用时进行初始化

  3. 静态变量在下一次被调用时会保持上一次调用后的值,动态变量在下一次调用时会开辟新的存储空间,并重新初始化

3. 静态变量和动态变量使用原则

  • 在always和initial块中,需要内嵌初始化就声明为动态变量,不需要内嵌初始化用静态变量
  • 如果任务或函数是可重入的,应设置被动态的,其内的变量也应是动态的
  • 如果任务或函数用来描述独立的硬件部分,且不可重入,应该设置为静态的,其内的变量也应为静态的

你可能感兴趣的:(#,fpga开发)