Verilog 函数中的循环

Verilog 函数中的循环,verilog,xilinx-ise,Verilog,Xilinx Ise,在函数中使用for循环时,我对verilog中的计时有一些疑问 如何估计执行for循环正在运行的函数所需的时钟周期 我如何估计一次for循环迭代所需的时钟时间 函数的工作方式是否类似于中断。例如:如果我在顺序逻辑中调用一个函数,那么在函数完成之前,一切都会停止吗 [更新] 下面是关于我使用for循环的更多信息 integer n; always@(posedge CLK) if(IN) // some input wire IN beg

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

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

  • 我如何估计一次for循环迭代所需的时钟时间

  • 函数的工作方式是否类似于中断。例如:如果我在顺序逻辑中调用一个函数,那么在函数完成之前,一切都会停止吗

  • [更新] 下面是关于我使用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
         ....
    
    整数n;
    始终@(posedge CLK)
    if(IN)//某些输入线IN
    开始
    n=n+1;
    
    结果[31:0]Verilog函数结构不允许延迟或任何计时结构(如
    @
    等待
    等);即,函数的模拟时间不允许超过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块可能会触发并分配
    d
    位翻转后的
    a
    值(即
    b
    )。所以,在回答第三个问题时,函数是内联执行的。注意,如果在函数中调用
    fork
    ,可能会混淆这一点,但对于基本函数,您可以将其视为内联。

    函数和for循环与时钟周期无关。函数和循环只是一种语言特性,允许设计者更容易地描述硬件或以更简单的方式构建测试台。“用顺序逻辑调用函数,而不是在函数完成之前停止一切”。否每次调用函数时,都会创建另一个硬件块。Verilog描述了硬件,没有其他语言的“呼叫”。谢谢!正如我看到的,您提供了一个实现示例,而不是一个测试台示例。如果在硬件上运行的函数中有这样一个带有for循环的模块,“0模拟时间”意味着什么?在测试台外使用for循环时,编程是否糟糕?目前,我无法想象这样的代码将如何在硬件上实现。@kt通常对于刚接触Verilog的人来说,非常不鼓励在结构代码(即,描述要合成的硬件的代码;而不是测试台代码的验证)中使用For循环,因为人们可以将For循环用作编程构造,当他们真的应该描述(并且真的希望硬件表现得像)FSM时。但是,任何可以在编译时展开的for循环;ie没有可变的循环数,在Verilog中完全可以。对于较新版本的LRM,有更多的方法可以摆脱循环,但它们仍然可以使用。简短的版本是:如果你想在HDL中创建一个需要时间(如多个周期)的for循环,你真的想实现一个FSM,应该这样做。@kt我所说的“在编译时展开”是什么意思当合成工具运行时,必须知道循环中的迭代次数(即循环次数)。例如(inti=0;i<5;i++)
    ;我们知道循环将运行5次。或者
    for(int i=0;i
    其中
    SOMETHING
    是模块的参数。我们不能做的是基于输入或其他变量的循环(int i=0;i其中
    something
    是一个输入、寄存器、导线等(在硬件运行或模拟运行时会发生变化)@Paebbels在这种情况下,计数器的作用就像一个FSM,只是你的状态都是数字:)但是,是的,如果在一个周期内进行计算所需的组合逻辑太大(可能有实数),计数器是一个很好的解决方案。在这种情况下,您需要通过管道进行计算。