Verilog:generate-for 语句(用法,及与for语句区别)
文章目錄
- Abtract
- 1、generate語法
- 2、generate常用的幾種情況舉例說明
- 1). generate-for循環語句
- 2).generate-conditional條件語句
- 3).generate-case分支語句
- 3、Conclusion
- 4、generate-for 與 常規for 循環不同
- 1)使用舉例
- 2)結論
參考鏈接:https://www.cnblogs.com/nanoty/archive/2012/11/13/2768933.html
Abtract
generate語句允許細化時間(Elaboration-time)的選取或者某些語句的重復。這些語句可以包括模塊實例引用的語句、連續賦值語句、always語句、initial語句和門級實例引用語句等。細化時間是指仿真開始前的一個階段,此時所有的設計模塊已經被鏈接到一起,并完成層次的引用。
1、generate語法
- 定義genvar,作為generate種的循環變量。
- generate語句中定義的for語句,必須要有begin,為后續增加標簽做準備。
- begin必須要有名稱,也就是必須要有標簽,因為標簽會作為generate循環的實例名稱。
可以使用在generate語句中的類型主要有:
- module(模塊)
- UDP(用戶自定義原語)
- 門級原語
- 連續賦值語句
- initial或always語句
基本結構如下:
genvar 循環變量名; generate// generate循環語句// generate 條件語句// generate 分支語句// 嵌套的generate語句endgenerate2、generate常用的幾種情況舉例說明
1). generate-for循環語句
2).generate-conditional條件語句
generate允許對語句進行條件選擇,即將條件選擇加入到generate中的for循環中,只例化條件成立時對應的語句或者module。
注意:generate-if中的條件只能是靜態變量,如 genvar,parameter 等,可以這樣想,Verilog是要綜合為固定的硬件電路的,不能因為條件不同而綜合的電路結構變化,所以靜態變量才能保證電路結構相同。
換一種寫法
// 先加了再說,取想要的結果 adder adder_u(.add1(a),.add1('b0),.sum(sum1)); adder adder_u(.add1(sum1),.add1(c),.sum(sum2));adder adder_u(.add1(a),.add1(b),.sum(sum3)); adder adder_u(.add1(sum3),.add1(c),.sum(sum4));always@(posedge clk) beginif(a==b)sum <= sum2;elsesum <= sum4 end更簡單的寫法
// 就兩個加法器,根據操作數的不同送入不同操作數 assign temp = (a=b)?'b:sum1;adder adder_u(.add1(a),.add1(temp),.sum(sum1)); adder adder_u(.add1(sum1),.add1(c),.sum(sum));3).generate-case分支語句
generate-case分支語句與generate-條件語句類似,只不過將原來的分支語句換做了case語句。
3、Conclusion
genvar與generate是Verilog 2001才有的,功能非常強大,可以配合條件語句、分支語句等做一些有規律的例化或者賦值等操作,對于提高簡潔代碼很有幫助,同時也減少了人為的影響。
4、generate-for 與 常規for 循環不同
參考鏈接:https://blog.csdn.net/shnhwdj1984/article/details/80849828
1)使用舉例
// generate-for 循環 reg [3:0] temp; genvar i; generate for (i = 0; i < 3 ; i = i + 1) begin: always @(posedge sysclk) begintemp[i] <= 1'b0;end end endgenerate // for 循環 reg [3:0] temp; genvar i; always @(posedge sysclk) beginfor (i = 0; i < 3 ; i = i + 1) begin: temp[i] <= 1'b0;end end2)結論
1、循環體
- generate-for 循環:每個 iteration 產生一個實例(對應上述 always 模塊),故上述 generate-for 循環產生了3個 always實例;
- for循環:由于for 循環在 always 模塊內部,只產生一個 always 實例
2、須使用 generate-for 的情況
- 循環內、條件語句內,模塊調用
- 模塊物理結構隨參數變化的情形
常規 for 循環不能產生 NUM_OF_A_MODULES個實例
3、物理結構
- generate-for 循環適用于物理結構隨參數變化的模塊。如 選擇時鐘上升沿或下降沿有效
- for 循環:適用于物理結構不變的。推薦 在 always 模塊內部使用 for語句 和 條件語句。雖然綜合結果相同,但是仿真時,non-generate 模塊方法速度更快。(一般,仿真器處理一個 N-bit 操作比處理 N個1bit操作更快)
關于generate-for 和 for 循環對always、assign語句的作用對比,可參考文章 Verilog:generate-for-always 語句用法對比與說明
總結
以上是生活随笔為你收集整理的Verilog:generate-for 语句(用法,及与for语句区别)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 迭代器原理介绍
- 下一篇: OC5864 0.6A 60V 内置MO