2014年9月18日 星期四

timing loop和combinational loop的不同

真是抱歉! 最近公司的事情比較多,所以就比較沒有時間寫新文章分享!

今天是要分享一下,在合成時,我們會遇到的兩個廻圈電路問題。

在合成時,合成器會告訴你,你的程式在合成電路時,是否會有迴圈電路產生。一個是循序廻圈電路(timing loop circuit),另一個是邏輯廻圈電路(combinational loop circuit)。比較常聽到的是邏輯廻圈電路,比較少聽到循序廻圈電路。而一般來說,也很難在合成階段才看到邏輯廻圈電路的錯誤訊息。因為在合成電路以前,你會跑很多軟體來驗證RTL code,它們都會將邏輯廻圈電路錯誤告訴你,修正這個錯誤。所以合成階段就會很少看到,但是合成器是有能力驗證出邏輯廻圈電路的錯誤的。大家要知道這件事實。

循序廻圈電路問題:是雞生蛋、蛋生雞的問題。為什麼會這麼說?之後的圖示,你應該就會看出來原因。合成器會告訴你這個是警告(warning) 訊息,然把這個路徑條列出來。合成器列出來的路徑通常都是在clock path

邏輯廻圈電路:是無窮廻圈問題。合成器會告訴你這個是錯誤(Error) 訊息。

循序廻圈電路和邏輯廻圈電路是不一樣的事件。邏輯廻圈電路是同一時間無窮廻圈,這是一個嚴重的錯誤程式設計行為,所以一定要修正。而循序廻圈電路是不同一時間無窮廻圈,所以不一定要修正,但是要知道。

什麼是循序廻圈電路?什麼是邏輯廻圈電路?下面的圖示可以明顯告訴你。

Fig1: 循序廻圈電路


Fig2: 邏輯廻圈電路



循序廻圈電路用白話一點的解釋,我需要有一個clock domain,來讓循序邏輯選擇使用哪一個clock?但因為還沒有決定clock ,所以還不能選擇使用哪一個clock?因為沒有選擇使用哪一個clock,所以就沒有clock domain可以來決定?因為沒有clock domain,所以就沒有辦法選擇使用哪一個clock?就這樣子,一直得廻圈。
邏輯廻圈電路相信大家就更了解了,就不多做說明。

下面貼一張合成器的警告訊息

解決的方法有:
1. 設定clock的起始點在pA點上,不要在clk0clk1
2. set_case_analysis,強制設定clk_sel的值。

其實,這是一個警告訊息,或許有人會告訴你這不影響合成電路的結果,不用理它。Timing_loop確實是一個不會影響合成電路正確性的警告訊息;但是如果它完全不會有任何影響,為什麼合成器要顯示這個訊息出來?它想「善意」地提醒工程師什麼事情呢?
換另一個的角度來思考;用程式寫出來的電路,我們是否已有預期知道會有一個廻圈電路產生?如果有,是不是就可以利用這個警告訊息來驗證我們的想法和路徑。如果沒有,我們也可以用這個警告訊息來了解到底是哪一個環節出忽意料之外,產生我們所無法預期的行為。
另外,利用set_case_analysis來讓警告訊消息的方式,也是可以讓我們知道廻圈的癥結點是否已經被完全掌握?如果沒有,我們就可以利用這個警告訊息,知道原來還有些電路是我們所不知道的。我們就可以再深入了解,以期望能百分百掌握電路。

很多工程師都忽視Design Compiler的警告訊息,我覺得這不是一個好現象。數位工程師本來就需要很多軟體的輔佐,來讓自己寫出沒有錯誤且穩定的電路。這些警告訊息其實也是一種輔佐方法,讓工程師更了解自己的電路,而不是只用simulator來了解電路。接受各種軟體的不同訊息,可以讓你對RTL coding的掌握度更高。說不定,有時候還可以得到不一樣的程式經驗。