在Verilog-2001中新增了語句generate,通過generate循環,可以產生一個對象(比如一個元件或者是一個模塊)的多次例化,為可變尺度的設計提供了方便,generate語句一般在循環和條件語句中使用,為此,Verilog-2001增加了四個關鍵字generate,endgenerate, genvar, localparam,genvar是一個新增的數據類型,用在generate的循環中的標尺變量必須定義為gnevar類型。
- 首先設計一個1bit位寬的buffer_1,這里有幾點需要注意的是:
- module頭的申明,這里采用了verilog-2005的風格,目前來講的稍微新一點的仿真/綜合工具都是支持的;
- 這種風格相比較verilog-1995/2002等,要簡潔明了,便於代碼的閱讀和維護;
1 //1bit width buffer_1 2 3 module buffer_1( 4 input wire in, 5 output wire out 6 ); 7 assign out = ~in; 8 9 endmodule
- 在buffer_8中例化buffer_1 8次,這里有幾點需要注意:
- 循環變量i必須是genvar類型的,不可以是reg型,integer型;
- for循環之后的的begin最好加上一個標號(BLOCK1);
1 //8bit width buffer 2 3 module buffer_8( 4 input wire[7:0] din, 5 output wire[7:0] dout 6 ); 7 8 // Generate block 9 genvar i; 10 generate 11 for(i=0; i<8; i=i+1) begin:BLOCK1 12 buffer_1 buffer_1_1(.in(din[i]), .out(dout[i])); 13 end 14 endgenerate 15 16 endmodule
- 這里給出了一個簡單的頂層
1 //testbench 2 module buffer_8_tb; 4 // reg & wire define area 5 reg [7:0] din; 6 wire[7:0] dout; 7 8 // Instance the DUT 9 buffer_8 buffer_8_1( 10 .din (din ), 11 .dout (dout ) 12 ); 13 14 // Generate the stimulate 15 initial begin 16 din = 8'd7; 17 #10; din = 8'd6; 18 #10; din = 8'd4; 19 #10; din = 8'd7; 20 #10; $finish(); 21 end 22 23 endmodule
湯曉東
2014-06-13 晚 於蘇州