为什么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。
此案例的参考地址

相关推荐
szxinmai主板定制专家3 小时前
AMR 项目落地:机器人控制器硬件定制化需求复盘
arm开发·单片机·fpga开发·系统架构·机器人·am62x
FPGA小迷弟1 天前
FPGA 与卫星:从星载硬件到在轨智能的完整技术解析
fpga开发·架构·fpga·1024程序员节·无线电
NamoAmitabha1281 天前
CPU 内部结构是什么?---deepseek
fpga开发
abc light1 天前
ARM 裸机开发(6)——时钟树与定时器
arm开发·单片机·fpga开发
156082072192 天前
JFMZQ28DR、JFMZQ68DR、RFsoc XCZU47DR、XCZU48DR 信号处理板
fpga开发·信号处理
XMAIPC_Robot2 天前
-40~85℃宽温实测:RK3588 机器人控制器硬件底座,长时间 SLAM 定位稳定性验证
人工智能·fpga开发·机器人·边缘计算·arm+fpga·rk3588+fpga
樱木花道長2 天前
AMD Ross 深度系列 8:FAQ 七问七答(文末附网盘链接)
人工智能·fpga开发
FPGA小迷弟2 天前
FPGA 与无人机:从飞控实时性到智能载荷的硬件加速实践
人工智能·ai·fpga开发·架构·无人机·ai编程
低慢小uav2 天前
(已解决)Zynq芯片lwip协议栈,使用tcp作为服务器Service,接收大量数据时,长度接收正常,接收对数据校验,校验和异常分析
网络协议·tcp/ip·fpga开发
szxinmai主板定制专家2 天前
ARM+FPGA 数控机床控制器:选 CODESYS SoftMotion CNC,还是基于 LinuxCNC 自研搭建?架构、授权、实时性、量产风险深度对比
arm开发·fpga开发·codesys·数据采集卡·linuxcnc·rk3576