Verilog的generate語句能夠幫助我們寫出可配置可綜合的RTL,主要用于重復性實例化模塊或者有條件地實例化模塊。這篇文章將簡單回顧一下verilog generate語句。
Verilog generate語句的類型一
有兩種不同的generate語句結構。
Generate loop能夠將一段代碼例化多次,通過一個index變量來控制。
conditional generate語句能夠在多段代碼中選擇一段進行例化。Conditional generate包括了if-generate和case-generate兩種不同模式。
Verilog的generate語句在仿真/綜合的elaborate階段進行分析,這個步驟發生在HDL語言解析之后,在仿真/綜合之前。因此generate結構中包含的所有表達式在elaborate的時候都要是確定的表達式,不能包含動態變量。比如,generate中的語句能受parameter影響,但不能被動態變量影響。
一個verilog generate模塊創建了一個新的層次,就像實例化了一個模塊一樣。
關鍵字generate和end generate(以及begin/end)實際上不是必須的,如果使用的話,那么他們就定義了一塊generate的區域,generate的區域只能存在于在module這個scope里。
generate loop一
Generate loop的語法和for loop很類似。Index變量要先用genvar關鍵字來定義,genvar所定義的index變量會被用在elaboration中。Genvar可以存在于generate region(由generate-endgenerate關鍵字來限定)之內或之外。同一個genvar定義的index可以被用在多個generate loop中,只要這些loop沒有互相嵌套。
如果將generate loop展開,在每個generate loop instance中,都會創建一個隱含的localparam,其名字和類型與genvar所定義的index相同,其值就是當前的循環次數。這個localparam能夠用來控制生成代碼。
Generate loop所生成的模塊可以被命名也可以不被命名。如果被命名,那么將會生成以所給名字開頭的一個數組,每個數組元素是一個模塊hierarchy。有些工具對于未命名的generate loop會給予警告,因此最好將其命名。
下面的例子是一個使用verilog generate loop來生成的格雷碼->二進制碼的轉換器:
另外一個來自verilog-2005 LRM的例子闡述了每個verilog generate loop是如何生成一個新的scope的。注意到wire t1,t2,t3都是在generate loop中被聲明的,每個loop iteration都創建了完全不沖突的三個t1,t2,t3。他們都被用于在每個不同的數組模塊中連接相應的電路。并且注意到這些被實例化的xor,and的命名方式。
generate loop同樣能嵌套。只需要單一一個generate/endgenerate來包裹這些嵌套的generate loop。每個generate loop都建立一個新的scope。
if-generate一
Conditional if-generate會從一組互斥的generate block中最多選擇一個generate block。注意到這里說的是最多選擇一個,也有可能一個都不選。而這個判斷語句在elaborate的時候也必須是常量表達式。
與generate loop一樣,conditional if-generate可以命名也可以不命名,可以使用也可以不使用begin-end。它同樣會創建一個新的scope以及hierarchy層次。因為conditional generate選擇至多一個block的代碼,對于互斥的block code,在同一個if-generate結構里可以有同樣的命名。這能夠幫助保留層次名,無論哪個block的代碼被選擇。而不同的generate結構則一定要有不同的名字。
case-generate一
與if-generate類似。case-generate最多會從一組互斥的generate block中選擇一個generate block。它的用法和傳統的case語句一樣。
嵌套的 conditional generate block沒有用begin end來切割會被歸為單獨一個scope/hierarchy。這能夠避免在同一個module中創建沒變要的scope/hierarchy。下面的例子是一個嵌套conditional generate block的例子
generate結構會選擇至多一個叫u1的generate block。而g1的hierarchcal名字是test.u1.g1。當嵌套if-generate 結構的時候,else永遠屬于最近的if。注意到這里任何多余的begin-end會違反這個direct nest規則,從而生成新的hierarchy。
generate模塊命名一
推薦給generate construct命名來簡化層次索引。并且有些工具對于不命名的generate block會報錯。
如果不命名的話,首先,每個generate construct在一個scope中都被賦予了一個數字,從1開始。看其在rtl code中是第幾個出現的generate就被賦值為幾。這個數字對于命名和未命名的generate block都有。所有未命名的block都會被取一個叫genblk【n】的名字,n就是被賦予的數字。
很明顯隨著RTL規則的改動這些未命名的generate construct的名字也會改變。這樣對于保證RTL層次化會有困難。因此建議總是對generate block進行命名。
小結一
Generate 結構在創建可配置的RTL的時候很有用。Generate loop能夠讓語句實例化多次,通過index來控制。而conditional generate能夠選擇性地實例化語句。最重要的是要記得對generate construct進行命名,這能夠幫助簡化層次對象以及代碼維護。
-
Verilog
+關注
關注
28文章
1351瀏覽量
110158
原文標題:Verilog——關于generate語句
文章出處:【微信號:ic_frontend,微信公眾號:數字前端ic芯片設計】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論