在Verilog-2001标准中任务或函数中的变量可以定义为动态变量
动态变量的存储区是由软件工具动态分配的(每次调用都会建立新的存储区
),访问结束后空间被释放
动态变量主要用来描述在测试程序、抽象系统级、交易级或总线功能模型中的验证程序
动态变量也可以用来编写可重入的任务(当一个任务的前一次调用仍在进行时,可以再次调用)
在SV中,有static
和automatic
两个关键字,用来表示声明的变量是静态还是动态
在模块一级中,所有的变量必须是静态变量,而在任务、函数、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的基础上,允许任务和函数声明的变量有内嵌初始化
静态变量和动态变量初始化的区别
静态变量初始化是不可综合的,动态变量的初始化可以综合
静态变量在仿真开始前便完成初始化,动态变量是在被调用时进行初始化
静态变量在下一次被调用时会保持上一次调用后的值,动态变量在下一次调用时会开辟新的存储空间,并重新初始化
3. 静态变量和动态变量使用原则
- 在always和initial块中,需要内嵌初始化就声明为动态变量,不需要内嵌初始化用静态变量
- 如果任务或函数是可重入的,应设置被动态的,其内的变量也应是动态的
- 如果任务或函数用来描述独立的硬件部分,且不可重入,应该设置为静态的,其内的变量也应为静态的