2014年5月18日 星期日

數位工程師對DC-compiler的觀念是什麼?

數位工程師是離不開 DC-compiler,他需要 DC-compiler幫他合成 netlist,所以 DC-compiler對數位工程師而言是一個很重要的工具,但是數位工程師有用正確的態度來使用 DC-compiler嗎?
DC-compiler公司因為不曉得你的想法,不曉得你的晶片設計是什麼,所以他們絕大多數都不會用error message來告訴你,你的晶片有什麼問題。他們用warning message來告訴你,你的晶片有什麼異常,請你自己去看,由你自己去判斷。他們用error message來告訴你,你操作DC-compiler的方法是錯的,例如:語法錯、指令錯等等,這是他們肯定知道錯的,所以用error message來告知。

曾有數位工程師跟我說,那只是warning message,又不是 error message,有什麼關係,不用看。我聽了著實嚇了一大跳,一個D-flip-flop沒有辦法 report timing,無法得知它的setup-timehold-time,會叫做「沒有關係」嗎?。在 DC-compiler裏,它只會列出一大堆沒有辦法計算的 timing D-flip-flop,不會告訴你那是 error message。數位工程師要自己去判斷。那你或許會說,為什麼要數位工程師自己判斷,電腦為什麼不自己判斷,DC-compiler有那麼差嗎?

是的,電腦會判斷,但前提是數位工程師要提供完整的條件告訴DC-compiler。曾有數工程師說,DC-compiler會幫你檢查 timing,如果他們的clock是同源的。乍聽下是對的,我就問,DC-compiler有怎麼知道他們是同源的?他回答:「一看就知道。」忽然間我感到不對勁,再問:「要怎麼看?它是電腦,又沒有眼睛。」他回答:「他應該就是會知道。」原來他認為,他所有的 design寫好後,DC-compiler就是會從RTL code知道,不用寫條件,只要create clock 就會知道。這下子,我才明白,原來 DC-compiler還是一個有極高度智慧的AI程式。我想DC-compiler公司聽到這些話,應該會高興到跳起來,因為有人給予DC-compiler這麼高評價。

DC-compiler是一個很棒的工具,但是它不是人工智慧的程式

DC-compiler並不是一個會自我成長的程式,所以,當你使用它的時候,你一定給足所有的條件,讓它來幫你工作。所以它不會「本來就知道」你的設計想法,它需要你「告訴它你的設計想法是什麼」。所以,如果是同源的clock,就是要宣告generated clock。而 Multi-cycle path,一定要寫出來不然它不會曉得。每個 D-flip-flopclock port都是要接到一個被宣告的clock描述語法上,如果沒有,那它就不知道怎麼做,所以會被列到沒有timing constrain的地方。

DC-compilerwarning message是要請您補足你的constrain不是要你每次用人工看message是對或是不對:

DC-compiler是依照一個複雜的演算法來幫忙計算timing的,當它無法用你給的條件來計算時,應該是你要補足constrain條件或是修正你的RTL code,而不是都用人工的方式來看待warning message。或許你會覺得修正你的RTL code是一件很誇張的事;但是,你知道嗎?在十年前,DC-compiler甚至看不懂「function」的verilog語法,所以數位工程師都被禁止使用「 function」這個語法。而現在它看懂了,所以你可以用「function」語法。換句話說,是你去適應它的能力,而不是它來適應你的能力。所以如果你的RTL coding style沒有辦法被看懂時,理應修正RTL code

DC-compiler很笨

有很多工程師認為DC-compiler很笨,常常把假錯(fault error)的 timing列出來。害工程師要多做一次檢查。是的,DC-compiler是很笨,但那是因為你給的constrain不足,所以它無法算出正確的timing給你,所以只好列出來給你看,以免你合出錯的 netlist。所以,是你讓它變笨。

Input delayoutput delay都是別人家的delay

DC-compiler裏,set_input_delayset_output_delay都是在說明別人使用多少delay
例如:如果有一個clock20ns為週期的,

set_input_delay –clock clk_20  15 portA;
set_output_delay –clock clk_20  15 portB;

portA20ns週期的clk_20上,只能用到5ns(20ns-15ns)的時間。portB20ns週期的clk_20上,只能用到5ns(20ns-15ns)的時間。以前有個工程師跟我爭論,set_input_delay這個指令是設別人的delayset_output_delay是設自己的delay。現在我把這個重要的觀念再說一次,大家一定要清楚明白set_input_delayset_output_delay都是設定別人所用的delay;如果要知道自己可以使用多少時間,一定要自己計算( T – delay time)。這個算法,到目前為止(2014/04/21)DC-compiler都還是用這個方法。如果他們有改版,不用這個方法時,我再告訴大家新的計算方法是什麼,不然,它們就是這麼計算的。

DC-compiler的正確態度是什麼?

1. create clock很重要(每個D-flip-flopclock port都會連到的clock),告訴 DC-compiler 每個clock之間的關係,即使用同源的也宣告清楚。

2.每個input delayoutput delay都要確實宣告。你不宣告,它一定是不會知道的。

3. 如果不需要檢查timing的,也要宣告訴清楚,因為它的演算法會幫你做更多事,幫你檢查更詳盡,而你可以更省力。

4. drivingloading要記得給,這對合出準確的 netlist是有幫助的。

5. 只要有warning message就想辦法消除,因為這對DC-compiler合成netlist是有幫助的。

6. 只要是DC-compiler有看不懂RTL code的疑慮,一定要改RTL code來適應它。

7. 數位工程師都是看balance treetiming report。不balance treetiming report也是屬於某段balance treetiming report,所以如果有不balance treetiming report需要檢查時,請把條件寫出來,然後再以balance tree的角度看待timing report

8. resetclock同樣重要,要記得宣告。


DC-compiler是工具,不是一個AI程式,它不會知道你的想法。你必須把設計時的所有條件以及你想要遮罩的條件,一一寫入DC script檔案中。DC才能照你的想法合成 netlist。所有的coding style都是為了讓 DC看懂你的程式,進而合出你的 netlist。

2 則留言: