Using Multi-Bit Flip-Flops for Clock Power Saving 學生:黃士庭指導教授

Download Report

Transcript Using Multi-Bit Flip-Flops for Clock Power Saving 學生:黃士庭指導教授

專題製作
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,使flipflop的total clock dynamic power
consumption和面積可以大幅減少。
Introduction
1. Problem Description
Multi-bit flip-flops可以降低能源消耗,是
因為flip-flop可以用分享inverter來減少
inverter的數量,同時使總面積能夠最小。
要能夠獲得這些優勢,我們必須確保我們
的設計能夠符合某些限制。
a.
b.
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
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_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
的限制。 若不符合,goto step.a
N++
6. 更新資料結構裡的資料
7. 產生output檔
軟體特色
1.會依照使用者所給檔案的flip flop
數來控制要合併的次數
2.會依照使用者所給檔案的slack來計
算boundary
3.合併過後的flip flop可以再重複的合
併。
報告完畢
以下為附件:SOURCE CODE
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;
}
}