如果在Verilog中使用automatic关键字声明任务是什么意思?
task automatic do_things;
input [31:0] number_of_things;
reg [31:0] tmp_thing;
begin
// ...
end
endtask;
注意:这个问题主要是因为我很好奇网站上是否有任何硬件程序员。 :)
答案 0 :(得分:22)
“自动”确实意味着“重新进入”。该术语本身是从软件语言中窃取的 - 例如,C具有“auto”关键字,用于将变量声明为在执行作用域时在堆栈上分配,并在之后解除分配,以便同一作用域的多次调用执行没有看到该变量的持久值。您可能没有在C中听说过这个关键字的原因是它是所有类型的默认存储类:-)替代方案是“静态”,这意味着“静态地分配这个变量(到内存中的单个全局位置),并且在整个程序执行过程中引用相同的内存位置,无论调用函数多少次“和”volatile“,这意味着”这是我的SoC上的其他寄存器或者我没有的其他设备上的东西控制;编译器,请不要优化对我的读取,即使你认为你知道我之前读取的值,代码中没有中间写入。“
“automatic”用于递归函数,但也用于在不同的执行线程中同时运行相同的函数。例如,如果你“分叉”N个不同的块(使用Verilog的fork-> join语句),并让它们同时调用相同的函数,则会出现与递归调用自身的函数相同的问题。
在许多情况下,如果没有将任务或功能声明为“自动”,您的代码就可以了,但除非您特别需要,否则最好将其放在那里。
答案 1 :(得分:15)
这意味着任务是可重入的 - 任务中声明的项是动态分配的,而不是在任务的不同调用之间共享。
你看 - 我们中的一些人做了Verilog ......(呃)
答案 2 :(得分:3)
“automatic”关键字还允许您编写递归函数(自verilog 2001起)。我相信如果他们能够获得成功,他们应该是可以合成的,但我不确定他们是否有工具支持。
我也是,做verilog!
答案 3 :(得分:1)
Will和Marty说,自动功能用于递归功能。
如果使用不同的值调用普通(即非自动)函数并由模拟器在同一时间片中处理,则返回的值是不确定的。这可能是一个非常棘手的错误!这只是一个模拟问题,当合成时逻辑将是正确的。
自动修复此功能。
答案 4 :(得分:0)
在计算中,如果可以安全地并发运行多个调用,则计算机程序或子例程称为重入程序(维基百科)。 简而言之,当一个任务的多个实例同时运行时,关键字automatic使其变得安全。 :D