函数中的for循环

时间:2014-12-27 21:30:32

标签: verilog xilinx-ise

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

  1. 如何估计执行for循环运行功能所需的时钟周期?

  2. 如何估算一次循环迭代所需的时钟时间。

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

  4. [更新] 这里有一些关于我正在使用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
         ....
    

1 个答案:

答案 0 :(得分: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的值,该位​​将反转(即,函数将运行,返回的值和{{1分配给该值)。初始阻止命中a后,始终阻止可能会触发并分配#10 d的值将翻转位(即a的值)。因此,在回答第3个问题时,函数是内联执行的。请注意,如果您在函数中调用b,则可能会混淆此函数,但对于基本函数,您可以将它们视为内联函数。