2014年4月20日 星期日

從 IC流程中探索數位工程師的風格--I

今天想跟大家提一下IC 流程。因為我未來的分享也是和它有關。先溝通認知的部份,才能繼續下去。

我認為數位工程師的風格有很多,就像軟體工程師的風格也有很多種類。數位工程師的風格的分類,我是依據 IC流程來做分類的。每位數位工程師專精的地方有所不同,所以解決問題的思維也就不同。了解清楚 IC流程的權則劃分後,我會舉一些案例,讓大家去思考流程中的關鍵是什麼?初學者藉由這樣子的思索,探索想成為什麼樣子風格的數位工程師。


Fig: IC design flow
簡單說明一下流程。流程的開始是從規格的制定開始。確定規格後,開始規劃晶片的架構及功能。分配完工作後,就開始RTL coding。一邊coding一邊跑RT-level模擬。如果有錯誤,就回去修改RTL. 驗證所有的Design後,就去FPGA平台驗證,確認無誤後就可以合成netlistNetlistRTL做比對,確認兩者是相等的,就跑Gate-level 模擬。如果結果不是自己想要話,就是回到DC重新合成或是到修改RTL。都沒有錯,就給後段工程師APR. APR後,就跑Post-level 模擬。如果有錯,回到gate-level修正,或是RTL-level修正。如果都沒有錯,CAD工程師把後段的所有工作檢查完。然後就tape-out. 每個步驟都代表階段工作已驗證完畢後,才可以往下一個階段進行。

Fig圖,我們看到,IC流程被分為front-endback-end兩個階段。
先說Front-end: 
我相信每位數位工程師都知道front-end的工作內容,在此就不贅述。數位工程師是否知道front-end階段中,他應該注意哪些細節,才會產出高品質的netlist。我提出幾點來供大家參考,如果你還有更好的想法,歡迎你也提出來分享!

1.RTL code都要是synthesizable(可被合成的),而且知道自己每個constrain的條件以及interfacetiming要符合60/40原則。(60/40原則: 留給別人60%timing margin。自己只用40%, 也有人說是40-20-40比例,40%自己用,40%是別的工程師用, 最後20%是留給CAD工程師做APR使用。)

2. RTL-level simulation coverage 要到90%以上。

3. FPGA驗證到錯誤時,必須把這個錯誤的情況重新複製到RTL-level simulation,建立完整的驗證資料庫,下一位工程師在改程式時,就不用在FPGA驗證時,才發現舊問題。混淆FPGA工程師驗證的流程。

4.合成時,確認每個D-flip-flop都有timing report可讀;每個path都有timing constraininterfacedelay都很完整。Clock的宣告都是符合你的設計想法。

5.做好clock treereset tree的說明,讓CAD工程師了解你的設計想法。

6.確認給CAD工程師的tcl檔案是對的,而且和你的DC tcl檔案是相符合的。

7.確認合成出來的netlist是對的後,才交給CAD工程師。

以上七點,相信大家都是認同的,但是有嚴格要求做到嗎?


舉例來說。相信大家一定看過 Interrupt的機制。如果沒有看過也沒有關係,下面是常見的Interrupt的機制。

原始範例:
always@(posedge clki or negedge rstni)
begin
    if(~rstni)
        IRR00 <=0;
    else if(B==1) //error happend
        IRR00 <=1;
    else
        IRR00<=0;
end

assign IR_EN00 = IRR00 & (REG_IRR_EN[0]);
assign IR_RST00 = (clr_id==4'h0);

  always @(posedge IR_EN00 or negedge IR_RST00)
  if(~ IR_RST00)
      IRR_00_Z1    <= 0;
  else
      IRR_00_Z1    <= 1'b1;
  else
      IRR_00_Z1    <= IRR_00_Z1;


IRR_00_Z1這個D-flip-flop而言,合成時,你有特別宣告IR_EN00clock嗎?IR_RST00位於reset tree上,在做ATPG時,DRC不會過,DC-compiler會幫你修正,但是你怎麼知道它會幫你做?它做的修正是你想要的嗎?是對的嗎?
或許你想反駁,這些的 timing不是很重要,所以不用管。ATPG會幫你修正reset或是clock時,tool不會錯。這樣子的想法和上述哪幾點相衝突?
第一點 timing constrain不曉得要怎麼寫?
第四點 沒有每個D-flip-flop都有timing report,因為 clock無法宣告。
第七點 無法確認合成出來的所有 timing是對的,因為timing report無法全部產生。

如果程式改成下面的情況時,是不是就做到我們的要求?

解決方式一:
always@(posedge clki or negedge rstni)
begin
    if(~rstni)
        IRR00 <=0;
    else if(B==1 & REG_IRR_EN[0]) //error happend
        IRR00 <=1;
    else
        IRR00<=0;
end

always@(posedge clki or negedge rstni)
begin
    if(~rstni)
        IRR00_sync <=0;
    else if(IRR00==1) //error happend
        IRR00_sync <=~IRR00_sync;
    else
        IRR00_sync<=IRR00_sync;
end
     
always@(posedge nosleep_clki or negedge rstni)
begin
    if(~rstni)
    begin
        IRR_00_Z1_pre_sync1 <=0;
        IRR_00_Z1_pre_sync2 <=0;
    end
    else
    begin
        IRR_00_Z1_pre_sync1 <=IRR00_sync;
        IRR_00_Z1_pre_sync2 <=IRR_00_Z1_pre_sync1;
        IRR_00_Z1_pre_sync3 <=IRR_00_Z1_pre_sync2;
    end
end

assign IRR_00_Z1_pre_sync4 = IRR_00_Z1_pre_sync2 ^ IRR_00_Z1_pre_sync3;
     
always@(posedge nosleep_clki or negedge rstni)
begin
    if(~rstni)
    begin
        IRR_00_Z1 <= 0;
    end
    else if(IRR_00_Z1_pre_sync4)
    begin
        IRR_00_Z1 <= 1;
    end
    else if(clr_id==4'h0)
        IRR_00_Z1 <= 0;
    else
        IRR_00_Z1 <= IRR_00_Z1;
End

clki nosleep_clki是我們一定會宣告。跨clock domainfalse-pathIRR_00_Z1的 timing是不是就可以報告出來。

那原來的那段程式,是不是就不要再用?當然不是,我們是要符合七點的要求,design沒有做錯,為什麼要放棄?只要做些修正,重新合成,還是可以用。

解決方式二:
module interrupt_machine (
input clki
,input rstni
,input B
,input [3:0] clr_id
,input scan_mode
,output IRR_00_Z1
)
reg IRR00;
wire IR_EN00;
wire IR_RST00;
reg IRR_00_Z1;
always@(posedge clki or negedge rstni)
begin
    if(~rstni)
        IRR00 <=0;
    else if(B==1) //error happend
        IRR00 <=1;
    else
        IRR00<=0;
end

assign IR_EN00 = IRR00 & (REG_IRR_EN[0]);
assign IR_RST00 =scan_mode?rstni : (clr_id==4'h0);

  always @(posedge IR_EN00 or negedge IR_RST00)
  if(~ IR_RST00)
      IRR_00_Z1    <= 0;
  else
      IRR_00_Z1    <= 1'b1;
  else
      IRR_00_Z1    <= IRR_00_Z1;
     
endmodule

將 Interrupt_machine單獨合成,請CAD工程師幫忙做成 Macro,確保 timing都是你想要的,以call macro方式來合成全部的電路;而 IR_RST00部份,你也修正到適合ATPG情況。當你在跑模擬或是 formal check時,都可以確保你的 reset沒有做錯。

這兩種做法都可以達到你的要求,但是它的差別是什麼你知道嗎?

第一種解決的情況是工程師自己可以解決,可以在RD團隊中解決問題。

第二種是需要CAD工程師幫忙保證你的 interrupt timing,這需要跨部門的合作。

這就是我所說的數位工程師的風格。你是要成為只相信tool的工程師;或是每個module都需要別人幫忙的工程師;亦或是自己可以處理每個bug,並想辦法驗證它的正確性以及 timing constrain的工程師。但是不管是哪一種,都希望你都能符合上述的七個要求。






沒有留言:

張貼留言