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