zoukankan      html  css  js  c++  java
  • 從 IC流程中探索數位工程師的風格--I

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


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

    簡單說明一下流程。流程的開始是從規格的制定開始。確定規格後,開始規劃晶片的架構及功能。分配完工作後,就開始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的工程師。但是不管是哪一種,都希望你都能符合上述的七個要求。

  • 相关阅读:
    Minimum Depth of Binary Tree leetcode java
    Maximum Depth of Binary Tree leetcode java
    Symmetric Tree leetcode java
    Same Tree leetcode java
    Binary Tree Postorder Traversal leetcode java
    Binary Tree Preorder Traversal leetcode java
    Binary Tree Inorder Traversal leetcode java
    Combinations leetcode java
    一键清除Centos iptables 防火墙所有规则
    阿里云centos7.7x64安装open,并配置ip转发和nat伪装
  • 原文地址:https://www.cnblogs.com/orchid123/p/3677907.html
Copyright © 2011-2022 走看看