【问题标题】:Verilog automatic taskVerilog 自动任务
【发布时间】: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


    【解决方案1】:

    “自动”实际上意味着“重入”。该术语本身是从软件语言中窃取的——例如,C 具有“auto”关键字,用于声明变量在其所在范围执行时在堆栈上分配,然后再释放,以便同一范围的多次调用执行看不到该变量的持久值。您可能没有听说过 C 中的 this 关键字的原因是它是所有类型的默认存储类 :-) 替代方案是“静态”,这意味着“静态分配此变量(到内存中的单个全局位置),并在程序的整个执行过程中引用同一个内存位置,无论该函数被调用多少次”,以及“易失性”,这意味着“这是我的 SoC 上其他地方的一个寄存器,或者我没有的另一个设备上的某个寄存器控制;编译器,请不要优化对我的读取,即使您认为您从以前的读取中知道我的值,而代码中没有中间写入”。

    “自动”用于递归函数,但也用于在不同的执行线程中同时运行相同的函数。例如,如果你“分叉”出 N 个不同的块(使用 Verilog 的 fork->join 语句),并让它们都同时调用同一个函数,则与递归调用自身的函数会出现同样的问题。

    在许多情况下,您的代码无需将任务或功能声明为“自动”就可以了,但除非您特别需要,否则最好将其放入其中。

    【讨论】:

      【解决方案2】:

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

      你看 - 我们中的一些人使用 Verilog...(呃)

      【讨论】:

        【解决方案3】:

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

        我也是,做verilog!

        【讨论】:

          【解决方案4】:

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

          如果使用不同的值调用正常(即非自动)函数并由模拟器在同一时间片内处理,则返回值是不确定的。这可能是一个很难发现的错误!这只是一个模拟问题,合成后逻辑是正确的。

          使功能自动修复此问题。

          【讨论】:

            【解决方案5】:

            在计算中,如果多个调用可以安全地同时运行,则计算机程序或子程序称为可重入(维基百科)。 简而言之,当一个任务的多个实例同时运行时,关键字自动使其安全。 :D

            【讨论】:

              猜你喜欢
              • 2019-03-13
              • 1970-01-01
              • 2011-06-20
              • 1970-01-01
              • 1970-01-01
              • 2013-10-25
              • 2020-10-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多