Part1數字硬件建模SystemVerilog-時序邏輯建模(4)同步和異步復位
數字門級電路可分為兩大類:組合邏輯和時序邏輯。鎖存器是組合邏輯和時序邏輯的一個交叉點,在后面會作為單獨的主題處理。
組合邏輯描述了門級電路,其中邏輯塊的輸出直接反映到該塊的輸入值的組合,例如,雙輸入AND門的輸出是兩個輸入的邏輯與。如果輸入值發生變化,輸出值將反映這一變化,組合邏輯的RTL模型需要反映這種門級行為,這意味著邏輯塊的輸出必須始終反映該邏輯塊當前輸入值的組合。
SystemVerilog有三種在可綜合RTL級別表示組合邏輯的方法:連續賦值語句、always程序塊和函數。接下來幾篇文章將探討每種編碼風格,并推薦最佳實踐編碼風格。
Part2同步和異步復位
在實現層面上,實際的觸發器可以是不可復位的(沒有復位輸入),也可以有一個復位輸入控制。復位控制可以與時鐘同步或異步,也可以是高電平或低電平控制。一些觸發器設備也有一個置位(有時稱為預置)輸入。每種類型的觸發器都有其優點和缺點。這些工程上的權衡不在本文討論的范圍內,本文的重點是反映這些實現特點的RTL建模風格。
注意事項 |
---|
特定的目標ASIC或FPGA器件基本只支持一種類型的復位。 |
ASIC和FPGA在設備使用的復位類型上可能有所不同,這可能會影響RTL的建模風格。特別是FPGA器件,通常只有一種復位類型的觸發器(也許是同步的、高電平的)。相反,許多ASIC器件和一些FPGA器件都有同步和異步觸發器可用。同樣地,一些器件只有復位輸入的觸發器,而其他器件也有置位和復位輸入的觸發器。
最佳實踐指南8-5 |
---|
使用首選的復位類型編寫RTL模型,并讓綜合編譯器將復位功能映射到目標ASIC或FPGA支持的復位類型。只有在有必要的情況下,才編寫RTL模型,以使用特定目標ASIC或FPGA使用的相同類型的復位,從而實現該特定器件的最優速度和面積。 |
許多RTL設計工程師,都是用一種預設的風格或復位來建模,而不關心目標器件支持什么。綜合編譯器可以將RTL模型中的任何類型的復位映射到目標ASIC和FPGA器件中可用的任何類型的復位。例如,如果RTL模型使用主動低電平復位,而目標器件只有主動高電平復位的觸發器,那么綜合編譯器將添加額外的門級邏輯來轉換RTL模型中使用的復位。如果RTL模型使用同步復位,而目標器件只有異步復位的觸發器,那么綜合編譯器將在異步觸發器的外部添加額外的門級邏輯,使其與時鐘同步復位。FPGA有充足的速度和容量。可以得到一個功能齊全的設計,而不必擔心綜合過程是否必須添加一些額外的邏輯,以將RTL風格的復位映射到目標器件的觸發器類型。
Part3不可復位的RTL觸發器模型
一個沒有復位輸入的觸發器只能通過數據輸入和時鐘來控制。RTL模型在每次程序觸發時將數據輸入轉移到觸發器的輸出。沒有任何if-else條件可能會指定數據輸入以外的值。一個不可復位的觸發器的RTL模型的例子是:
always_ff?@(posedge?clk)?q?<=?d;
當綜合在一個特定的ASIC或FPGA目標中實現這個RTL功能時,將選擇該設備庫中可用的觸發器類型。這可能是一個沒有復位或置位輸入的觸發器,一個只有一個復位輸入的觸發器或一個置位和復位輸入都被關斷的觸發器。
Part4同步復位RTL觸發器模型
一個同步復位的觸發器有一個復位輸入,但該輸入只有在時鐘輸入被觸發時才被采樣。RTL模型包含一個if條件,當復位激活時分配一個值,或者當復位不激活時分支到else語句。復位信號不是always程序的靈敏度列表的一部分。靈敏度列表只包含觸發觸發器的時鐘沿。因此,always過程中的編程語句只在時鐘觸發發生時被評估。
下面的例子說明了一個具有主動低電平同步復位的觸發器。
always_ff?@(po?sedge?clk) if?(!rstN)?q?<=?'0;?//?同步有源低電平復位 else?q?<=?d;
當綜合將這個RTL功能映射到一個特定的FPGA目標時,如果有同步復位的觸發器,將選擇一個觸發器。如果目標器件有高電平觸發器,綜合將為rstN信號添加一個反相器。如果目標器件中沒有同步復位的觸發器,同步復位信號將與觸發器的數據輸入相加。任何時候復位都是有效的,一個0將被輸入到觸發器的時鐘中,這就提供了一個與時鐘同步的復位功能。如果目標設備的觸發器也有異步復位或置位輸入,它們將被綁在一起,處于非活動狀態。
圖8-8顯示了針對通用觸發器的綜合結果,該器件具有同步復位觸發器,即Xilinx Virtex ?-7 ? FPGA。觸發器的復位是高電平有效,所以rstN輸入是反相的。
圖 8-7: 綜合結果。異步復位DFF映射到Xilinx Virtex -7 FPGA中
圖8-8顯示了將相同的通用觸發器定位到沒有同步復位觸發器的設備上的結果,即XilinxCoolRunner-11 CPLD。該觸發器的異步高電平有效CLR和PRE輸入沒有被使用。
圖8-8:綜合結果。映射到Xilinx CoolRunner-11 CPLD的異步復位
Part5異步復位RTL觸發器模型
一個具有異步復位的觸發器有一個復位控制輸入,在復位生效的那一刻將改變觸發器的狀態,與時鐘無關。RTL模型的靈敏度列表包含了觸發觸發器的時鐘邊沿和復位信號的邊沿。因為復位的邊沿在敏感度列表中,所以只要復位有效,always程序就會觸發,而不需要等待時鐘輸入的變化。RTL模型包含一個if條件,當復位激活時分配一個值,或者當復位不激活時分支到else語句。
下面的例子模擬了一個具有主動低電平異步復位的觸發器。
always_ff?@?(?posedgeclk?or?negedge?rstN) if?(!rstN)?q?<=?'0;?//?主動低電平異步復位 else?q?<=?d;
忽略異步復位的尾部邊沿。always程序的一個綜合要求是,如果posedge或negedge被用于敏感度列表中的一個信號,那么必須為這個列表中的所有信號指定一個邊沿。下面的代碼片斷是不能綜合的,因為rstN沒有用posedge或negedge限定。
always?@(posedge?clk?or?rstN)?//?incorrect?sensitivity? if?(!rstN)?q?<='0;?//?Asynchronous?active-low?reset? else?q?<=?d;
正確的行為還要求只有異步復位的邊沿被列在always程序的敏感度列表中。敏感度列表決定了always程序中的編程語句何時被執行。對于異步復位,敏感度列表需要在復位激活時觸發,以便立即復位觸發器。然而,如果always程序也在復位回到非活動狀態時觸發,那么復位活動的if測試將評估為假,else分支將被執行。在沒有時鐘邊沿的情況下,看起來就像發生了一個時鐘事件。圖8-9顯示了一個波形,說明了上述代碼片段的不正確的仿真行為。
圖8-9:不正確建模的異步復位結果的波形
仿真和綜合都要求在敏感列表中只包括異步復位的邊沿--仿真要求這樣做以獲得正確的異步復位行為,而綜合則在語法上要求這樣。SystemVerilog的語法并沒有強制執行這個限制。
這是一種RTL編碼風格,設計人員必須遵循。Lint檢查器可以檢查這個編碼風格是否被遵循。
| 最佳實踐指南8-6 || :--------- | | -----------: || 在使用高電平或低電平復位時要保持一致。對高電平和低電平控制信號使用一致的命名規則。 |
雖然可以使用高電平或低電平復位,但項目中的所有RTL模型應該是一致的。
混合的復位極性會導致代碼難以理解、維護和重用。
本文采用的慣例是在有低電平信號的名稱后面加上一個大寫的"N"。另一個常見的慣例是在有源低電平信號名稱后面加上"_n"。
Part6異步置位-復位觸發器
一些觸發器同時具有復位和置位控制輸入。一個if-else-if決策系列被用來模擬這種行為,如下面的例子。
一個if-else-if語句將優先考慮被測試的第一個輸入。在上面的例子中,如果兩者同時激活,那么復位就會優先于置位輸入。
注意事項 |
---|
在RTL模型中給予置位或復位輸入的優先權應與特定的目標ASIC或FPGA器件相匹配。有些器件優先考慮復位輸入,而其他器件則優先考慮置位輸入。 |
最佳實踐指南8-7 |
---|
為了達到最佳的綜合結果質量(QoR),對RTL觸發器進行建模,只需要一個復位輸入或一個置位輸入。如果設計的功能需要,只對置位/復位觸發器進行建模。 |
如果需要一個置位/復位的觸發器行為,請為置位和復位編寫RTL模型的優先級,以匹配設計將在其中實現的特定目標器件的優先級。由于并不是所有的目標器件都有相同的置位/復位優先級,因此很難編寫置位/復位觸發器RTL模型,就很難為所有目標器件進行最佳綜合。如果目標器件沒有與RTL模型具有相同優先級的置位/復位觸發器,綜合編譯器可以在觸發器之外添加額外的邏輯,使其與RTL模型相匹配。然而,這種額外的邏輯可能會影響器件的時序,并且在從復位狀態出來時,會引起與設計中其他部分的競爭條件。
置位/復位觸發器對這些輸入也有更嚴格的建立和保持時間,而觸發器只有一個置位或復位輸入,但沒有兩個。即使RTL模型中置位和復位的優先級與目標器件的優先級一致,設計人員也需要注意設計是否能滿足這些建立和保持時間要求。
置位/復位觸發器的仿真故障。上面顯示的置位-復位觸發器RTL模型的例子在功能上是正確的,并且可以正確地進行綜合。但是,這段代碼有一個潛在的仿真故障。如果setN和rstN的控制輸入同時有效,然后rstN變得無效,就會出現這種故障。在這個例子中,rstN具有優先權,并且觸發器正確復位。當rstN輸入變得不活躍,setN輸入應該接管,并且觸發器應該切換到其置位狀態。仿真中的故障是,RTL模型只對rstN的前邊沿敏感--這 ?是 ?綜合編譯器的要求--而對rstN的前后邊沿不敏感。當rstN變得不活躍時,敏感度列表將不會觸發,因此錯過了置位觸發器,即使setN仍然活躍。這個故障只持續到時鐘的下一個正邊沿,它將觸發always程序,并導致該程序被重新評估。
防止這種仿真故障的辦法是將復位的后邊沿添加到靈敏度列表中。然而,僅僅增加復位的后邊沿會導致前面描述的同樣問題,即復位的后邊沿可以作為一個時鐘。因此,復位輸入的非活動電平需要與置位輸入的活動電平相加,當該結果為真時,靈敏度列表將被觸發。
為防止仿真故障,修訂后的敏感度列表為:
對表達式的結果進行觸發在SystemVerilog語言中是合法的,但綜合編譯器不允許。為了避免仿真故障,需要從綜合中隱藏額外的觸發。這可以通過使用綜合的translate_off/translate_on pragmas來實現。綜合語是以synthesis一詞開頭的特殊語句。仿真器會忽略這些注釋,但綜合編譯器會對它們采取行動。下面的片段添加了translate_off/translate_on語句。
圖8-12顯示了綜合這個置位-復位觸發器代碼的結果。
圖8-12:一個異步置位-復位觸發器的綜合結果
請注意,綜合編譯器在通用觸發器的set輸入之前添加了額外的邏輯,以強制執行rstN比setN有優先權。如果目標ASIC或FPGA設備有set/reset觸發器,其中reset優先于set,那么當通用觸發器被映射到ASIC或FPGA時,這個附加邏輯將被刪除。否則,附加邏輯將被保留,以便ASIC或FPGA實現與RTL模型相匹配。
在針對特定的ASIC或FPGA之前,綜合編譯器使用的通用觸發器具有高電平有效的置位和復位輸入。因此,綜合編譯器在RTL模型中對有源低電平信號添加了反相器。如果目標器件具有低電平有效的控制輸入,這些反相器將被刪除。
使用translate_off和translate_on綜合pragmas的另一種方法是使用條件編譯。大多數綜合編譯器都有一個預定義的SYNTHESIS宏,可以用來有條件地包括或排除綜合工具所編譯的代碼。要排除前面例子中的不可綜合的那一行,代碼應該是。
編輯:黃飛
?
評論
查看更多