# IC Design & VLSI CAD ## Reference #### 1. [IC Design](https://www.youtube.com/playlist?list=PLalv9iDiCjWNUJCOSV4WYeDzpbqbAj1Tv) #### 2. [VLSI CAD I](https://www.coursera.org/learn/vlsi-cad-logic/lecture/CBOe2/welcome-and-introduction) #### 3. [VLSI CAD II](https://www.coursera.org/learn/vlsi-cad-layout/home/week/1) ## IC Design ### Overview #### 數位電路 - 輸入是一系列**bitstream**,根據電路的運算處理,輸出是一系列的**bitstream** - 根據設計來設定怎樣是0、怎樣是1 - ![](https://hackmd.io/_uploads/HkmHHZ0Dn.png) - ![](https://hackmd.io/_uploads/rkldr-Cwn.png) #### 邏輯閘 (Logic Gates) - **邏輯閘(logic gates): 基礎六個閘** - ![](https://hackmd.io/_uploads/BySxdWCvh.png) - ![](https://hackmd.io/_uploads/SyhGOW0Pn.png) - ![](https://hackmd.io/_uploads/BkYE_-RPh.png) - ![](https://hackmd.io/_uploads/S16a_-Rwh.png) - ![](https://hackmd.io/_uploads/BkiGtbCv2.png) - ![](https://hackmd.io/_uploads/ByxEY-0vn.png) - 統整表: - ![](https://hackmd.io/_uploads/SJQ9Y-CP3.png) - ![](https://hackmd.io/_uploads/HyBhF-Av3.png) - 簡單數位電路 - ![](https://hackmd.io/_uploads/S12mUbRP3.png) - 電路 (Circuits) - 其中的一個閘(gate)一般由2~14個電晶體組成 - 透過**一組互動的閘**來達成特定邏輯功能就是一個電路 - 許多電路放在一個**PCB** (printed circuit board)板上即是一個系統 - ![](https://hackmd.io/_uploads/SJiJlEAP2.png) ### 布林代數 (Boolean Algebra) - 二值 (Two-valued) - B = {0, 1} - 封閉性(Closure): 運算結果不是0就是1 - 特性: - ![](https://hackmd.io/_uploads/r1D-G40P2.png) - involution: 做兩次not會得到原本的結果 - commutative(交換律) : 位置交換不重要 - associative(結合律) : 先後順序不重要 - distributive(分配律): 見圖 - **demorgan(笛摩根)**: 見圖 - absorption: 見圖 - 表示 (representations): - ![](https://hackmd.io/_uploads/Hkdw3VCvn.png) - 1. Boolean Algebra - 2. Truth Table - 3. Circuit Diagram - 判斷兩個電路相同: - 可用**布林代數證明**,也可用**真值表證明** - ![](https://hackmd.io/_uploads/Sk37R40P3.png) - **笛摩根定理很常用** - ![](https://hackmd.io/_uploads/ryJgeHCwn.png) - ![](https://hackmd.io/_uploads/BJeZlBCP2.png) - ![](https://hackmd.io/_uploads/r1bY-SRPn.png) - ![](https://hackmd.io/_uploads/SJm1MHAwh.png) - ![](https://hackmd.io/_uploads/BJ_SfBCD3.png) ### MinTerms and Maxterms - #### Minterms and Maxterms - 表示上需要包含所有的變數 - minterm : 全AND項 - n個變數有$2^{n}$項: ex. $xy$, $xy'$, $x'y$, $x'y'$ - maxterm : 全OR項 - n個變數有$2^{n}$項: ex. $(x+y)$, $(x+y')$, $(x'+y)$, $(x'+y')$ - 兩者互補 - ![](https://hackmd.io/_uploads/SyN520APn.png) - #### Canonical Forms - 嚴謹的表示方式,需要包含所有變數 - 觀察的結果: - 任何一個電路可以用**全及項的和(sum of minterms)**表示 - ![](https://hackmd.io/_uploads/BJGu0C0D2.png) - **因為OR是以加法(和)表示** - 任何一個電路可以用**全或項的積(product of maxterms)**表示 - ![](https://hackmd.io/_uploads/SyWVu1k_h.png) - 根據迪摩根定理 : $f1'' = (f1')'$ - $(f1')' = (m0 + m2 + m3 + m5 + m6)' = ((x'y'z') + (x'yz') + (x'yz) + (xy'z) + (xyz'))'$ - $(f1')' = (x'y'z')'(x'yz')'(x'yz)'(xy'z)'(xyz')'$ - $(f1')' = (x + y + z)(x' + y + z')(x + y' + z')(x' + y + z')(x' + y' + z) = M_{0}M_{2}M_{3}M_{5}M_{6}$ - #### 實際上表示的方法 - Canonical forms雖正式,但比較不精簡 - 實際上表示比較**常用 sum of products 或是 product of sums 表示** - 根據canonical forms精簡範例: - ![](https://hackmd.io/_uploads/BJlIelkdh.png) #### Minimization with K-Map : 電路化簡 - #### 目的: - 減少邏輯閘數量以**減少成本** - #### **Gate-level minimization** - 減少邏輯閘 - 方法: - 1. 布林代數化簡,ex.交換律、分配律、迪摩爾 - 缺點: 跟經驗有關 - 2. **K-map (Karnaugh map)** 最小化 - 只要按照口訣跟步驟就可以完成,較穩定 - 規範: 在**變數少於7個**的情況可以做 - 缺點: **最簡單的表示可能不是唯一** - #### K-map Method - ![](https://hackmd.io/_uploads/ByMryGyO2.png) - 每個正方形代表一個**minterm** (乘積),而diagram由一些正方形組成 - **相鄰的方形**的不同只能差到**1個bit** - **相鄰的方形為1可以 透過OR在一起可以簡化** - **合併法要是1->2->4->8** : 不能合併3個、5個 - **標為1的數字都需要被使用** - 已經被使用的**盡量不用再使用**,但**若可讓電路更精簡,可以重複使用** - #### Karnaugh map 化簡: - **1. 兩個變數的karnaugh map化簡**: - ![](https://hackmd.io/_uploads/rkmMzzkOn.png) - ![](https://hackmd.io/_uploads/SJ4zmMyO3.png) - ![](https://hackmd.io/_uploads/rkapUMJ_3.png) - **2. 三個變數的karnaugh map化簡**: - 範例: $F(x,y,z) = \Sigma{(2,3,4,5)}$ : minterms $(m_{2} + m_{3} +m_{4} + m_{5})$ - 第一種化簡: ![](https://hackmd.io/_uploads/ByGQqz1u2.png) - 第二種化簡: ![](https://hackmd.io/_uploads/S1Ym0GJ_n.png) - 範例: $F(x,y,z) = \Sigma{(0,2,4,5,6)}$ - **如果可讓電路更精簡,單格可以用一次以上**: ![](https://hackmd.io/_uploads/ryp30fkdh.png) - 範例: $F(x,y,z) = \Sigma{(3,4,6,7)}$ - **沒必要不要重複使用:** ![](https://hackmd.io/_uploads/SJTwymkun.png) - **3. 四個變數的karnaugh map化簡**: - 範例: $F(w,x,y,z) = \Sigma{(0,1,2,4,5,6,8,9,12,13,14)}$ - **如果可讓電路更精簡,單格可以用一次以上**: ![](https://hackmd.io/_uploads/H1kZ47yuh.png) - 範例: $F = A'B'C' + B'CD' + A'BCD' + AB'C'$ - ![](https://hackmd.io/_uploads/Hkiy27kdn.png) - 範例: $F(w,x,y,z) = \Sigma{(0,2,3,5,7,8,9,10,11,13,15)}$ - 多種選擇: ![](https://hackmd.io/_uploads/HyL3nQk_2.png) - **4. 四個變數的karnaugh map化簡 with POS**: - 建議到這個數量以後直接用程式實作 - 過去的例子幾乎都是在簡化後,以sum-of-products(SOP)形式表示,接下來要簡化成product-of-sum(POS) : 透過DeMorgan(迪摩根) - **F' : sum of products -> F : product of sums** - 範例: $F(A,B,C,D) = \Sigma{(0,1,2,5,8,9,10)}$ simplify it in **product of sums (POS)** format - $F' = \Sigma{(3,4,6,7,11,12,13,14,15)}$ - **把F'的組合標示成0,合併為0的地方** - ![](https://hackmd.io/_uploads/r1Pi1EyO3.png) - 根據DeMorgan轉換: - $(F')' = (AB+CD+BD')' = (A'+B')(C'+D')(B'+D)$ - 範例: $F(A,B,C,D) = \Sigma{(0,2,3,5,7,8,9,10,11,13,15)}$ - ![](https://hackmd.io/_uploads/HyI0x41_2.png) - #### **規格總結:** 重要!! - ![](https://hackmd.io/_uploads/HJpPZVJd2.png) ### Compliments 補數 ... ### [Memory][(https://](https://www.youtube.com/watch?v=O9QUDRblEcA)) - #### latches - 透過Set/Reset的0/1控制保持或改變值 - #### flipflop - 透過clk電壓1/0,決定是否把D的輸入記到結果 ## VLSI CAD I ### 基礎名詞 #### 1. ASIC (application-specific integrated circuit) - 為特定用途的電路(ex.紀錄指紋) #### 2. semi-custom - 使用過去已設計過的(多個)電路去設計一個複雜電路。 - semi-custom vs full-custom - **semi-custom:** using pre-existing parts, ex. gates, memories - **full-custom:** designing right down at the transistor level #### 3. CAD (Computer-Aided Design) - 用來指稱電腦輔助設計,但其他領域(如建築)也有CAD的工具,所以在IC Design這邊普遍用EDA(electornic design automation)指稱。 #### 4. SoC (System on Chip) - 在大型芯片上整合許多功能的區塊 - ![](https://hackmd.io/_uploads/BJlDy-CDh.png) ### Computational Boolean Algebra #### 1. Decomposition strategies - #### 目的: - 把複雜function拆成小部分 #### 2. Computational strategies - #### 目的: - 讓function跟變數可以被程式運算 #### 介紹主題 - #### (1) **Shannon Expansion** - 介紹: - $F(x1, x2, ..., xi, ...,xn)$ : 分別設定$xi = {0,1}改寫$ - $F(x1,x2,...xi,...,xn) = xi * F(xi=1) + xi' * F(xi=0)$ - 即$xi=0$時結果為$F(xi=0)$,當$xi=1$時結果為$F(xi=1)$ - $xi$ 即稱為 **Shannon Cofactor** - **任何一個 Cofactor 並非一個數字,而是一個函式** - Multiple Variables 範例: - ![](https://hackmd.io/_uploads/SkearVydn.png) - 簡約表示方式: - ![](https://hackmd.io/_uploads/S10lP4kd2.png) - **Properties of Cofactors** - 二元布林運算子基本規則: - ![](https://hackmd.io/_uploads/HyYGd4kuh.png) - #### (2) **Boolean Derivatives (Difference)** - 計算方式 - xor: - ![](https://hackmd.io/_uploads/H1SmOHJ_n.png) - 可能有誤的解釋:函式f對x微分,就是判斷函式f在x=0和x=1的時候是否不同;不同時xor結果為1,相同xor結果為0。 - 行為: - 和一般的微分有部分行為相似: - ![](https://hackmd.io/_uploads/ryvWFSydh.png) - 1. 微分先後順序不重要 - 2. xor可以拆開 - 3. 常數函式微分結果一直都是0 - **在 AND 和 OR 就和一般微分規則不同**: - ![](https://hackmd.io/_uploads/r18itHkdh.png) - 範例: - 簡易範例: - ![](https://hackmd.io/_uploads/HJA32BJd3.png) - 舉例範例: - ![](https://hackmd.io/_uploads/Bk22g8Jd2.png) - $Cout_{Cin} = ab + (a+b) = a + b$ - $Cout_{\overline{Cin}} = ab$ - $\partial{Cout}/ \partial{Cin}$ = $(a+b) \oplus ab$ = $\overline{(a+b)}(ab) + (a+b)\overline{ab}$ = $a \oplus b$ - 結果:當$a \neq b$ 時,$Cin$會影響$Cout$結果。 - #### (3) **Quatification** - **Quatification Operators** - **Universal Quatification : AND** - 所有cofactors都要滿足 - ![](https://hackmd.io/_uploads/SJoNOPkun.png) - **Existential Quatification : OR** - 存在任何一個cofactor滿足 - ![](https://hackmd.io/_uploads/HJdmuPk_3.png) - 總結特性: - ![](https://hackmd.io/_uploads/BJzHYPyOn.png) - 實際範例(複雜) - ![](https://hackmd.io/_uploads/rJU49Oyu2.png) - ![](https://hackmd.io/_uploads/r1jMsdy_3.png) - 1. 透過cofactors拆成只有[X,D]變數的function: **針對A1,A0計算cofactors(右上),即排除他們的影響** - 2. 計算"是否有[X,D]可以讓所有A1,A0都可以滿足": 計算AND (左下) - 3. 計算"是否有[X,D]可以讓任一組A1,A0滿足條件" : 計算OR(右下) - **應用 : Network Repair via Quatification** - 假設有一個function : $f(a,b) = ab + b'$ - 已知前面半部份的電路設計,要如何設計後半的閘才能得到結果? - ![](https://hackmd.io/_uploads/SJFox4x_h.png) - Trick Step 1 : 把懷疑的閘以一個4:1的**多工器(MUX, multiplexor)**取代 - 以**前半部的輸出當select line**,設定巧妙的d**0~d3輸入來模擬所有閘** - ![](https://hackmd.io/_uploads/SyV5AQeOn.png) - MUX 用途: - ![](https://hackmd.io/_uploads/H1PxgNedn.png) - ![](https://hackmd.io/_uploads/BySZeNgun.png) - **如何設定d0~d3才能修復此電路?** - ex. 當僅 d3 = 1 結果正確,是一個AND閘; 當僅 d1~d2=1 結果正確,是一個xor閘。 - ![](https://hackmd.io/_uploads/Sy3aAXeun.png) - Trick Step 2 : 設定一個新的function $Z(a,b,d0,d1,d2,d3) = MUX輸出$,利用xnor檢查是否相等 - ![](https://hackmd.io/_uploads/rJFDSBl_h.png) - **Boolean Statifiability (Boolean SAT) Problem** - $(\forall{ab}\ Z)[d0,d1,d2,d3]$ : 能否有[d0,d1,d2,d3]能夠讓所有ab都滿足Z=1; Z是最終的輸出(經過xnor閘的) - ![](https://hackmd.io/_uploads/HkDnKSx_h.png) - **計算過程:** - function結果: $G(a,b,d0,d1,d2,d3) = d0s1's0' + d1s1's0 + d2s0s1' + d3s0s1$ - 利用ab輸入替換(前半段電路): $G(a,b,d0,d1,d2,d3) = $d0\overline{ab}b + d1\overline{ab}\overline{b} + d2abb + d3ab\overline{b}$ - 計算: $G(a,b,d0,d1,d2,d3) = d0\overline{a}b + d1\overline{b} + d2ab$ - **用xnor驗證G跟F是否相同** : $G\overline{\oplus}F = GF + \overline{G}\overline{F}$ - **帶入G,透過cofactor計算**: ![](https://hackmd.io/_uploads/Bk_db8g_2.png) - $(\forall{ab}\ Z)(...) = d1\overline{d0}d1d2 = d1\overline{d0}d2$ - 判斷結果:d0'd1d2: 可以用OR也可以用XOR閘來修復 - 因為前半部的設計,沒有s0=1和s1=1同時出現的情況(所以沒有d3/d3'出現) - #### (4) **Tautology** - #### 定義 - 給定一種表示方式(資料結構)來表示布林函式 - 圖像化: - ![](https://hackmd.io/_uploads/r1B4B8l_3.png) - 3個變數abc形成的 **Boolean Cube** - 以圈起來的一群cube(cover of cubes)表示一個函式 - cube表示一個product term,每個cube有$2^k$個vetices - **如何表示一個cube(即一個product term): PCN(Positional Cube Notation)** - ![](https://hackmd.io/_uploads/BJUouvxOn.png) - 每個變數(slot for variable)以**2個bits**表示,以x為例: - 01 : ...x... - 10 : ...x'... - 11 : no x and no x' in product term - 舉例(abc三個變數): - $\overline{a} = [10 11 11]$ - $bc = [11 01 01]$ - 舉例: - 圈起來的三個部分等同**cube-list** : f(a,b,c) = []+[]+[] - ![](https://hackmd.io/_uploads/BJgEcwl_n.png) - 建立一種演算法來判斷函式是否針對各種輸入都可以得到1的結果 - 輸入輸出 - Input : cube-list : ex. f(a,b,c) = [10 11 11] + [11 01 01] - Output: yes/ no, for f==1 always - **Recursive Computation Strategy** - 方法:利用Cofactors - 如果無法判別f()=1,那就拆開看是否每個cofactors結果都是1 - 原理: - 如果f是tautology(各種輸入都得到1),他的2個cofactors-$f_{x}$與$f_{x'}$都需要是1 - $F(x) = xF(x=1) + x'F(x=0) = x*1+x'*1 = x+x' = 1$ - #### Recursive Tautology Checking - #### 如何達成: - ##### 1. Selection Rules: - 如何選到正確的變數來計算cofactors - ##### 2. Termination Rules: - 如何知道何時可以停止分裂函式、得到f()==1或f()!=1的答案 - ##### 3. Mechanics: - 帶入x=0, x=1來表示cofactors - #### 實施: - 1. 先作mechanics - - ![](https://hackmd.io/_uploads/r1cLZjlOn.png) - 2. 透過**Unate Function**做到selection/termination - 一個cube-list如果是unate,更容易確認其是否為tautology - **unate(統一)**:一個SOP僅具有單一極性,當其中變數在整個函式內 all true, all complemented - ex1. $ab + ac'd + c'de'$ : unate - unate : $abc'de'$ - ex2. $xy + x'y + xyz' + z'$ : not unate - unate: $yz'$ - not unate: $x/x'$ - terminology: - **positive unate** : - 當x從0->1,讓f值不變或是f從0->1 - ![](https://hackmd.io/_uploads/H1YcLje_2.png) - **negative unate**: - 當x從0->1,讓f值不變或是f從1->0 - **binate**: not unate - 實際操作: - **Termination Rules:** - ![](https://hackmd.io/_uploads/H1kcqoe_3.png) - **Rule 1 :** f==1 : untate 且 all don't care cube[11 11 11 ... 11] - **Rule 2** :f!=1 : unate 但無 all don't care cube - **Rule 3** :f==1 : 單一變數且both polarities - **Selection Rules** - **讓function變成unate**: 選擇not-unate當作計算cofactors的變數 - **簡化cube-list**: 先選出現在最多的cube內的binate變數 - 條件相同時,選擇 $|true - complement| 最小的(minimum)$ : for tree balance - 範例: - ex1. ![](https://hackmd.io/_uploads/BJUsg3lOn.png) - ex2-1. ![](https://hackmd.io/_uploads/BkHJ4hedn.png) - ex2-2. ![](https://hackmd.io/_uploads/Hkp_Xne_h.png) - **Unate Recursive Paradigm (URP):** ``` tautology(cubelist) { if (f is unate) { //use termination rules to test f==1 if (f==1) return 1; else return 0; } else if (single var) return f is unate? 0 : 1; else { x = most-not-unate variable in f; //recursive tautology checking return tautology(fx) && tautology(fx'); } } ``` ### [Boolean Representation via BDDs and SAT](https://www.coursera.org/learn/vlsi-cad-logic/home/week/2) #### Overview - **通常真實操作下不會用URP,而是使用BDD這個資料結構。** #### 1. Basic BDD mechanics - #### 概念 1 : 把布林函式的真值表變成Decision Diagram - ![](https://hackmd.io/_uploads/rJLEeIrd3.png) - Terminology: - ![](https://hackmd.io/_uploads/HkVsx8ru3.png) - **variable vertex** : 每個節點(除了leaf node) - **constant vertex** : 葉節點(terms的結果值) - **variable ordering**: 變數在decision diagrams的順序(ex.x1x2x3) - **lo** **pointer** and lo child: 左側表示0的edge與左側的子節點,以**虛線**表示。 - **hi** pointer and hi child: 右側表示1的edge與右側的子節點,以**實線**表示。 - #### 概念 2 : 透過限制 variable ordering 來獲得 Canonical Form的資料結構 - 針對問題:variable ordering不同可以產生多種BDD - 方法 : 透過限制variable global ordering可以讓資料結構一致(產生一個相同的BDD) - **每個root到leaf的路徑當中,variable的順序須相同** - 如果不需要確認這個variable,可以忽略它;每個variable在同個路徑也至多出現一次。 - ![](https://hackmd.io/_uploads/Syn2tIBO3.png) - 但表示方法還是太大,而且可以忽略冗餘讓生成出的diagram仍然無法一致。 - #### 概念 3 : Reduction(縮減) - 針對問題: 概念2的結果仍然無法產生唯一的BDD - 方法:判別出**冗餘(redundancies)**,並且**移除**不需要的nodes跟edges - **實際規範**: - ##### Rule 1 : 合併相等(equavalent)的葉子 - 合併葉子到剩下0與1 - ![](https://hackmd.io/_uploads/HysAp8Sdh.png) - ##### Rule 2 : 合併isomorphic的節點 - isomorphic :節點有相同變數與相同子節點(lo/hi須相同) - 把出發點相同且下個子節點lo/hi值相同的節點合併(來源可能變成2條up) - ex1 : ![](https://hackmd.io/_uploads/Hyf5A8HOn.png) - ex2 : ![](https://hackmd.io/_uploads/HyypkDSuh.png) - ##### Rule 3 : 清除冗餘的測試 - 變數節點不管值是lo或hi都走到同一個節點,即不需要測試它的值(它的值在這裡沒有影響) - ![](https://hackmd.io/_uploads/BklrlDHO3.png) - ![](https://hackmd.io/_uploads/By0wlvBO3.png) - 最直覺的方法是利用**迭代(iterative)**的方法持續清除冗餘,**但實際上程式不會這樣寫,因為變數太多了(後面介紹)** - #### 重點總結: - Reduced Ordered BDD(ROBDD) - 從BDD開始,訂定出變數順序,化簡圖表 - ROBDD是可以表示所有布林函式的標準資料結構 - ![](https://hackmd.io/_uploads/SkARVDB_2.png) #### 2. BDD Sharing - #### Reduced Ordered BDD(ROBDD) - **從BDD開始,訂定出變數順序,化簡圖表** - **ROBDD是可以表示所有布林函式的標準資料結構** - funtion指向BDD的top node,且圖上的邊都是真的指向下一個節點的pointer(但是習慣不畫箭頭) - ![](https://hackmd.io/_uploads/SkARVDB_2.png) - 一些例子,使用variable order : x1,x2,x3,x4 - Typical : ![](https://hackmd.io/_uploads/HyAILwBd3.png) - Odd Parity: - function是由所有variable之間做xor表示的 - ![](https://hackmd.io/_uploads/Bk1i8Prd2.png) - #### BDD Sharing - #### 重要觀念: - 所有BDD的節點都表示著一些標準布林函式 - 例子: - ![](https://hackmd.io/_uploads/HkE6_vHu3.png) - 提示:根據上面的既定節點可以讓原函式變成子函式(ex. $F(x1=0)$等) - #### Multi-rooted Graph - 問題:運算當中有很多重複的subfunctions(如下圖灰色區域),我們不想表示同樣的subfunction兩次 - ![](https://hackmd.io/_uploads/S1pjTwr_3.png) - 方法:BDD可以有**多個entry points(或root)**,即有**多個pointers指向**一個node(entry point/root) - 共用地方分享: ![](https://hackmd.io/_uploads/SytL1uBu2.png) - 重要小地方: 注意$S_{3}$和$C_{out}$頂端未共用 - 可省下大量的nodes: ![](https://hackmd.io/_uploads/BJgQkOSuh.png) #### 3. BDD Ordering - #### 實際實施的概念 - Recursive methods - 利用divide and conquer, 與 URP 相同 - Operators(ops) in BDD: - AND, OR, NOT, EXOR, CoFactor...etc - $\forall{Quant}, \exists{Quant}, Satisfy$ - Input/ Output: - 輸入: shared BDD graphs - 輸出: 常數0, 1 - ##### 訣竅: **每個我們計算的東西都需要是shared, reduced, ordered的** - ![](https://hackmd.io/_uploads/B1D08_BO3.png) - ##### 直觀方法: - 1. 透過一個gate-level網路,逐步建立 - 新問題:複雜的網路如何處理? - Ans. BDD Ordering - ![](https://hackmd.io/_uploads/HyqQO_r_3.png) - #### BDD 應用 - ##### 1. 邏輯比較(函式F與G) - ![](https://hackmd.io/_uploads/BJr9aOrd3.png) - 分別為函式F與G建立各自的BDD graph - 相同: - 如BDD graph相同,F與G的root pointer都會指向同個BDD graph。 - 不同: - 從F與G的root pointer開始找出從哪裡(哪個變數)不同 - 透過xor找滿足H function的結果(我猜類似network repair那裡的方法) - ##### 2. Tautology Checking - 直接確認是否function的pointer直接指向1 - ![](https://hackmd.io/_uploads/rkColKSu3.png) - ##### 3. Satifiability - 所有從root走向leaf=1的路徑(path)都是解 - ![](https://hackmd.io/_uploads/HkCRgFBO2.png) - #### BDD Ordering - **Variable Ordering會嚴重影響問題(diagram)的複雜度** - ![](https://hackmd.io/_uploads/H138-KBun.png) - 處理方式: - 1. **Variable Ordering Heuristics**: - 好的 BDDs 待你上天堂 - 2. **Characterization** - **有些問題永遠無法產生好的BDDs**(ex. multipliers) - 3. **Dynamic Ordering** - 使用BDD軟體套件來選擇順序 - ##### 實施原則: - 有關聯的input在順序當中須: - 靠近(near)彼此 - 鄰近BDD頂端 - ![](https://hackmd.io/_uploads/HJOHQFSdh.png) - ##### 注意事項:Arithmetic Circuits(算術運算電路) - Arithmetic circuits(運算電路) - 許多進位鏈算術運算電路有簡單的線性大小ROBDD - 如加法器,減法器,比較器,Priority encoders?等 - 簡單rule: 交錯變數,如a0b0a1b1a2b2...etc - 困難的電路: - ![](https://hackmd.io/_uploads/H1NLUFS_h.png) - ##### 結論: - ![](https://hackmd.io/_uploads/Skdh8Fruh.png) - ##### 問題: - 順序有大影響 - BDD太大 - 我們只想知道SAT(是否能滿足這個boolean function),不需要知道整個函式 #### 4. SAT - #### Satisfiability (SAT) - 合適的函式表示: $F(x1,x2,...,xn)$ - 確認assignment: - 1. 找到**一個 assginment 可以滿足**$F()=1$,**此assignment不需要是唯一的**。 - 2. 如果**沒有任何assignment符合,證明並回傳結果**。 - ![](https://hackmd.io/_uploads/B1HudYB_n.png) - #### CNF form (Conjunctive Normal Form) - Standard POS form : product of sums - ![](https://hackmd.io/_uploads/BygIKYru3.png) - **clause**: 一個sum - positive literal: ex. $c$ - negative literal: ex. $c'$ - ![](https://hackmd.io/_uploads/HJdgotSdn.png) - **assigment**: 指派部份或全部的變數值 - complete assignment: 所有變數都有給值 - parital assignment: 僅部份變數有給值 - ##### 優點: - 只有一個clause是0,整個formula即是0(所有clauses的乘積) - 要使所有clauses=1,才能夠滿足條件 - #### 用 CNF 解決 SAT 實際方法: - **Recursively!** - **Decision:** - 選擇要指派值的變數,簡化CNF formula - **Deduction:** - 根據新簡化的clauses,根據clauses的結構與partial assignment,以迭代進行簡化。 - 如何繼續下一步? - 結束: 如果沒有東西可以簡化或已經能夠判斷SAT - 重回Secision步驟: 非結束的情況 - 範例: - ![](https://hackmd.io/_uploads/SyNj3YSd2.png) - **問題: 需要更快的辦法!! Ans : (BCP)** #### 5. Boolean Constraint Propagation (BCP) - #### 介紹 - 透過 propagating constraints 來進行 Deduction (用在Deduction階段) - #### Unit Clause Rule - BCP常用策略 - unit : 一個clause**只有一個unassigned literal** - 只有在該unassigned literal為真時,才有可能滿足SAT - implication : ex. x1=1 make unit clause-> x2=1 - ![](https://hackmd.io/_uploads/SybaRKSuh.png) - #### BCP Iterative: - 持續迭代到沒有Implications存在 - Example 1 : conflict, unSAT - ![](https://hackmd.io/_uploads/rywnk5B_n.png) - ![](https://hackmd.io/_uploads/Hyqf_2Bd2.png) - ![](https://hackmd.io/_uploads/HyMUOhHu3.png) - ![](https://hackmd.io/_uploads/rkFu_hH_n.png) - ![](https://hackmd.io/_uploads/S1EgKnHO2.png) - BCP單次可能結果: - ![](https://hackmd.io/_uploads/H13qthHdh.png) - **SAT**: 找到可能的解答 - **UNRESOLVED**: 一個或多個clauses未解,再選下一個unassigned變數,繼續遞迴 - **UNSAT: 發現conflict,須undo並重新assign一個或多個值** - #### DPLL (Davis-Putnam-Logemann-Loveland Algorithm) - 介紹: - 更完整,系統性的搜尋變數assignments - 有效的CNF形式 - 讓搜尋更早停止,在不增加更多recursion的情況下解決更多assignments - SAT進展: - 有效的資料結構表示clauses : 搜尋更快 - 有效的變數選擇 : 找到更多implications - 有效的BCP機制 : SAT通常花最多時間在這 - 學習機制 : 找到永遠無法達成SAT的一些pattern,並避免他們 - 好的SAT程式碼可以處理龐大的問題(ex.5萬變數,2.5億literal,5億clauses) - #### SAT solver - 現在有很多好的開源solvers - Examples - **MiniSAT** - CHAFF - GRASP #### 6. SAT for Logic - #### BDD vs SAT 功能 - ![](https://hackmd.io/_uploads/Hkygoprd3.png) - | 方法 | **BDD** | **SAT**| | -------- | -------- | -------- | | work | 不保證在所有case下可以有效 | 不保證在所有case下可以有效 | | function | **表示**function | **解決function SAT問題** | | problem | 有可能**OOM ** | 有可能搜尋時間**TLE** | | assignment(solution) | 會表示**所有**的$\phi$ | **不會找到所有**的$\phi$ | | support | 大數量的布林操作 | 無法支援大數量的運算子 | | 得到$\forall{x}F$, $\exists{x}F$ | **都可以達成** | 有解決$\forall{x}F$的版本,也有解決\exists{x}F的版本 | - #### 典型的 SAT 問題 - 比較logic network是否**相同** - ![](https://hackmd.io/_uploads/BJ6T0RBd2.png) - 每個F與G對應的output,個別進入一個xor比較 - 將每個xor gate出來的結果,進入一個and - 結果: - SAT: network不同 - unSAT: network相同 - #### 生成CNF - ##### 步驟1 : 將Gate轉換成CNF,一次只轉換一個gate - ##### 步驟2 :Gate Consistency Function (Gate Satisfiability Function) - ![](https://hackmd.io/_uploads/S1kOpyId3.png) - 計算d與(ab)'的exnor結果 - $A \overline{\oplus} \overline{ab} = AB + A'B'$ - $\phi_{d} = d \overline{\oplus} \overline{ab} = \overline{a'b'd'+a'bd'+ab'd'} = (a+b+d)(a+b'+d)(a'+b+d) = (a+b+d)(a+d)(b+d)$ [Basic Gates Rules](https://hackmd.io/NtH02fECTTmSavGLYK40cg?view#Basic-Gates-Rules) - 各種[CNF sub-expression](https://en.wikipedia.org/wiki/Tseytin_transformation) - 用xnor或xor判斷: - ![](https://hackmd.io/_uploads/Hy4VyxU_2.png) - ##### 步驟3 : assignment數值,得到Gate Consistency Function == '1',表示這是gate function(consistent) - ![](https://hackmd.io/_uploads/By58xe8d3.png) - ##### 步驟4 : 建立所有Gate Consistency Function,label each wire - ![](https://hackmd.io/_uploads/HJDxcbLdh.png) - **計算每個gate的gate consistency function,並全部相乘,即AND(每個gate都需要consistent)** - #### Basic Gates Rules - 是已經推導出來的精華,可以自己證或背起來! - ![](https://hackmd.io/_uploads/Bk9wqbLO2.png) ### [2-Level Logic Synthesis](https://www.coursera.org/learn/vlsi-cad-logic/lecture/ioTvV/2-level-logic-details-for-one-step-expand) #### 1. 2-Level Logic - #### 2-Level Minimization - Example : - 用SOP(sum of products)表示,僅兩層(很多AND+1個OR) - ![](https://hackmd.io/_uploads/HkFs6KU_n.png) - literals : input wires, 即在AND gate有幾個變數 - ex. 14 literals - 需求: 最少的 AND gate, 最少 input wires - ##### 作法: - **不那麼有效與實用的**:boolean algebra(須經驗可能想不到), Kmaps(可能不知何時停), Tabular Solution(exponential time) - **找更好的方法**: - 不找最佳解,只找**好方法** - **迭代改進(iterative improvement)**,透過reshape目前的解來獲得可能較好的答案,在沒有改進時停止。 - 最佳 vs 好 by Kmap: - ![](https://hackmd.io/_uploads/Byv4J5IO3.png) - **good solution:** - **prime implicants** : 盡量找越大的cubes,無法讓cubes更大 - **irredundant: ** 無法在移除任何一個prime implicants時,同時仍是solution #### 2. Reduce-Expand-Irredundant Loop : ESPRESSO - #### 介紹: - 不一定是最佳解(通常不是) - 但是是個好解答 - prime - minimal - irredundant - #### 實際作法: - ![](https://hackmd.io/_uploads/S1Xvv9Ld3.png) - ##### 步驟 1 : Truth Table with Input Don't Cares - 比較好表示出一個function - 真值表的每一列表示Kmap內的一個cube(product term) - 不一定是prime - 真值表內的一列可能表示完整真值表(full truth table)當中的好幾列 - ex. abcd (0*0*) 對應 (0000),(0100),(0101),(0001) - ![](https://hackmd.io/_uploads/SJxOzM98O2.png) - ##### 步驟 2 : Expand Each Cube to be Prime - **擴展(Expand)**每個cube可以盡可能涵蓋範圍大 - 不一定是比較好的結果 - ![](https://hackmd.io/_uploads/rJidQ5Iu2.png) - ##### 步驟 3 : Remove Redundant Cubes - **redundant** : 移除掉一個cube後,所有的1's仍然完整被覆蓋住 - 移掉所有 redundant 的 cubes - URP algorithm + covering problem - ##### 步驟 4 : Reduce the Prime Cover - **縮減(shrink/reduce)**每個cube,但保持每個1's都要完整覆蓋的狀態 - 可能不一定是prime,但不必要 - ##### 步驟 5 : 重作步驟2與3 - 由於步驟4可能改變目前的cube局面,可能有更好解答 #### 3. Expand in Reduce-Expand-Irredundant Loop - #### 定義: - 擴展cube即是從cube移除變數 - ![](https://hackmd.io/_uploads/SyEmdc8_2.png) - #### 效率: - ![](https://hackmd.io/_uploads/rJfi90Udn.png) - #### 方法: - #### 1. 將 Expand 轉換成 Covering Probelm - **Covering Problem** : - ex. 選擇最少列,使所有的columns至少有一個1's被包含在內 - ![](https://hackmd.io/_uploads/SJ3k59Ldn.png) - #### 2. 用blocking matrix處理的covering problem - - ![](https://hackmd.io/_uploads/H1evo5I_3.png) - ##### 2-1 : 建立cube來覆蓋0's (OFF Set),來確認哪些地方在expand時不該碰到 - 透過 URP **complement** 達到 - ##### 2-2 : 建立 blocking matrix - **Blocking Matrix** : - 每一列表示你**想要expand的cube當中的變數們** - 每一行表示OFF Set (0's的cube) - 填寫blocking matrix: - row的變數與column內的極性不同 : 1 - 極性相同/Don't Care : 0 - ![](https://hackmd.io/_uploads/ryr5DC8_h.png) - **1的意義**: - **可能在擴展過程中會影響的** - 擴展(橫軸)$w'$,與(縱軸)$wy'z'$為1,因為擴展$w'$即可能離開$w'$,就有可能處碰到OFF Set即$w'y'z'$。 - 作法: - 找出**最小可以覆蓋所有column的rows集合**,這些**row變數的乘積(product)就是 legal cube expansion**. - ![](https://hackmd.io/_uploads/HJFdt0Lu3.png) ### [Multi-Level Logic Synthesis](https://www.coursera.org/learn/vlsi-cad-logic/lecture/KkQNf/multilevel-logic-and-the-boolean-network-model) #### Multi-Level vs 2-Level - #### Multi-level Logic - **Area** : gates + literals(wires), 即晶片空間有的東西 - 跟literals和gates數量相關,越大需要越多space - **Delay**: 運算這個function所需要的最高邏輯閘level - 跟層數有關,越小越少delay - #### 2-Level vs. Multi-Level Logic - **沒有2-level限制性這麼多**,且**2-level通常可以得到minimum delay但worst on area。** - ![](https://hackmd.io/_uploads/r1NHTRLdn.png) - 很少用2-level設計大電路 - 通常用2-level設計小東西 - ![](https://hackmd.io/_uploads/r1G9a0I_2.png) - 甚至很多小東西是用multi-level設計的 - ![](https://hackmd.io/_uploads/HyER60I_n.png) #### Boolean Network Model - #### 概念: - **connected blocks形成的graph** - 每個**獨立的component blocks是一個SOP形式的2-lvel Boolean functions** - ![](https://hackmd.io/_uploads/HJuzkyD_2.png) - terminology: - primary inputs: a,b - internal vertices: x= ab+c - primary outputs: x,y - #### Total Literal Count - 先考慮**邏輯複雜度** - 計算所有nodes中在$=$**右邊的所有變數數量** - ![](https://hackmd.io/_uploads/Skikxkw_n.png) - #### 優化Multi-Level Logic - ~~Multi-Level Logic是一種資料結構,確認需要的operators?(在此是否是處理器?)~~ - 基礎類型: - ![](https://hackmd.io/_uploads/Bk4jbkDuh.png) - **Simplify** network nodes - 目的: 減少literals - 每個node都是2-level synthesis - 使用**ESPRESSO tool** - **Remove** network nodes - 小節點看起來不需要特別分開在獨立節點時處理 - 把small factor推進去相關的大節點,減少nodes - 減少delay,增加space(literals)! - **Add** new network nodes!!! - **factoring**,很難! - 把大節點(big nodes)相關的地方,分割出小節點(small nodes)! - **trade-off : 減少space(literals),增加delay!** - ![](https://hackmd.io/_uploads/rkowzkvdn.png) #### Algebraic Model for Factoring - #### Algebraic Model - #### 概念: - **讓函式可以以polynomial方式處理** - 在使用上避免"布林變數"獨有的那些,即**只使用那些真實數字可以用的規則** - #### 真實數字與布林變數規則: - ![](https://hackmd.io/_uploads/SkbCvUudh.png) - #### 初步作法: - 讓變數與補數以不相干的方式處理 - 1. 以**SOP表示布林函式**(像polynomials那樣) - 2. 每個product term都以一個variables set表示 - 3. SOP表示法即一個包含這些products(cubes)的list - ![](https://hackmd.io/_uploads/H14p_I_dh.png) - 缺點: - **失去了部分變數的表現力** - #### Algebraic Division - #### Terminology: - **divisor** : fundtion D - **quotient**: 商 - **remainder**: 餘數,若是0,remainder可以稱為factor - ![](https://hackmd.io/_uploads/r1EO5Ld_2.png) - 範例: - ![](https://hackmd.io/_uploads/Byhh2IdO2.png) - #### 演算法: - 輸入: - 以**list of cubes**表示的**函式F** - **Divisor D** - 輸出: - Quotient : Q = F/D - cubes - 0 : 空(empty) - Remainder R - cubes - 0 : 如果D是factor - ##### 策略: - 走過D當中的每個cubes(cubewise) - ![](https://hackmd.io/_uploads/S1vmRUddh.png) - ![](https://hackmd.io/_uploads/HkxuFqu_h.png) - 步驟: - 把F跟D**拆成一個個cube** - F有n個cube,D有m個cube,可以做成m*n的表格 - 1. 每格中紀錄第$n_{i}$個cube除以$m_{j}$的cube的結果 - 如果$n_{i,j}$中有$m_{i,j}$的變數存在,表格內紀錄**劃掉**$m_{i,j}$剩下的變數 - 2. 把n個F的cube結果用**OR合併** - 3. 把m個D的cube做**交集** - 4. 把D的所有cube與交集後的結果相乘,以F減去結果得到remainder - ![](https://hackmd.io/_uploads/HJ4V39u_3.png) - ##### 限制事項: - 1. **Algebraic**: - 在這樣的計算方法中,務必把**補數先轉換成新的變數**來計算 - **no Boolean, just Algebraic!** - ![](https://hackmd.io/_uploads/HyM6n5OOh.png) - 2. **Redundant Cubes**: - 在做F/D的計算時,**F不能有冗餘的cubes** - cube在SOP的形式中不能有重疊(overlap,cover) - minimal with repect to single-cube containment - **可能會違反"Algebraic"的運算規則!** - ![](https://hackmd.io/_uploads/SyYK69Od3.png) - ##### 問題: 如何找到合適的Divisor/Factor? - #### Kernels and Ko-Kernels - #### Terminology - Kernels of F - **用來找到 function F 的 Divisors** - $K(F)$ - **two-level SOP** - 函式F的**基礎的結構** - Co-Kernel - **用來找到 Kernels** - #### cube-free - **乘上single cube的divisor後不能讓F沒有remainder**。即**不能讓F整除single-cube**。 - ![](https://hackmd.io/_uploads/Hyngd2_dn.png) - ![](https://hackmd.io/_uploads/B13J3UYu2.png) - #### co-kernel - **single-cube** - #### Kernel - ##### F在除以co-kernel後,得到的factor是cube-free - **kernel本人cube-free** - ![](https://hackmd.io/_uploads/HJ5RJvF_h.png) - ##### Brayton & McMullen Theorem - multiple-cube divisor - intersection of kernels - ![](https://hackmd.io/_uploads/HkllCPYO3.png) - ![](https://hackmd.io/_uploads/SyHr1_t_n.png) - Real Example: - ![](https://hackmd.io/_uploads/Sk_z1dK_2.png) - #### Finding Kernels - #### Recursive Method - ![](https://hackmd.io/_uploads/Skz1luKd3.png) - #### 問題: k1是F的kernel,那**k1的kernel**呢? - $F = cube1 * k1 + remainder$, $kenrel of k1 = K(k1)?$ - #### 解法: **遞迴的找**下一個kernel: - ![](https://hackmd.io/_uploads/rJU8e_Fdn.png) - **k2是k1的kernel,k2同時也是F的kernel** - **co-kernel = cube1 * cube2** - #### Hierachy of Kernels (階層式) - ![](https://hackmd.io/_uploads/H1xI-_K_n.png) - #### 定義: - ##### 1. **以樹的形式表示** - ##### 2. level-0 kernel : - 表示**沒有其他kernel在裡面**,即可以得到cube-free的方法只有乘上1 - ##### 3. level-n kernel : - 包含**至少1個以上的kernel(level-(n-1))在內**,且沒有除自己以外level-n的kernel包含在內。 - #### Find Kernel Recursively - 使用algebraic division將function除以可能的co-kernels - **核心概念: co-kernels存在多個cubes,即多個cubes的聯集** - **技巧: 必須從cube-free function開始做,如尚未cube-free,使用最大的相同(biggest common cube)簡化function來達成。** - ![](https://hackmd.io/_uploads/Syek1FF_3.png) - #### Kernel Algorithm - #### 方法: - 從單一一個變數開始 - 如果該變數存在於2個以上的cubes,recursively做 - 如果recursive後沒有辦法再拆解,回傳: - kernel: 多個cubes/common cubes後的聯集 - co-kernel: common cubes - ![](https://hackmd.io/_uploads/r1D1ZtKu3.png) - #### Example: - ![](https://hackmd.io/_uploads/BylrmKtd3.png) - ![](https://hackmd.io/_uploads/SyEDXYtu2.png) - #### 問題: - **可能會重複找同一個kernel好幾次** - **就算記住哪些變數已經在co-kernels中試過了,abc與cba在目前的算法中視為不同的,仍會重複找** - ![](https://hackmd.io/_uploads/rk64m9F_h.png) - #### 總結: - ![](https://hackmd.io/_uploads/SkI_79Y_h.png) - 也有 Boolean Division 可以在不損失表現力的情況下計算,但計算上比較複雜。 ### Multilevel Factor Extract and Don't Cares ![](https://hackmd.io/_uploads/rJhBHEidn.png) - #### Single Cube Case - #### 方法: - **找到 prime rectangle** - 與Kmaps相似 - #### 步驟: - #### 1. 建立 cube-literal matrix: - 將一組 **SOP Algebraic Model Boolean** 方程式,轉換成縱軸是各個cubes(product term),橫軸是各個literal: - **有出現在product term中的literal**: 紀錄為1。 - 沒有出現的: dot(點.),表示**Don't Care**。 - ![](https://hackmd.io/_uploads/S1nMvNiO2.png) - #### 2. 找到 rectangle - **covering probelm** : 找到**一組 rows $R$ 與 columns $C$的交集,其中每row/col都是1**。 - **不需要是連續**的row(cube),column(literal),只需確保其中都是1。 - ![](https://hackmd.io/_uploads/Hkb3P4iOh.png) - #### 結果: - ##### Primes 即是找到的最大可能的 common single-cube divisors - prime rectangle 中的 **literals product**,**是相乘(乘積喔)!** - ![](https://hackmd.io/_uploads/H1Kpu4sd3.png) - #### 計算效益 (literal count bookkeeping): - ##### 減少literals - ![](https://hackmd.io/_uploads/BkYHt4ou3.png) - Example: - ![](https://hackmd.io/_uploads/ryNPKVsO2.png) - ab原本出現6次: -6 - 新節點X=ab耗費ab : +2 - ab替換成X: +3 - 節省1個: -6 + 2 + 3 = -1 - #### Multiple Cube Case - ![](https://hackmd.io/_uploads/S19unEodn.png) - #### 方法: - 概念與single-cube相似 - 建立matrix - 找prime rectangle - 計算literal count bookkeeping - #### 步驟: - #### 1. 找到kernel 與 co-kernel - Brayton-McMullen提出 multiple-cube facotrs是kernels中的product terms的**交集**。 - ![](https://hackmd.io/_uploads/BySwaEod3.png) - #### 2. 建立 Co-Kernel--Cube Matrix - ![](https://hackmd.io/_uploads/rkE06Voun.png) - 將一組 **SOP Algebraic Model Boolean** 方程式,轉換成: - **縱軸座標**: 各個equation的**co-kernel**(**不同equation的要分開獨立row**) - **橫軸座標**: kernel的所有**unique cube**(**相同的cube共用**一個column) - ##### 根據縱軸co-kernel對應的kernel是否包含橫軸的cube填寫: - ![](https://hackmd.io/_uploads/Hk52ySsdh.png) - 有包含: 1 - 沒包含: Don't Case, dot(.) - #### 3. 找到rectangle - 與single cube相同,以covering problem找 - ![](https://hackmd.io/_uploads/S1dZgriuh.png) - #### 結果: - ##### Prime rectangle 是好的divisors - **橫軸(columns) 中的 cube 做OR, 注意是相加 (SUM)!** - #### 計算效益: - ##### 減少literals - ![](https://hackmd.io/_uploads/rJI1Wrsu3.png) - Example: - ![](https://hackmd.io/_uploads/ByxOXriO2.png) - #### 注意事項: - ##### 1. 可以繼續extract出第2、第3的divisors - ##### 2. 想實施1,需要在找到前一個divisor後,更新matrix以反映現在的新Boolean Logic Network! - #### 問題: - 實際上我們**不會計算所有的**kernels/co-kernels - **成本太高了**! - 使用heuristics的方法**找到一個可能是divisor的quick set** - extract **a subset of** useful kernels - #### Finding Prime Rectangles - #### 目標: - 前面知道怎麼做出matrix,但需要知道實際上怎麼框出來rectangle的方法。 - #### 概念: - ##### 使用Greedy 在 rectangle Covering 問題 - #### PING PONG 作法 ??? - ![](https://hackmd.io/_uploads/SJHfvrjdh.png) - ##### 1. 選擇 best single row (最佳省下literal的) - ##### 2. 找尋其他 rows in same place,一次增加一個直到無法增加 - ##### 3. 找尋其他 columns in same place,一次增加一個直到無法增加 - ##### 4. 重複 2,3 直到無法增加 - #### 不同效益比較: - ![](https://hackmd.io/_uploads/HkUvvSs_n.png) - #### Don't Cares (DCs) - #### Don't Cares 的應用 - ##### 先前透過 **Algebraic Model 簡化**了模型 - **優點**: **擺脫**了複雜困難的**布林行為** - **缺點**: 損失了一些特性,**導致結果很難最優(lost some optimality or result quality)** - ##### 透過 Don't Cares 把特性放回去 - **取出 Don't Cares,並且在各個節點(each node)中利用他們!** - ##### 在 Multi-level的最大差異: - **很多,但是是 Implicit的,需要把它們找出來!** - #### Don't Cares 概念 - #### 一個**永遠不會發生**的 **input pattern** - #### 2-Level DCs - ![](https://hackmd.io/_uploads/HJVvOb2d3.png) - #### Multi-Level DCs - implicit, 需特別尋找 - #### Multi-Level DCs - ##### 範例與使用方式: - 在**不知道周遭關係(surrounding environments)**時: - ![](https://hackmd.io/_uploads/S1Pphb3u2.png) - 在**知道特定變數的來源時(知道部分周遭關係)**: - **可以知道某些input pattern不可能發生!** - ![](https://hackmd.io/_uploads/B1Tl6bnO3.png) - ![](https://hackmd.io/_uploads/SyMZCb3_h.png) - ![](https://hackmd.io/_uploads/BkmZ4f2dn.png) - **轉換後透過Don't Cares(DCs)+Kmaps簡化f**: - **為什麼可以這麼做?** - Kmaps基本上是**用SOP表格表示函式**,再透過rectangle簡化。 - **每個product term之間是OR關係**,故**根本不可能出現的輸入**被OR加在函式中,**完全不影響表示**! - ![](https://hackmd.io/_uploads/rJpgCf2O3.png) - 在**知道更多周遭關係**時 - **可以知道更多的input pattern不可能發生!** - ![](https://hackmd.io/_uploads/H1UyIX2_n.png) - ![](https://hackmd.io/_uploads/Sk4HDX2dh.png) - **在Kmaps中變成Don't Cares(DCs)的變數甚至可以不用表示:** - ![](https://hackmd.io/_uploads/Sk_bOQ2uh.png) - **透過Primary Output跟其他節點關係擴展影響** - **f對Z在什麼情況下不影響(Don't Care)** - ![](https://hackmd.io/_uploads/B1jhkEhuh.png) - X是0的時候,f不管是0/1,Z=0 : - $XbY$在$0--$時 insensitive,新版本的Don't Care - ![](https://hackmd.io/_uploads/BkyS-E3d3.png) - **總結不需要一些nodes:** - ![](https://hackmd.io/_uploads/Hy7_ZVhun.png) - #### 結論: - Don't Cares (DCs) 是 implicit 且 powerful的 - **需要進一步的方法自動找到 Don't Cares!** - **Don't Care Cover**: - 整體來說,Don't Cares(DCs)指在 Boolean function 內**當 input pattern 不可能出現時,當作1** - **三種類別**: - **SDCs** - **CDCs** - **ODCs** - #### Satisfiability Don't Cares(SDCs) - #### 定義: - 表示每個node那些不可能發生的input/output pattern - 與Boolean Logic Network內部的wires相關 - ![](https://hackmd.io/_uploads/Sk6PQ42uh.png) - #### 方法: - 找出那些 X 與 expression 不同的情況 - **透過 XOR**! - ![](https://hackmd.io/_uploads/SJ02EV3_h.png) - #### 總結: - ##### 重要但無法單獨透SDCs找出簡化的方法! - #### Controllability Don't Cares(CDCs) - #### 定義: - **對於一個 network node,不可能出現的 input patterns** - #### 方法: - ##### 1. 取得一個node,所有 wires input 的 SDCs - ##### 2. 將所有 $SDCs_{f}$ 做 OR - ##### 3. Universally Quantify 移除那些"未使用"(NOT USED)在此node當中的變數: ex. $\forall{b}$ - ![](https://hackmd.io/_uploads/rkwJHo3Oh.png) - #### 過程: - ##### $SDCs$-> $CDC_{f}$ - ##### 找到f的SDCs - ![](https://hackmd.io/_uploads/BkHS8j2O2.png) - ##### 可以忽略掉primary inputs(沒有network node)的SDCs - **primary inputs**: a,b,c,d - 忽略primary inputs, 只看 X,Y 的 SDCs - ![](https://hackmd.io/_uploads/B1EMto2u3.png) - ##### 計算SDCs+做OR+移除f沒有使用到的變數 - ![](https://hackmd.io/_uploads/BJFxcohO2.png) - 反向驗證合理性: - ![](https://hackmd.io/_uploads/r1xqqinu2.png) - #### 特殊Case : External CDCs - ##### primary inputs 有 Don't Care - ##### 直接加在OR其他的$SDC_{f}$的地方! - ![](https://hackmd.io/_uploads/S1zZijn_h.png) - 反向驗證合理性: - ![](https://hackmd.io/_uploads/SJcfnshu2.png) - #### 結論: - 給出對於$node_{f}$ **不可能出現的input pattern**,以**DCs的方法使用** - 主要有兩種: - ##### internal local CDCs: - 計算 **wires to f 的SDCs** - ##### external global CDCs: - DC patterns for network input(**primary inputs**) - ##### CDCs 並不是所有可能用來簡化nodes的DCs - ##### CDCs是利用 in front of node F的結構找到DCs - ##### 還有一種 ODCs 是利用 in back of node F的結構找到DCs - #### Output Don't Cares(ODCs) - #### 定義: - #### patterns可以讓節點的輸出在整個網絡的輸出處被遮蓋 - ##### 即無法在整個網路的輸出處觀察到這個節點的輸出 - ##### 即節點輸出部會影響到任何整體網絡的輸出 - ![](https://hackmd.io/_uploads/ByZMB0T_3.png) - ![](https://hackmd.io/_uploads/H1zKSC6O3.png) - #### 注意的是: 這些patterns並非完全不可能發生(not impossible!) - #### 概念: - #### Output F sensitive to input X? - ##### "導數的補數"是 1 : X 會影響 F - ![](https://hackmd.io/_uploads/SkvToCau2.png) - ##### $Z_{(f=0)}$, $Z_{(f=1)}$ 結果相同 - ![](https://hackmd.io/_uploads/SyI53ATOh.png) - #### 方法: - ##### 1. 計算Z對F微分的"導數的補數",任何使 "導數的補數為1" 的pattern,讓F insensitive for Z。 - ##### 2. Universally Quantify 不是F的輸入的所有變數 - ##### 3. 布林函式用來masking這個node的輸入 - ![](https://hackmd.io/_uploads/B1TtskCOn.png) - #### 過程: - ##### 計算 $\overline{\partial{Z}/\partial{F}}$: - ![](https://hackmd.io/_uploads/SykECJAu3.png) - ![](https://hackmd.io/_uploads/BkimrgR_n.png) - ##### 移除未出現的變數的影響: - ![](https://hackmd.io/_uploads/SkJPAyCO2.png) - 反向驗證合理性: - ![](https://hackmd.io/_uploads/HklurlCd2.png) - #### General Case (一般的情形) : - ##### Z 有很多個 inputs - #### 方法: - ##### 計算所有的 $\overline{\partial{Z}/\partial{F}}$ 並相乘: 必須同時符合 - ![](https://hackmd.io/_uploads/H18e8l0uh.png) - #### 總結: - ##### CDCs+ ODCs = full DCs for simplify - ![](https://hackmd.io/_uploads/rkTXUl0O3.png) - ##### 新的問題: - 很大的網路並**不會取得所有的DCs** - 一些**技巧**去選擇**取出DCs** - local CDCs - **不需要取出所有也已經足夠簡化網路**! - ![](https://hackmd.io/_uploads/BJr68lRuh.png) - ![](https://hackmd.io/_uploads/Skg9LeR_3.png) ## VLSI CAD II : Layout and Timing Verification ### 基本階段/實際順序: ![](https://hackmd.io/_uploads/ByN7mK0_3.png) - #### Technology Mapping - logic gate 透過合成(sythesized) to real gates - #### Placement - gates在chip上如何排列 - #### Routing - 連接在chip上的所有gates - #### Timing Analysis - mapped/placed/routed logic的速度 ### 基本知識 ![](https://hackmd.io/_uploads/SkKPnqCun.png) ### Placement - Placer - ![](https://hackmd.io/_uploads/HkTLoCzcn.png) - ![](https://hackmd.io/_uploads/S1jSsRf93.png) - #### Wirelength Models - Terminology: - net - wire in a layout - netlist - gates + wires - 2 points vs 4 points vs hundreds of points - 2 points net vs 4 points net - 根據connect在一起的gate的數量 - ![](https://hackmd.io/_uploads/BJB5sRz93.png) - fanout - ![](https://hackmd.io/_uploads/Skp2j0Mq2.png) - hundreds of points - ![](https://hackmd.io/_uploads/ryyknRM92.png) - many different paths - path in dense layout may not shortest path - #### Half perimeter wirelength (HPWL) - most famous wirelength estimator - **步驟:** - 假設gate在每個grid中央 - 畫出包含所有gate的最小bounding box - HPWL = deltaX + deltaY - ![](https://hackmd.io/_uploads/rkN730z5n.png) - ![](https://hackmd.io/_uploads/rJjVn0M9n.png) - **是wirelength的lower bound** - #### Simple terative Improvement Placement - ![](https://hackmd.io/_uploads/B1RG6Az9n.png) - ![](https://hackmd.io/_uploads/HyRc0RM5h.png) - **步驟**: - 隨機placement開始 - 計算HPWL - 隨機交換2個閘 - 重新計算各個nets的$\delta{HPWL}$,只要計算有改變的(不要每個都算XD) - 如果變小,交換閘,並持續改進 - 如果變大,表示這個新的placement不好,不要交換 - 優缺點: - 缺點:依然太慢了 - ![](https://hackmd.io/_uploads/H1JHy17c3.png) - 優點: 容易理解也容易實作 - #### Simulated Annealing - #### The Quadratic Placer ### Technology Mapping ### Routing ### Timing