2016-10-12 27 views
0
  1. 何時在Verilog模塊中執行「GENERATE BLOCK」?
  2. 生成塊內的代碼是否會按順序執行?
+0

請顯示與該問題相關的一些代碼,因爲這樣會更容易給出一個好的答案。 –

+0

@MortenZilmer我一直在閱讀關於IEEE-Verilog pdf中的'Generate'。它表示'生成塊在制定時執行,而不是在模擬時執行'。這種說法是什麼意思? –

+0

詳細闡述是指將所有模塊組合成可以在之後進行仿真的一致設計,並且例如根據模塊在使用位置的配置,爲模塊中的參數分配特定值。 –

回答

0

生成塊不能像總是或初始塊一樣執行,它在精化階段進行評估。產生是常用的實例相同模塊或邏輯,多個實例,例如:

module and_mod (input bit a, input bit b, output out); 
    assign out = a & b; 
endmodule 


module test #( 
    parameter NUM_INSTANCES = 3 
) (
    input bit [NUM_INSTANCES - 1 : 0] a, 
    input bit [NUM_INSTANCES - 1 : 0] b, 
    output bit [NUM_INSTANCES - 1 : 0] a_and_b, 
    output bit [NUM_INSTANCES - 1 : 0] a_or_b, 
    output bit [NUM_INSTANCES - 1 : 0] a_xor_b 
); 


    genvar i; 
    generate 
     for(i = 0; i < NUM_INSTANCES; i++) 
     begin 
     //module instance 
     and_mod and_inst (.a(a[i]),.b(b[i]), .out(a_and_b[i])); 
     //contionous assignement       
     assign a_xor_b[i] = a[i]^b[i]; 

     //always block 
     always @(*) 
     begin 
      a_or_b[i] = a[i] | b[i]; 
     end 
     end 
    endgenerate 
endmodule 

這生成塊將計算爲NUM_INSTANCES的代碼副本內生成塊。正如你所看到的,你可以在模塊實例化,賦值,始終/初始塊內生成塊。請注意,and_mod只有1位寬的端口,因此我們需要3個實例來計算和3位寄存器,但是由於生成了塊,您不必在代碼中編寫3個實例。

執行生成塊內部的代碼依賴於代碼本身,賦值將併發執行,內部始終代碼塊將按順序執行,與沒有生成塊相同。您可以測試here

+0

感謝您的回答。 –

0

生成塊不用於執行。只是,如果你想在模塊中有多個重複塊,那麼你可以使用生成塊。

生成結構用於有條件或多個實例化生成塊到模型中。

生成塊是一個或多個模塊項目的集合。生成塊可能不包含端口聲明,指定塊或specparam聲明。在生成塊中聲明的參數應視爲localparams。所有其他模塊項目,包括其他生成結構,都可以在生成塊中使用。

生成結構提供參數值影響設計結構的能力。它們還允許將具有重複結構的模塊更簡潔地描述,並使遞歸模塊實例化成爲可能。

生成方案在設計過程中進行評估。他們 不會在模擬時間執行。他們在詳述 時間被評估,並且結果在模擬開始之前被確定。

有關更多詳細信息,請參閱SV1800-2012 LRM中的主題27。

+0

感謝您的回答 –