生成塊可以動態的生成Verilog代碼。可以用於對矢量中的多個位進行重複操作、多個模塊的實例引用的重複操作、根據參數確定程序中是否包含某段代碼。生成語句可以控制變量的聲明、任務和函數的調用、還能對實例引用進行全面的控制。在編程時,應用關鍵字generate_endgenerate來說明生成的實例範圍。
生成實例可以是一下的以下一種或多種類型:
1)模塊 ; 2)用戶定語原語 ; 3)門級原語 ; 4)連續賦值語句; 5)initial 和 always 塊。
生成實例中語序的數據類型:
1)wire型 reg型;
2)integer型,real型,time型,realtime型;
3)event型。
生成的數據、實例、任務、函數都具有唯一的標識名,可以被層次引用。(任務和函數的聲明可以出現在生成範圍之中,但是不能出現在循環過程當中)
不允許出現在生成範圍之中的模塊項聲明:
1)參數、局部參數;
2)輸入、輸出、輸入/輸出聲明;
3)指定塊。
在Verilog中有三種常見生成語句的方法:
1)循環生成; 2)條件生成; 4)case生成。
A)循環生成語句
循環生成語句允許使用者對下面的模塊或模塊項進行多次的實例引用;
1)變量聲明; 2)模塊; 3)用戶定義原語、門級原語; 4)連續賦值語句; 5)initial 和 always 塊。
例:用循環生成語句描述的脈動加法器
//本地生成一個門級脈動加法器
module ripple_adder(co,sum,a0,a1,ci);
parameter N=4;
output [N-1,0] sum;
output co;
input [N-1,0] a0,a1;
input ci;
wire [N-1,0] carry //本地線網生成語句
assign carry[0] = ci; //指定進位變量的第0位等於進位的輸入
genvar i ; //聲明臨時變量,該變量只用於生成塊的循環中,在確定的仿真代碼中是不存在的。
generate
for( i=0; i<N; i=i+1)
begin:r_loop
wire t1,t2,t3;
xor g1(t1, a0[i], a1[i]);
xor g2(sum[i], t1, carry[i]);
and g3(t2, a0[i], a1[i])
and g4(t3, t1, carry[i])
or g5(carry[i=1], t2, t3)
end
endgenerate
//根據上面的循環生成,Verilog編譯器會自動生成以下相對層次實例名
//xor: r_loop[0].g1, r_loop[1].g1, r_loop[2].g1, r_loop[3].g1;
// r_loop[0].g2, r_loop[1].g2, r_loop[2].g2, r_loop[3].g2;
//and:r_loop[0].g3, r_loop[1].g3, r_loop[2].g3, r_loop[3].g3;
// r_loop[0].g4, r_loop[1].g4, r_loop[2].g4, r_loop[3].g4;
//or : r_loop[0].g5, r_loop[1].g5, r_loop[2].g5, r_loop[3].g5;
//根據上面的生成實例用下面這些線網連接起來
//Nets:r_loop[0].t1, r_loop[0].t2, r_loop[0].t3;
// r_loop[1].t1, r_loop[1].t2, r_loop[1].t3;
// r_loop[2].t1, r_loop[2].t2, r_loop[2].t3;
// r_loop[3].t1, r_loop[3].t2, r_loop[3].t3;
assign co=carry[N];
endmodule
B)條件生成語句
條件生成語句類似於 if_else_if 的生成構造,該結構可以在設計模塊中根據經過仔細推敲並確定表達式,有條件的調用以下結構:
1)模塊; 2)用於定義的原語,門級原語; 3)連續賦值語句; 4)initial 或always 塊。
C)case生成語句
case生成語句可以調用以下的結構:
1)模塊; 2)用於定義的原語,門級原語; 3)連續賦值語句; 4)initial 或 always塊。
由定義來看,在if 和 case的生成語句中,不能夠聲明變量。