270 likes | 559 Views
專題製作. CAD 競賽 Using Multi-Bit Flip-Flops for Clock Power Saving 學生 : 黃士庭 指導教授 : 曾奕倫 教授. Abstract. Multi-bit flip-flop 是一種有效節省電的實施方法,透過合併 flip-flops 可以有效地減少 clock dynamic power 和 flip-flop 的總面積。. 下圖顯示 2 個 single-bit flip-flops 合併成 1 個 2-bits flip-flops 。
E N D
專題製作 CAD競賽 Using Multi-Bit Flip-Flops for Clock Power Saving 學生:黃士庭 指導教授:曾奕倫 教授
Abstract Multi-bit flip-flop是一種有效節省電的實施方法,透過合併 flip-flops可以有效地減少clock dynamic power和flip-flop的總面積。
下圖顯示2個single-bit flip-flops合併成1個2-bits flip-flops。 Single-bit flip-flops包含2個inverters, master-latch和slave-latch。
結合多個single-bit flip-flops成Multi-bit flip-flop可以減少2個inverters,使flip-flop的total clock dynamic power consumption和面積可以大幅減少。
Introduction1. Problem Description Multi-bit flip-flops可以降低能源消耗,是因為flip-flop可以用分享inverter來減少inverter的數量,同時使總面積能夠最小。要能夠獲得這些優勢,我們必須確保我們的設計能夠符合某些限制。
timing slack的限制:當使用Multi-bit flip-flops來取代1-bit flip-flops或者以上的時候,multi-bit flip-flop會制定新的routing length。 b.placement密度的限制,multi-bit flip-flop的面積會大於1-bit flip-flop,我們必須將它放置在一個新的地點。
Implementation Data Structures struct info { long chip_size_w,chip_size_h; long grid_size_x,grid_size_y; long bin_size_w,bin_size_h; long density; }; 儲存chip的size ,grid的size,bin的size,和一個bin可 容納的density
structchip_info { long bit_num; long power; long area; }; 儲存可以合併的flip flop的資料 bit_num是可合併的個數 power 為此形態的flip flop power是多少 area 為所佔的面積
struct chip { long style; string name; long loca_x,loca_y; vector<long> connect; }; 儲存 input 檔所給的flip flop資料 style 為此flip flop型態 name 為此flip flop名稱 loca_xloca_y為此flip lfop位置 connet為此flip flop跟誰結合了
struct pin { long style; long loca_x,loca_y; long slack; string name; string which_flip_flop; }; 儲存 pin 的資料 style 為此pin的型態 是input 或output loca_xloca_y為此pin的位置 slack 為此pin的slack neme為此pin的名稱 which_flip_flop為此pin 連到哪個flip flop
struct block { string name; long loca_x,loca_y; long density; }; 儲存block 的資料 name 為此block的名稱 loca_xloca_y為此block的位置 density 為此block所佔的面積
struct net { string name; string which_flip_flop; long slack; }; 儲存net 的資料 name 是pin的名稱 which_flip_flop是此pin連到哪個flip flop slack 是此pin的slack
Algorithms Algorithm: Input: input_data 此input為所給的file,裡面包含了:library,flip_flop list,pin list,net list, 和block list。 Output: output_data output file包含了:flip flop list,net list,max placement density,和execution time。
Begin 1. 將資料讀取進我們所規劃的資料結構裡 2. 計算我們所要合併的次數N Total flip flop<1000 N=5000 Total flip flop>1000 <5000 N=10000 Total flip flop>10000 <15000 N=15000 Total flip flop>15000 <20000 N=20000 Total flip flop>20000 N=25000
3. 選取資料裡最長的 slack然後除以bin_size 計算出等等要使用的boundary 4. For 0->N a. 隨機產生我們要合併多少個bit的flip flop 的數字。之後隨機挑選要合併的flip flop 並檢查是否超過要合併的數字。 b. 檢查之後選取到得flip flop是否坐落在第 一個選取到的flip flop周圍的bin。若沒 則重新選取。
c. 利用所選取的flip flop的最左下角和最右 上角的座標形成一個四邊形,此四邊形 的範圍裡隨機選取要放置新合併的flip flop的位置。 d. 比對slack是否符合限制,再比對放置 新的flip flop在此位置是否符合density 的限制。 若不符合,gotostep.a N++
6. 更新資料結構裡的資料 7. 產生output檔
軟體特色 1.會依照使用者所給檔案的flip flop 數來控制要合併的次數 2.會依照使用者所給檔案的slack來計 算boundary 3.合併過後的flip flop可以再重複的合 併。
報告完畢 以下為附件:SOURCECODE
Source Code 隨機產生BIT 數 do //rand how many bit we will combine { move_check = 1; //reset m=0; if(m == 0) // rand_bit = (rand() % max_bit) + 1; for(i=0; i<library.size(); i++) { if(rand_bit == library[i].bit_num && rand_bit != 1) { rand_bit_style = library[i].name; m=1; } } }while(m != 1);
確認邊界條件和重複選取,或已經結合了 do { bin_check = 0; rand_temp = rand() % flip_flop.size(); bin_num_x = flip_flop[rand_temp].loca_x/para[0].bin_size_w; bin_num_y = flip_flop[rand_temp].loca_y/para[0].bin_size_h; if(bin_num_x - bin_boundary < 0) boundary_lx = 0; else boundary_lx = bin_num_x - bin_boundary; if(bin_num_x + bin_boundary > para[0].chip_size_w/para[0].bin_size_w) boundary_rx = para[0].chip_size_w/para[0].bin_size_w; else boundary_rx = bin_num_x + bin_boundary; ……. if(bin_check == 1) { for(j=0, rt = flip_flop[rand_temp].connect.begin(); rt < flip_flop[rand_temp].connect.end(); j++, rt++) { if(rand_temp == flip_flop[rand_temp].connect[j]) { bin_check = 0; break; } }
for(m=0, rt2 = rand_ff.begin(); rt2 < rand_ff.end(); m++, rt2 { if(rand_temp == rand_ff[m]) { bin_check = 0; break; } } } if(rand_ff_times++ > 99) break; }
擺放新的位置 do { n++; move_check = 1; posi_add_x = rand() % (max_x - min_x); //compute move value posi_add_y = rand() % (max_y - min_y); while(posi_add_x % para[0].grid_size_x !=0) { posi_add_x = rand() % (max_x - min_x); } while(posi_add_y % para[0].grid_size_y !=0) { posi_add_y = rand() % (max_y - min_y); } temp_posi_x = min_x + posi_add_x; temp_posi_y = min_y + posi_add_y; for(i=0, ft = flip_flop.begin(); ft < flip_flop.end(); i++, ft++) { check_all = 0; if(temp_posi_x == flip_flop[i].loca_x && temp_posi_y == flip_flop[i].loca_y { posi_add_x = rand() % (max_x - min_x); posi_add_y = rand() % (max_y - min_y); while(posi_add_x % para[0].grid_size_x !=0) { posi_add_x = rand() % (max_x - min_x); } }
while(posi_add_y % para[0].grid_size_y !=0) { posi_add_y = rand() % (max_y - min_y); } temp_posi_x = min_x + posi_add_x; temp_posi_y = min_y + posi_add_y; i = 0; //reset ft = flip_flop.begin(); //reset }
比對SLACK for(rt=rand_ff.begin(),i=0;rt<rand_ff.end();rt++,i++) { for(nt=net_info.begin(),j=0;nt<net_info.end();nt++,j++) { if(net_info[j].which_flip_flop == flip_flop[rand_ff[i]].name) { for(pt=pin_info.begin(),m=0;pt<pin_info.end();pt++,m++) { if(pin_info[m].name == net_info[j].name) { final_slack = pin_info[m].slack + abs(flip_flop[rand_ff[i]].loca_x - pin_info[m].loca_x) + abs(flip_flop[rand_ff[i]].loca_y - pin_info[m].loca_y) - abs(pin_info[m].loca_x - temp_posi_x) - abs(pin_info[m].loca_y - temp_posi_y); if(final_slack < 0) { move_check = 0; break; } } } } if(move_check == 0) break; } if(move_check == 0) break; } }
比對density是否合乎規定 if(move_check == 1) //if slack OK { bin_num_x = (min_x + posi_add_x)/para[0].bin_size_w; bin_num_y = (min_y + posi_add_y)/para[0].bin_size_h; last_density = bin_array[bin_num_x][bin_num_y]; for(rt=rand_ff.begin(),i=0;rt<rand_ff.end();rt++,i++) { for(lt=library.begin(),j=0;lt<library.end();lt++,j++) { if(library[j].name == flip_flop[rand_ff[i]].style) { bin_array[bin_num_x][bin_num_y] = bin_array[bin_num_x][bin_num_y] - library[j].area; } } } for(lt=library.begin(),j=0;lt<library.end();lt++,j++) { if(library[j].bit_num == rand_bit) { bin_array[bin_num_x][bin_num_y] = bin_array[bin_num_x][bin_num_y] + library[j].area; break; } } if(bin_array[bin_num_x][bin_num_y] > para[0].density { bin_array[bin_num_x][bin_num_y] = last_density; move_check = 0; } }