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