專題製作 cad 競賽 using multi-bit flip-flops for clock power saving 學生 : 黃士庭...

26
專專專專 CAD 競競 Using Multi-Bit Flip- Flops for Clock Power Saving 專專 : 專專專 專專專專 : 專專專 專專

Post on 19-Dec-2015

264 views

Category:

Documents


4 download

TRANSCRIPT

專題製作

CAD 競賽Using Multi-Bit Flip-

Flops forClock 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 的數量,同時使總面積能夠最小。要能夠獲得這些優勢,我們必須確保我們的設計能夠符合某些限制。

a. timing slack 的限制 : 當使用 Multi-bit flip-flops 來取代 1-bit flip-flops或者以上的時候, multi-bit flip-flop會制定新的 routing length 。

b. 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

struct chip_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_x loca_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_x loca_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_x loca_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_dataoutput file 包含了 :flip flop list , net list , max placement density ,和 execution time 。

Begin 1.將資料讀取進我們所規劃的資料結構裡2.計算我們所要合併的次數 NTotal flip flop<1000 N=5000Total flip flop>1000 <5000 N=10000Total flip flop>10000 <15000 N=15000Total flip flop>15000 <20000 N=20000Total flip flop>20000 N=25000

3.選取資料裡最長的 slack 然後除以bin_size計算出等等要使用的 boundary4.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 的限制。 若不符合, goto step.a N++

6. 更新資料結構裡的資料

7. 產生 output 檔

軟體特色

1. 會依照使用者所給檔案的 flip flop 數來控制要合併的次數2. 會依照使用者所給檔案的 slack 來計 算 boundary3. 合併過後的 flip flop 可以再重複的合 併。

以下為附件 :SOURCE CODE

報告完畢

Source Code

隨機產生 BIT 數do //rand how many bit we will combine{

move_check = 1; //resetm=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 valueposi_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; //resetft = flip_flop.begin(); //reset}

比對 SLACKfor(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;

}

}