Verilog自动任务

时间:2020-03-05 18:45:11  来源:igfitidea点击:

如果在Verilog中使用自动关键字声明了任务,那意味着什么?

task automatic do_things;
  input [31:0] number_of_things;
  reg [31:0] tmp_thing;
  begin
    // ...
  end
endtask;

注意:这个问题主要是因为我很好奇网站上是否有任何硬件程序员。 :)

解决方案

回答

这意味着任务是在任务内声明的可重入项,是动态分配的,而不是在任务的不同调用之间共享。

我们会看到我们中的一些人使用Verilog ...(嗯)

回答

"自动"关键字还允许我们编写递归函数(自verilog 2001起)。我认为,如果它们触底反弹,它们应该是可综合的,但是我不确定它们是否具有工具支持。

我也做verilog!

回答

正如Will和Marty所说,自动程序是为递归函数设计的。

如果正常(即非自动)函数以不同的值调用并由模拟器在同一时间段内处理,则返回的值不确定。那可能是一个相当棘手的错误!这只是一个仿真问题,综合后的逻辑将是正确的。

使该功能自动修复。

回答

实际上,"自动"确实意味着"重入"。该术语本身是从软件语言中窃取的,例如,C具有" auto"关键字,用于在执行其作用域时将变量声明为在堆栈中分配,然后再释放,这样同一作用域的多次调用就不会被释放。查看该变量的持久值。我们可能没有在C语言中听说过此关键字的原因是,它是所有类型的默认存储类:-)替代方案是"静态",这意味着"静态地将此变量分配给内存中的单个全局位置,并在整个程序执行过程中都引用相同的内存位置,而不管该函数被调用了多少次"和" volatile",这意味着"这是我SoC上其他地方的寄存器,或者我没有的其他设备上的某个寄存器控制;编译器,即使我们认为我们从以前的读取中知道我的价值,而代码中没有中间写入,也请不要优化读取。"

"自动"既用于递归函数,也用于在不同的执行线程中同时运行同一函数。例如,如果我们"分叉"了N个不同的块(使用Verilog的fork-> join语句),并让它们全部同时调用相同的函数,则作为递归调用自身的函数会出现相同的问题。

在许多情况下,无需将任务或者功能声明为"自动",代码就可以了,但是除非我们特别需要,否则将其放入其中是一种很好的做法。