为什么verilog中递归函数需要定义为automatic?

直接上代码

c 复制代码
module automatic_tb;

reg [7:0] value;

initial begin 
	#0 value <= 8'd5;
	#10 $display("result of automatic: %0d", factor_automatic(value));
	    $display("result of static: %0d", factor_static(value));
	#50 $stop;
end

function reg[7:0] factor_static (input reg[7:0] dat);
	if (dat >= 2) begin
		factor_static = factor_static(dat-1) * dat;
	end
	else
		factor_static = 1;
endfunction

function automatic reg[7:0] factor_automatic (input reg[7:0] dat);
	if (dat >= 2) begin
		factor_automatic = factor_automatic(dat-1) * dat;
	end
	else
		factor_automatic = 1;
endfunction

endmodule

得到的仿真结果为:
从上述的仿真结果中可以看到,此时automatic的函数对应的结果是对的,而static的函数对应的结果是错误的。

原因分析

对于static函数而言,此函数中对应的变量都是static,也就是只存在一份。以上述的列子为例,当factor_static递归四次的时候,此时dat的值为1,即这唯一的一份dat的值为1,并且此时result也被置为1,当函数进行到上一层的时候,此时factor_static(2)的值为1,而dat的也是1,所以当前这一次返回的值也为1,因此最终的结果为1。具体的流程见下图:

在国外的网站上看到的另一个分析static和automatic函数的例子

c 复制代码
module static_tb;

task add(input reg[7:0] a, input reg[7:0] b);
begin
	#2;
	$display("the sum is %0d", a+b);
end
endtask

initial 
fork
	begin 
		add(2, 3);
	end
	begin
		#1;
		add(3, 4);
	end
join 

endmodule

可以看到,这里的两个sum输入的参数不同,但是得到的结果却是相同的。这是由于在time为0的时候,add(2, 3)进行执行,将a设置为2,b设置为3,然后等待2个时间单位准备输出,但是在经过了1个时间单位之后,add(3,4)进行执行,又将a设置为3,b设置为4,所以再又经过一个时间单位之后,输出的结果为7,从而看到的结果都是7。
此案例的参考地址

相关推荐
小眼睛FPGA3 小时前
【紫光HiYou开源入门轻量级PCIE开发板PG2L25G】实验例程1-基于紫光FPGA 的LED 流水灯
fpga开发
不会武功的火柴3 小时前
SystemVerilog语法(8)-有限状态机(FSM)
嵌入式硬件·fpga开发·自动化·ic验证·rtl·uvm方法学
Kent Gu5 小时前
Lattice FPGA选型
fpga开发
Terasic友晶科技8 小时前
答疑解惑|为DE25-Nano开发板配置Linux kernel时.config文件没有起作用是什么原因?
linux·服务器·fpga开发·linux kernel·de25-nano
8K超高清10 小时前
CCBN展会多图回顾
人工智能·算法·fpga开发·接口隔离原则·智能硬件
小眼睛FPGA11 小时前
【紫光HiYou开源入门轻量级PCIE开发板PG2L25G】实验例程5-DDR3 读写实验例程
fpga开发
unicrom_深圳市由你创科技11 小时前
如何做FPGA的功耗优化?动态功耗管理怎么实现?
fpga开发
不会武功的火柴11 小时前
SystemVerilog语法(9)-验证基础与简单Testbench
嵌入式硬件·fpga开发·fpga·systemverilog·硬件描述语言·rtl·uvm验证
kaizq12 小时前
MuleRun助力MakerChip-FPGA在线编程模拟仿真操练
fpga开发·verilog·龙虾机器人·mulerun·makerchip·在线模拟仿真
c-u-r-ry3012 小时前
vivado处理硬件设计差分对布线极性翻转的问题
经验分享·fpga开发