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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容