這次做的題目是2011 CIC CELL-BASED IC競賽的複賽題目,簡單來說題目的內容要求是達成對一張128X128大小的矩陣影像做7X7的中值濾波器運算。
依照題目規定,測試波形會依照順序提供矩陣的資料,但強調每筆資料只會提供一次,因此官方提供1KB或8KB的記憶體MODEL可供存放資料。
另外,在做中值濾波超出邊界的時候7X7中值濾波器補0進行運算。最後,不可以用很大量的暫存器來完成這一題,因為在何成上太大量可能會導致當機。 以上大概是題目敘述。
以下是我想到的作法做個紀錄。
簡單得來就是做個狀態機,最先的步驟就是先把全部資料讀入到記憶體裡面,之後照每個位置抓取7X7=49個中值濾波的記憶體位置獲取影像的值,再來排序獲取中值,最後輸出,之後重複。
從圖形上大概是這樣的,分別用兩個8KB記憶體存放資料,照順序放入,語法用簡單IF..ELSE...來決定0~8191資料放在SRAM1,8192~16383放在SRAM2。
另外我用的作業DIP的擴展技巧來計算位置,使用2維的XY座標位置來做2維矩陣定位。根據XY的值來抓取49個濾波器值的記憶體位置來獲取資料。XY分別是最外圈包涵超界的位置。
比較麻煩的是在SRAM1和SRAM2中間的記憶體地址位置重疊,需要另外分開計算記憶體位置,所以我寫得code抓取的狀態裡面又分成3個小的狀態,分別對SRAM1、交接處、SRAM2做記憶體位置的抓取有不同的計算。Z是做COUNTER,用來一步一步抓取資料,因為不能同時對記憶體進行多筆的存取動作。
在排序的地方最簡單的方法就是使用泡沫排序法,使用49個CLK週期時間來做一個位置的排序,可以只要排到中值(第25個值,迴圈次數改到)的地方就終止排序進行輸出,不需要作到完全排序在輸出可以節省一半的時間,到此就做完了。
但是還是有許多可以改善的地方,我後來是針對排序的方面做重寫,使用IEEE找到的一篇FPGA上快速做的中值排序方法,時間可以再減少6倍的速度,非常的快速。
範例有提供5X5的,但是沒有7X7,所以要照式子去算
當N=7的時候會變成
最後的波型和驗證結果。
最後和出來的GATE數約150000,真是大阿.........
真心覺得沒有寫得很好。另外很多合成技巧之後去CIC上課才學到,學校都沒有教,以後有機會再寫才會運用看看。
但是參考CIC提供的最佳解答發現,特優解答幾乎都是用組合邏輯電路寫出來的,因此在合成與運算上面速度之快到爆炸,幾乎是我做完的再快10倍以上,面積上組合邏輯的面積優勢也是大勝......最神奇的是採用一種bit之間分群的快速排序方法讓整個速度飛快。
另外很快的另一個原因是因為特優似乎沒有用到記憶體,感覺超神的~只要存放到約300個資料上下就可以進行第一個PIXEL的中值濾波,算完之後馬上輸出,在讀入下一筆資料,然後馬上又運算。把時間作到最省,完全省略我抓取49個資料的時間,因為特優的方式就是抓一個、算一個、補一個,在位置上只要位移還有存放300多個資料就可以把空間和時間作到最省。
也是相當佩服的運算方式。
之後補充做完的.v檔。 LMFE0 LMFE1 LMFE2 LMFE3
檔案裡面有一些說明,但是不保證沒問題~ 不同檔案好像分別有遇到#1和不能合成的問題,還有用了泡沫跟快速中值排序的方法CODE,總之大概是這樣了。
最後要做個碰到的問題整理:
1、(合成+APR POST-SIM)在合成的時候使用學長舊的合成和DFT指令,導致後端做APR的時候POST-SIM波形錯誤,主要是沒有加一些語法去除assign和 //(註解符號)導致後端 失敗,在上過CIC的合成課程之後加上學長給的額外指令去跑就可以順利做完APR進行POST-SIM正確。
2、(APR POST-SIM)在進行POST-SIM時下的指令 ncverilog testfixture.v CHIP.v tsmc18.v tpz973gv.v +access+r 在CIC複賽中不用加tpz的檔案,因為此檔是找pad的cell name和內部元件。
不知道為什麼我們實驗室把這個檔案藏在超裡面的目錄.......cell lib/CBDK v3.2/lib/tpz973gz270/digital/front end/verilog/tpz973gv 270a/..
3、(合成、verilog)因為在記憶體使用上面很容易出現時序上的問題,讀取的時候因為用到記憶體倒是有一點hold time的問題導致compile做check都會跑出hold time error的錯誤,比較方便就是在ncverilog 指令打完檔案和+access+r 後面再加 +notimingcheck 如此可以跳過errorr進行功能的除錯,之後再回來改verilog修時間的問題,或是在合成修。
在合成修hold time可以去clk裡面detribute選fix time進行一個簡單的修正。
合成的時候還要看CYCLE是多少? 要和testbench相同。
3.5、(一)合成之後有錯誤。錯誤和把#1去掉+notiming check相同。
(二)若加#1,不用notiming check可RTL通過
(三)所以用#1+ notiming check修道通過再合成
(四)最後把#1完全修掉 rtl也過 合成也過
4、(verilog)在這一題第一次用記憶體,所以碰到了時間對不准的問題。最主要得就是抓到要做中值的49個資料,在利用z做counter計算49個週期分別用記憶體讀取資料,存到暫存去做排序,會出現錯位一個週期的情況發生!!簡單的來說就是原本49個位置,其中應該是要在第21個週期的時候把該筆資料讀出放到t21暫存器reg中,但是會存放到t22的神奇狀況。
最後的解決方法是全部移位一個clk(多一個z的位置),就會全部對到了,非常的神奇,我進入抓取49個資料的情況必須先等待2個clk資料才會正確的進入到正確的暫存器,總之就是這樣。
5、(post-sim)在跑psot-sim的步驟很多,首先資料夾要放入input.dat expect.dat 總之根據testbench必需要提供資料輸入來源和比對資料的目標。
再來testfixture.v裡面因為我們有做DFT,所以要增加reg SCAN_EN; reg SCAN_IN; 兩個掃描的暫存。 在inital 中打上 SCAN_EN=1'b0; SCAN_IN=1'b0; 把測試腳位區塊關閉,避免在post的時候跑錯電路導致錯誤。
最後還要check testbench的model name是否有改成CHIP。
若是指令很長可以用上課教到的apr資料夾下創一個run.f的檔案。使用gedit run.f編輯,裡面打上要執行的ncverilog testfixture.v CHIP.v tsmc18.v tpz973gv.v +access+r +FSDB進行存檔。以後就直接打 ncverilog -f run.f 就可以執行上面一大串的指令,不只省時,修改也方便。
6、(nano-sim)需要連到cic進行元件的替換進行更精確的模擬。如果get CHIP.gds (登入cic機台控制從那邊連線回來抓自己最後做好輸出的gds檔) 出現227 entering passive mode ,就輸入 『passive』 這個指令,就會進入passive mode之後再打get CHIP.gds就可以把檔案上傳了。
其實我也是查錯誤的指令發現就是ftp的指令,因此有些可以找ftp指令就可以使用。
最後要cpoy LPE的結果檔,打 cp ../lpe/result ***/.sp . 最後的點代表此目錄底下。
Qstat 用 showq 指令可以看機台狀態,其實teriminal有提示。
留言列表