2014-12-27 177 views
1

我有一些關於在函數中使用for循環時verilog中的時間問題。功能for循環

  1. 如何估算執行for-loop操作函數所需的時鐘週期?

  2. 我該如何估計一個for-loop迭代所需的時鐘時間。

  3. 函數的工作原理與中斷類似嗎?例如:如果我在順序邏輯中調用一個函數,那麼在函數完成之前,所有內容都會暫停一次?

[更新] 以下是關於我正在使用for循環的更多信息。

integer n; 

[email protected](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 
    .... 
+0

函數和for-loops與時鐘週期無關。函數和循環只是一種語言功能,可以讓設計人員更輕鬆地描述硬件,或以更簡單的方式構建測試平臺。 – Paebbels

+0

'在順序邏輯中調用一個函數,比一切都停止,直到函數完成'。每次調用一個函數都不會創建另一個硬件塊。 Verilog描述硬件,沒有像其他語言那樣的「調用」。 – Morgan

回答

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,始終塊可能會觸發並指定da的值會翻轉(即值爲b)。所以,在回答你的第三個問題時,函數是內聯執行的。請注意,如果您在函數中調用fork,則可能會造成混淆,但對於基本功能,您可以將它們視爲內聯。

+0

謝謝!正如我看到您提供了一個實現示例,而不是測試臺示例。什麼是「0模擬時間」意味着如果我在硬件上運行的函數中有這樣一個帶for循環的模塊?在測試平臺之外使用for-loops時它是不好的編程嗎?目前,我無法想象這些代碼將如何在硬件上實現。 –

+3

@kt通常,對於Verilog新手而言,在結構化代碼內部使用for-loop(即描述要合成的硬件的代碼,而不是測試平臺代碼的驗證)是非常令人沮喪的,因爲人們有一種使用for-loops作爲編程構造,當他們真的應該描述(並且真的希望硬件表現得像)FSM。但是,任何可以在編譯時展開的for循環;即沒有可變數量的週期,在Verilog中是完全正確的。使用較新版本的LRM,有更多方法擺脫循環,但仍然可以使用。 – Unn

+3

這個簡短的版本是:如果你想在你的HDL中做一個需要時間的循環(比如多個循環),你真的想要實現一個FSM並且應該這麼做。 – Unn