iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 26
0
自我挑戰組

Verilog 從放棄到有趣系列 第 26

[Day26]Timing Problem

  • 分享至 

  • xImage
  •  

昨天談完Implementation之後,今天來談談timing的問題,當timing violation時,原因大多分為set up time violation,跟hold time violation,有興趣的朋友們可以去看一下維基百科或是其他更詳細的解說,這邊對這兩種violation做一個簡單的解釋

Set up time:clock上升前,存進暫存器前需維持一段穩定的時間,才能保證存進暫存器的值沒有問題,這段需維持穩定的時間就稱為set up time.

Hold time:clock上升後,暫存器的值需穩定一段時間,才能保證傳到下一層時的值是正確的,這段穩定的時間就稱為hold time.

通常在single source clock時,比較會出問題的是set up time violation,遇到hold time violation時,可以加幾個buffer緩衝即可,set up time violation通常比較難克服,一般來說是因為運算太複雜導致時間內算不完才會有這問題,今天這邊舉vivado如何看timing有沒有violation.

https://ithelp.ithome.com.tw/upload/images/20180106/20107543UkRNNMjNGn.png

https://ithelp.ithome.com.tw/upload/images/20180106/20107543SZk0DRuDtZ.png

如果遇到set up time violation的話,最簡單的方法就是根據violation的資訊找出有問題的path,然後多加一層register進去,下圖為示意圖.

https://ithelp.ithome.com.tw/upload/images/20180106/20107543nfmszneI6S.png

會遇到timing問題的通常就像上圖,combination運算太過複雜,一個clock做不完的邏輯運算,所以要拆成兩個clock去運算,就像上面這樣,原本的邏輯運算需要12ns,如果run在100MHz(10ns)的clock rate的板子下就會有timing violation,所以找到問題的path,在中間多加一個register進去

always@(posedge clk)begin
  a <= b * c * d;
end

像上面這例子,如果一次做兩個乘法運算遇到timing問題的話,就可以把兩個乘法問算拆成兩個clock去做.

always@(posedge clk)begin
  temp <= b * c;
end
	
always@(posedge clk)begin
  a <= temp * d;
end

雖然這方法能有效解決timing問題,但會影響performance,就上上面的例子,原本預計一個clock就算玩的東西突然要變成兩個clock,效率突然降兩倍,所以明天會再介紹其他幾種不一樣的方式解決timing問題且比較不影響效能的方法.


上一篇
[Day25]淺談FPGA design flow
下一篇
[Day27]用Pipeline解決Timing Violation
系列文
Verilog 從放棄到有趣30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言