資料來源
(1) Verilog系列:【2】generate常用用法 (qq.com)
1.1 generate block作用與語法
(1) 作用:寫出可配置可綜合的RTL,主要用於重復性實例化模塊或者有條件地實例化模塊;
注1:generate語句在解析階段對某些語句進行選取或者重復,這些語句可以包括模塊實例語句、連續賦值語句、always語句、initial語句和門級實例語句等;
(2) 語法:由generate和endgenerate構成.一個verilog generate模塊創建了一個新的層次,就像實例化了一個模塊一樣.
注1:使用genvar作為generate語句塊的循環變量;
(3) 使用:generate中除了port聲明, specify和specparam不能使用外,module中可以使用的所有元素都可以用於generate中(generate不能用於initial begin...end塊中,但是initial begin...end塊可以用於generate中);
1.2 generate語句塊的處理
(1) generate語句在仿真/綜合的elaborate階段進行分析,該步驟位於HDL語言解析之后,在仿真/綜合之前.因此generate結構中所包含的所有表達式在elaborate的時候需要是確定的表達式,不能包含動態變量.比如,generate中的語句可以受parameter影響,但不能受動態變量影響.
1.3 generate語句結構
主要包含兩類: (1) generate loop; (2)conditional generate;
1.3.1 generate loop
(1) 將一段代碼例化多次,通過一個index變量來控制; index變量要先用genvar關鍵字來定義,genvar所定義的index變量會被用在elaboration中. genvar可以存在於generate region(由generate-endgenerate關鍵字來限定)之內或之外.同一個genvar定義的index可以被用在多個generate loop中,只要這些loop沒有相互嵌套.
1.3.2 generate loop code示例
1.3.3 conditional generate(需要補充例子)
在多段代碼中選擇一段進行例化. conditional generate包括if-generate和case-generate兩種不同模式.
(1) if-generate從一組互斥的generate block中最多選擇一個generate block.
(2) case-generate從一組互斥的generate block中選擇一個generate block.用法同傳統的case語句.
1.4 generate block naming
(1) 顯式命名:推薦給generate block顯式命名.
(2) 隱式命名:同一個scope中的每個generate block都被賦予一個數字,從1開始,這個數字對於命名和未命名的generate block都存在,依其在rtl code中出現的順序而定. 所有未命名 的block都會被取一個叫genblk[n]的名字,n就是被賦予的數字.