2

在函数中使用for循环时,我对verilog中的计时有一些疑问。

  1. 如何估计执行 for 循环正在运行的函数所需的时钟周期?

  2. 以及如何估计一次 for 循环迭代所需的时钟时间。

  3. 函数是否像中断一样工作。例如:如果我在顺序逻辑中调用一个函数,那么一切都会停止,直到函数完成?

[更新] 这里有一些关于我正在使用 for 循环的更多信息。

integer n;

 always@(posedge CLK)
     if(IN)              // some input wire IN   
       begin
         n = n + 1;
         Result[31:0] <= Approx(n); //put Result from Approx into output reg Result
       end

 function [31:0] Approx
    input n;
     integer n;
     real fp;  //some real number to store the approximation result
    begin
      for(integer i=0; i < 2**16; i=i+1) 
         begin
       ... // do Approximation within fixed iteration steps
       ... // Result is a floating point number
         end
     Approx[31:0] = convert_fp_to_bin(fp); //another function with for-loop to convert decimal number into binary number
    end
     ....
4

1 回答 1

1

Verilog 函数构造不允许在其中包含延迟或任何计时构造(例如#@wait等);即,函数的仿真时间不得超过 0。因此,一个函数将始终在 0 时间内完成,因此 0 个时钟周期。函数内部当然允许使用 for 循环,但是,这些 for 循环不能有任何计时结构,因此它们将在 0 时间内执行。因此,如果在任何地方进行函数调用,该函数将运行并在执行该行时确定一个值(通常,可能有一些奇怪的情况,这不是真的,但你必须检查 LRM 以获取信息在这些情况下)。

举个简短​​的例子,假设您有一个名为flip的函数,它只是翻转给定的 4 位向量的位。然后,假设您有以下代码:

initial begin
  ...
  a = flip(b);
  ... // No timing constructs in here
  #10;
  ...
end

always @(*) begin
  d = flip(a);
end

当初始块命中线a = flip(b)时,a将获得b将位反转的值(即,函数将运行,返回值并a分配给该值)。一旦初始块命中#10,always 块可能会触发并分配将翻转的位的da(即 的值b)。因此,在回答您的第三个问题时,函数是内联执行的。请注意,如果您fork在函数中调用,您可能会混淆这一点,但对于基本函数,您可以将它们视为内联。

于 2014-12-27T22:28:00.747 回答