日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Verilog:generate-for 语句(用法,及与for语句区别)

發布時間:2024/1/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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語句endgenerate

2、generate常用的幾種情況舉例說明

1). generate-for循環語句

2).generate-conditional條件語句

generate允許對語句進行條件選擇,即將條件選擇加入到generate中的for循環中,只例化條件成立時對應的語句或者module。

注意:generate-if中的條件只能是靜態變量,如 genvar,parameter 等,可以這樣想,Verilog是要綜合為固定的硬件電路的,不能因為條件不同而綜合的電路結構變化,所以靜態變量才能保證電路結構相同。

// 錯誤代碼:這樣電路肯定會報錯 a is not a constant generateif(a=b)begin:a_equals_badder adder_u(.add1(a),.add1(c),.sum(sum));endelsebeginadder adder_u(.add1(a),.add1(b),.sum(sum1));adder adder_u(.add1(sum1),.add1(c),.sum(sum));end endgenerate

換一種寫法

// 先加了再說,取想要的結果 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 end

2)結論

1、循環體

  • generate-for 循環:每個 iteration 產生一個實例(對應上述 always 模塊),故上述 generate-for 循環產生了3個 always實例;
  • for循環:由于for 循環在 always 模塊內部,只產生一個 always 實例

2、須使用 generate-for 的情況

  • 循環內、條件語句內,模塊調用
  • 模塊物理結構隨參數變化的情形
// 循環中進行模塊實例化 module A(); .. endmodule;module B(); parameter NUM_OF_A_MODULES = 2; // should be overriden from higher hierarchy genvar i;generatefor (i=0 i<NUM_OF_A_MODULES; i=i+1) begin : labelA A_inst();end endgenerateendmodule;

常規 for 循環不能產生 NUM_OF_A_MODULES個實例

3、物理結構

  • generate-for 循環適用于物理結構隨參數變化的模塊。如 選擇時鐘上升沿或下降沿有效
if (param_use_pos == 1) begin : use_posalways @(posedge sysclk) begin...end end else begin : use_negalways @(negedge sysclk) begin...end end
  • for 循環:適用于物理結構不變的。推薦 在 always 模塊內部使用 for語句 和 條件語句。雖然綜合結果相同,但是仿真時,non-generate 模塊方法速度更快。(一般,仿真器處理一個 N-bit 操作比處理 N個1bit操作更快)
/ faster :: 1 always block, simulator can optimize the for loop always @(posedge sysclk) begin for (i = 0; i < 3 ; i = i + 1) begintemp[i] <= 1'b0;end end// slower :: creates 4 always blocks, harder for the simulator to optimize genvar i; generate // optional if > *-2001 for (i = 0; i < 3 ; i = i + 1) begin always @(posedge sysclk) begintemp[i] <= 1'b0;end end endgenerate // match generate

關于generate-for 和 for 循環對always、assign語句的作用對比,可參考文章 Verilog:generate-for-always 語句用法對比與說明

總結

以上是生活随笔為你收集整理的Verilog:generate-for 语句(用法,及与for语句区别)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。