如果在Verilog中使用automatic关键字声明任务是什么意思?
task automatic do_things; input [31:0] number_of_things; reg [31:0] tmp_thing; begin // ... end endtask;
注意:这个问题主要是因为我很好奇网站上是否有任何硬件程序员.:)
"自动"实际上意味着"重入".该术语本身是从软件语言中窃取的 - 例如,C具有"auto"关键字,用于将变量声明为在执行作用域时在堆栈上分配,并在之后解除分配,以便同一作用域的多次调用执行没有看到该变量的持久值.您可能没有在C中听说过这个关键字的原因是它是所有类型的默认存储类:-)替代方案是"静态",这意味着"静态地分配这个变量(到内存中的单个全局位置),并且在整个程序执行期间引用相同的内存位置,无论调用该函数的次数是多少次,"volatile",这意味着" 这是我SoC上其他地方的寄存器或其他我无法控制的设备上的东西; 编译器,请不要优化对我的读取,即使你认为你知道我之前读取的值,代码中没有中间写入".
"automatic"用于递归函数,但也用于在不同的执行线程中同时运行相同的函数.例如,如果您"分叉"N个不同的块(使用Verilog的fork-> join语句),并让它们同时调用相同的函数,则会出现与递归调用自身的函数相同的问题.
在许多情况下,如果没有将任务或功能声明为"自动",您的代码就可以了,但除非您特别需要,否则将它放在那里是一种很好的做法.
这意味着任务是可重入的 - 任务中声明的项是动态分配的,而不是在任务的不同调用之间共享.
你看 - 我们有些人做Verilog ......(呃)