---
# System prepended metadata

title: '[LPHP Lab M0] IC Design  Contest 2015'

---

# **[LPHP Lab M0]** IC Design Contest 2015
    
    
## **題目要求簡述:**
![螢幕擷取畫面 2024-01-27 135031](https://hackmd.io/_uploads/HkAhFMM9a.png)
以上面的圖形為例，題目要求計算出給定的範圍中包含的頂點數 (計算範圍用三個圓的總包含範圍以邏輯閘形式組成)
- 例: ![螢幕擷取畫面 2024-01-27 135446](https://hackmd.io/_uploads/H1ChqMGqT.png =50%x)

### ***目標:*** 
**由於本年題目的評分標準為操作clk period只要在10ns以下且area小於9000就A等且之後比較的是繳交時間因此著重的點在於壓縮clk period以及壓縮面積並以執行的cycle數去做Trade Off。**


    
## **State Graph:** 


![2015-4](https://hackmd.io/_uploads/HylfNFMG9a.jpg)

- 依照題目要求先計算3個圓的平方( $r_a^2$, $r_b^2$, $r_c^2$) 
- --> 接著分別對目前的index_X, index_Y與給定的圓中心做減法, 乘法, 加法得到
        - ![螢幕擷取畫面 2024-01-27 140108](https://hackmd.io/_uploads/HJF4hGG5a.png =30%x)

- 接著再去與一開始計算的$r_a^2$做比較得到這個index是否位於A圓內。(以下B圓，C圓同理)

- --> 等到此index是否位於ABC三圓內的計算都完成後，依照對應的Mode去Branch到不同的State運算不同的flag組合出來是否此index位於該Mode的範圍內。以此得到最後是否此Index有Hit到。
- 結束運算後便會回到AX_Subtract繼續下一個Index的運算，直到Index = (8,8)時便會跳到Output State將Candidate output出來後回到Reset等待下一筆測資。

## **Mode3的運算簡化:**
- 題目原先給的Mode3判斷式為:
-- ![螢幕擷取畫面 2024-01-27 135446](https://hackmd.io/_uploads/rktEkmfc6.png =40%x)
- 透過寫出真值表與Karnaugh Map的簡化能夠將式子簡化為
-- **$\bar{B}D + C\bar{D} + \bar{A}B + A\bar{C}$**

- 以下為運算過程
![螢幕擷取畫面 2024-01-27 141921](https://hackmd.io/_uploads/Bk3_xmz9p.png)


## **電路特殊設計:**
這次的題目中使用到的主要在於重複利用運算器減少面積並以cycle數做TradeOff。主要就是透過以下的方式撰寫code將運算的數值以不同state的時候去給，運算器則是一直運算同一組變數去完成一個運算只需要一個運算器的電路。

![image](https://hackmd.io/_uploads/rJdprmzcT.png)
下面可以看到OP1是依照不同State去給定值，而Square則是一直運算OP1的平方。
![image](https://hackmd.io/_uploads/rkExLQfq6.png)





## **結果討論:**
這次的比賽算是相對簡單的，主要花的時間都在於如何模擬跟合成的debug上。遇到的幾個問題主要解決方法如下: 

- 合成吃不到Library: synopsys_dc_setup前面要加.
- 後模有module無法compile: 沒有吃到tsmc13_neg，要嘛Terminal Compile或是tb中include
- 最主要的問題遇到的一個如下，當我的code這樣寫的時候。
![螢幕擷取畫面 2024-01-27 143234](https://hackmd.io/_uploads/H19im7G96.png)
可以看到下面的波型黃色虛線處當posedge clk 的時候雖然已經en == 1了但卻沒有將index reset 成1而是進到下面的index_X <= index_X中。
![螢幕擷取畫面 2024-01-27 143357](https://hackmd.io/_uploads/B1hk47f5p.png)
最後解決的辦法是將Reset的功能移到state中去做判斷。
![螢幕擷取畫面 2024-01-27 143546](https://hackmd.io/_uploads/HkE8NmM9p.png)

- 以結論來說我不知道為甚麼後模時在en == 1時會沒辦法進去那個if block但在印象中好像之前superlint還是甚麼有提到不能再if(rst)的巢狀判斷式中加入其他的巢狀判斷式。或許是因為這樣導致他合出來的東西與我預期不符導致debug上的困難。



