URL
https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk
Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc
Compare Revisions
- This comparison shows the changes necessary to convert path
/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk/mpsoc/src_verilator
- from Rev 30 to Rev 32
- ↔ Reverse comparison
Rev 30 → Rev 32
/noc_connection.sv
40,14 → 40,15
); |
|
|
function integer log2; |
input integer number; begin |
log2=0; |
while(2**log2<number) begin |
log2=log2+1; |
end |
end |
endfunction // log2 |
|
function integer log2; |
input integer number; begin |
log2=(number <=1) ? 1: 0; |
while(2**log2<number) begin |
log2=log2+1; |
end |
end |
endfunction // log2 |
|
function integer CORE_NUM; |
input integer x,y; |
/router_verilator.v
19,15 → 19,16
|
|
|
function integer log2; |
input integer number; begin |
log2=0; |
while(2**log2<number) begin |
log2=log2+1; |
end |
end |
endfunction // log2 |
|
function integer log2; |
input integer number; begin |
log2=(number <=1) ? 1: 0; |
while(2**log2<number) begin |
log2=log2+1; |
end |
end |
endfunction // log2 |
|
function integer CORE_NUM; |
input integer x,y; |
begin |
/simulator.cpp
0,0 → 1,831
#include <stdlib.h> |
#include <stdio.h> |
#include <unistd.h> |
#include <string.h> |
|
|
|
|
#include <ctype.h> |
#include <stdint.h> |
|
#include <inttypes.h> |
|
|
#include <verilated.h> // Defines common routines |
#include "Vrouter.h" // From Verilating "router.v" |
#include "Vnoc.h" |
#include "Vtraffic.h" |
|
|
|
|
#include "parameter.h" |
//#include "traffic_tabel.h" |
|
|
#define NC (NX*NY) |
#define RATIO_INIT 2 |
|
unsigned char FIXED_SRC_DST_PAIR; |
|
unsigned char Xw=0,Yw=0; |
|
|
|
|
//Vrouter *router; |
Vrouter *router[NC]; // Instantiation of module |
Vnoc *noc; |
Vtraffic *traffic[NC]; |
|
unsigned long int main_time = 0; // Current simulation time |
unsigned int saved_time = 0; |
|
|
unsigned int total_pck_num=0; |
unsigned int sum_clk_h2h,sum_clk_h2t; |
|
double sum_clk_per_hop; |
const int CC=(C==0)? 1 : C; |
|
unsigned int total_pck_num_per_class[CC]={0}; |
unsigned int sum_clk_h2h_per_class[CC]={0}; |
unsigned int sum_clk_h2t_per_class[CC]={0}; |
double sum_clk_per_hop_per_class[CC]={0}; |
unsigned int clk_counter; |
unsigned int count_en; |
unsigned int total_router; |
|
|
|
|
|
|
char all_done=0; |
|
unsigned int flit_counter =0; |
|
char ratio=RATIO_INIT; |
double first_avg_latency_flit,current_avg_latency_flit; |
|
double sc_time_stamp (); |
int pow2( int ); |
|
|
|
int reset,clk; |
|
#if (STND_DEV_EN) |
#include <math.h> |
double sum_clk_pow2=0; |
double sum_clk_pow2_per_class[C]={0}; |
double standard_dev( double , unsigned int, double); |
#endif |
|
void update_noc_statistic ( |
unsigned int, |
unsigned int, |
unsigned int, |
unsigned int |
); |
|
|
void pck_dst_gen ( |
unsigned int, |
unsigned int, |
unsigned int, |
unsigned int*, |
unsigned int* |
); |
|
unsigned char pck_class_in_gen( |
unsigned int |
|
); |
|
|
|
|
void print_statistic (char *); |
void print_parameter(); |
|
|
void reset_all_register(); |
|
|
|
char * TRAFFIC; |
|
int PACKET_SIZE; |
int MAX_PCK_NUM; |
int MAX_SIM_CLKs; |
int inject_ratios[100]; |
int C0_p=100, C1_p=0, C2_p=0, C3_p=0; |
|
|
int HOTSPOT_PERCENTAGE; |
int HOTSPOT_NUM; |
int HOTSPOT_CORE_1, HOTSPOT_CORE_2, HOTSPOT_CORE_3, HOTSPOT_CORE_4,HOTSPOT_CORE_5; |
|
void usage(){ |
printf(" ./simulator -t [Traffic Pattern] -s [PACKET_SIZE] -n [MAX_PCK_NUM] c [MAX_SIM_CLKs] -i [INJECTION_RATIO] -p [class traffic ratios %] -h[HOTSPOT info] \n"); |
printf(" Traffic Pattern: \"HOTSPOT\" \"RANDOM\" \"TORNADO\" \"BIT_REVERSE\" \"BIT_COMPLEMENT\" \"TRANSPOSE1\" \"TRANSPOSE2\"\n"); |
printf(" PACKET_SIZE: packet size in flit\n "); |
printf(" MAX_PCK_NUM: total number of sent packets. Simulation will stop when total of sent packet by all nodes reach this number\n"); |
printf(" MAX_SIM_CLKs: simulation clock limit. Simulation will stop when simulation clock number reach this value \n"); |
printf(" INJECTION_RATIO: packet injection ratios"); |
printf(" class traffic ratios %: The percentage of traffic injected for each class. represented in string whit each clas ratio is seprated by coma. \"n0,n1,n2..\" \n"); |
printf(" HOTSPOT info: represented in a string with following format: \"HOTSPOT_PERCENTAGE,HOTSOPT_NUM,HOTSPOT_CORE_1,HOTSPOT_CORE_2,HOTSPOT_CORE_3,HOTSPOT_CORE_4,HOTSPOT_CORE_5\" \n"); |
} |
|
|
int parse_string ( char * str, int * array) |
{ |
int i=0; |
char *pt; |
pt = strtok (str,","); |
while (pt != NULL) { |
int a = atoi(pt); |
array[i]=a; |
i++; |
pt = strtok (NULL, ","); |
} |
return i; |
} |
|
void processArgs (int argc, char **argv ) |
{ |
char c; |
int p; |
int array[10]; |
|
/* don't want getopt to moan - I can do that just fine thanks! */ |
opterr = 0; |
if (argc < 2) usage(); |
while ((c = getopt (argc, argv, "t:s:n:c:i:p:h:")) != -1) |
{ |
switch (c) |
{ |
|
case 't': |
TRAFFIC=optarg; |
break; |
case 's': |
PACKET_SIZE=atoi(optarg); |
break; |
case 'n': |
MAX_PCK_NUM=atoi(optarg); |
break; |
case 'c': |
MAX_SIM_CLKs=atoi(optarg); |
break; |
case 'i': |
ratio=atoi(optarg); |
break; |
case 'p': |
p= parse_string (optarg, array); |
C0_p=array[0]; |
C1_p=array[1]; |
C2_p=array[2]; |
C3_p=array[3]; |
break; |
case 'h': |
p= parse_string (optarg, array); |
HOTSPOT_PERCENTAGE=array[0]; |
HOTSPOT_NUM=array[1]; |
HOTSPOT_CORE_1=array[2]; |
HOTSPOT_CORE_2=array[3]; |
HOTSPOT_CORE_3=array[4]; |
HOTSPOT_CORE_4=array[5]; |
HOTSPOT_CORE_5=array[6]; |
|
break; |
|
|
|
case '?': |
if (isprint (optopt)) |
fprintf (stderr, "Unknown option `-%c'.\n", optopt); |
else |
fprintf (stderr, |
"Unknown option character `\\x%x'.\n", |
optopt); |
default: |
usage(); |
exit(1); |
} |
} |
} |
|
|
int main(int argc, char** argv) { |
char change_injection_ratio=0,inject_done; |
int i,j,x,y;//,report_delay_counter=0; |
char file_name[100]; |
char deafult_out[] = {"result"}; |
char * out_file_name; |
unsigned int dest_x, dest_y; |
int flit_out_all_size = sizeof(router[0]->flit_out_all)/sizeof(router[0]->flit_out_all[0]); |
while((0x1<<Xw) < NX)Xw++; //log2 |
while((0x1<<Yw) < NY)Yw++; |
|
|
processArgs ( argc, argv ); |
|
|
FIXED_SRC_DST_PAIR = strcmp (TRAFFIC,"RANDOM") & strcmp(TRAFFIC,"HOTSPOT") & strcmp(TRAFFIC,"random") & strcmp(TRAFFIC,"hot spot"); |
|
|
|
|
|
|
Verilated::commandArgs(argc, argv); // Remember args |
|
for(i=0;i<NC;i++) router[i] = new Vrouter; // Create instance |
noc = new Vnoc; |
for(i=0;i<NC;i++) traffic[i] = new Vtraffic; |
|
|
/******************** |
* initialize input |
*********************/ |
|
reset=1; |
reset_all_register(); |
noc->start_i=0; |
|
for(x=0;x<NX;x++)for(y=0;y<NY;y++){ |
i=(y*NX)+x; |
router[i]->current_x = x; |
router[i]->current_y = y; |
traffic[i]->current_x = x; |
traffic[i]->current_y = y; |
traffic[i]->start=0; |
traffic[i]->pck_size_in=PACKET_SIZE; |
traffic[i]->ratio=ratio; |
traffic[i]->pck_class_in= pck_class_in_gen( i); |
pck_dst_gen ( x,y,i, &dest_x, &dest_y); |
traffic[i]->dest_x= dest_x; |
traffic[i]->dest_y=dest_y; |
|
} |
|
|
|
|
main_time=0; |
print_parameter(); |
printf("\n\n\n Flit injection ratio per router is =%d \n",ratio); |
//printf("\n\n\n delay= %u clk",router->delay); |
while (!Verilated::gotFinish()) { |
|
if (main_time-saved_time >= 10 ) { |
reset = 0; |
} |
|
if(main_time == saved_time+21){ count_en=1; noc->start_i=1;}//for(i=0;i<NC;i++) traffic[i]->start=1;} |
if(main_time == saved_time+26) noc->start_i=0;// for(i=0;i<NC;i++) traffic[i]->start=0; |
|
|
|
|
if ((main_time % 4) == 0) { |
clk = 1; // Toggle clock |
if(count_en) clk_counter++; |
inject_done= ((total_pck_num >= MAX_PCK_NUM) || (clk_counter>= MAX_SIM_CLKs)); |
//if(inject_done) printf("clk_counter=========%d\n",clk_counter); |
for(x=0;x<NX;x++)for(y=0;y<NY;y++) |
{ |
i=(y*NX)+x; |
// a packet has been received |
if(traffic[i]->update & ~reset){ |
update_noc_statistic ( |
traffic[i]->time_stamp_h2h, |
traffic[i]->time_stamp_h2t, |
traffic[i]->distance, |
traffic[i]->pck_class_out |
) ; |
} |
// the header flit has been sent out |
if(traffic[i]->hdr_flit_sent ){ |
traffic[i]->pck_class_in= pck_class_in_gen( i); |
if(!FIXED_SRC_DST_PAIR){ |
pck_dst_gen ( x,y,i, &dest_x, &dest_y); |
traffic[i]->dest_x= dest_x; |
traffic[i]->dest_y=dest_y; |
} |
} |
|
if(traffic[i]->flit_out_wr==1) flit_counter++; |
|
}//for |
if(inject_done) { |
for(x=0;x<NX;x++)for(y=0;y<NY;y++) if(traffic[(y*NX)+x]->pck_number>0) total_router = total_router +1; |
|
printf(" simulation clock cycles:%d\n",clk_counter); |
printf(" total received flits:%d\n",flit_counter); |
print_statistic(out_file_name); |
change_injection_ratio = 1; |
for(i=0;i<NC;i++) { |
router[i]->final(); |
traffic[i]->final(); |
} |
noc->final(); |
|
|
return 0; |
} |
|
|
|
}//if |
else |
{ |
|
clk = 0; |
noc->ni_flit_in_wr =0; |
|
for(x=0;x<NX;x++)for(y=0;y<NY;y++){ |
i=(y*NX)+x; |
|
|
router[i]->flit_in_we_all = noc->router_flit_out_we_all[i]; |
router[i]->credit_in_all = noc->router_credit_out_all[i]; |
router[i]->congestion_in_all = noc->router_congestion_out_all[i]; |
for(j=0;j<flit_out_all_size;j++)router[i]->flit_in_all[j] = noc->router_flit_out_all[i][j]; |
|
|
noc->router_flit_in_we_all[i] = router[i]->flit_out_we_all ; |
noc->router_credit_in_all[i] = router[i]->credit_out_all; |
noc->router_congestion_in_all[i]= router[i]->congestion_out_all; |
for(j=0;j<flit_out_all_size;j++) noc->router_flit_in_all[i][j] = router[i]->flit_out_all[j] ; |
|
traffic[i]->flit_in = noc->ni_flit_out [i]; |
traffic[i]->credit_in= noc->ni_credit_out[i]; |
|
|
noc->ni_credit_in[i] = traffic[i]->credit_out; |
noc->ni_flit_in [i] = traffic[i]->flit_out; |
|
if(traffic[i]->flit_out_wr) noc->ni_flit_in_wr = noc->ni_flit_in_wr | ((vluint64_t)1<<i); |
|
traffic[i]->flit_in_wr= ((noc->ni_flit_out_wr >> i) & 0x01); |
|
|
}//for |
|
|
}//else |
//if(main_time > 20 && main_time < 30 ) traffic->start=1; else traffic->start=0; |
//if(main_time == saved_time+25) router[0]->flit_in_we_all=0; |
//if((main_time % 250)==0) printf("router->all_done =%u\n",router->all_done); |
|
|
noc-> clk = clk; |
noc-> reset = reset; |
|
|
for(i=0;i<NC;i++) { |
traffic[i]->start= ((noc->start_o >>i)& 0x01); |
traffic[i]->reset= reset; |
traffic[i]->clk = clk; |
router[i]->reset= reset; |
router[i]->clk= clk ; |
|
} |
|
|
noc->eval(); |
|
|
for(i=0;i<NC;i++) { |
router[i]->eval(); |
traffic[i]->eval(); |
|
} |
|
|
|
|
//router[0]->eval(); // Evaluate model |
//printf("clk=%x\n",router->clk ); |
|
main_time++; |
//getchar(); |
|
|
} |
for(i=0;i<NC;i++) { |
router[i]->final(); |
traffic[i]->final(); |
} // Done simulating |
noc->final(); |
|
} |
|
|
|
|
|
|
|
|
double sc_time_stamp () { // Called by $time in Verilog |
return main_time; |
} |
|
int pow2( int num){ |
int pw; |
pw= (0x1 << num); |
return pw; |
} |
|
|
|
/********************************** |
* |
* update_noc_statistic |
* |
* |
*********************************/ |
|
|
|
void update_noc_statistic ( |
unsigned int clk_num_h2h, |
unsigned int clk_num_h2t, |
unsigned int distance, |
unsigned int class_num |
) |
{ |
|
|
total_pck_num+=1; |
//if((total_pck_num & 0Xffff )==0 ) printf("total_pck_num=%d\n",total_pck_num); |
sum_clk_h2h+=clk_num_h2h; |
sum_clk_h2t+=clk_num_h2t; |
#if (STND_DEV_EN) |
sum_clk_pow2+=(double)clk_num_h2h * (double) clk_num_h2h; |
sum_clk_pow2_per_class[class_num]+=(double)clk_num_h2h * (double) clk_num_h2h; |
#endif |
|
sum_clk_per_hop+= ((double)clk_num_h2h/(double)distance); |
total_pck_num_per_class[class_num]+=1; |
sum_clk_h2h_per_class[class_num]+=clk_num_h2h ; |
sum_clk_h2t_per_class[class_num]+=clk_num_h2t ; |
sum_clk_per_hop_per_class[class_num]+= ((double)clk_num_h2h/(double)distance); |
|
|
|
|
} |
|
/************************* |
* |
* update |
* |
* |
************************/ |
|
|
|
|
|
|
|
|
|
|
|
void print_statistic (char * out_file_name){ |
double avg_latency_per_hop, avg_latency_flit, avg_latency_pck, avg_throughput,min_avg_latency_per_class; |
int i; |
#if (STND_DEV_EN) |
double std_dev; |
#endif |
char file_name[100]; |
avg_throughput= ((double)(total_pck_num*PACKET_SIZE*100)/total_router )/clk_counter; |
printf(" Total active routers: %d \n",total_router); |
printf(" Avg throughput is: %f (flits/clk/node %%)\n", avg_throughput); |
avg_latency_flit = (double)sum_clk_h2h/total_pck_num; |
avg_latency_pck = (double)sum_clk_h2t/total_pck_num; |
if(ratio==RATIO_INIT) first_avg_latency_flit=avg_latency_flit; |
#if (STND_DEV_EN) |
std_dev= standard_dev( sum_clk_pow2,total_pck_num, avg_latency_flit); |
// sprintf(file_name,"%s_std.txt",out_file_name); |
//update_file( file_name,avg_throughput,std_dev); |
|
#endif |
avg_latency_per_hop = (double)sum_clk_per_hop/total_pck_num; |
printf ("\nall : \n"); |
// sprintf(file_name,"%s_all.txt",out_file_name); |
//update_file(file_name ,ratio,avg_latency ); |
if(strcmp (AVG_LATENCY_METRIC,"HEAD_2_TAIL")==0){ |
printf(" Total number of packet = %d \n average latency per hop = %f \n average latency = %f\n",total_pck_num,avg_latency_per_hop,avg_latency_pck); |
// update_file(file_name ,avg_throughput,avg_latency_pck); |
|
}else{ |
printf(" Total number of packet = %d \n average latency per hop = %f \n average latency = %f\n",total_pck_num,avg_latency_per_hop,avg_latency_flit); |
// update_file(file_name ,avg_throughput,avg_latency_flit); |
|
} |
//fwrite(fp,"%d,%f,%f,%f,",total_pck_num,avg_latency_per_hop,avg_latency,max_latency_per_hop); |
min_avg_latency_per_class=1000000; |
for(i=0;i<C;i++){ |
avg_throughput = (total_pck_num_per_class[i]>0)? ((double)(total_pck_num_per_class[i]*PACKET_SIZE*100)/total_router )/clk_counter:0; |
avg_latency_flit = (total_pck_num_per_class[i]>0)? (double)sum_clk_h2h_per_class[i]/total_pck_num_per_class[i]:0; |
avg_latency_pck = (total_pck_num_per_class[i]>0)? (double)sum_clk_h2t_per_class[i]/total_pck_num_per_class[i]:0; |
avg_latency_per_hop = (total_pck_num_per_class[i]>0)? (double)sum_clk_per_hop_per_class[i]/total_pck_num_per_class[i]:0; |
if(strcmp (AVG_LATENCY_METRIC,"HEAD_2_TAIL")==0){ |
printf ("\nclass : %d \n",i); |
printf (" Total number of packet = %d \n avg_throughput = %f \n average latency per hop = %f \n average latency = %f\n",total_pck_num_per_class[i],avg_throughput,avg_latency_per_hop,avg_latency_pck); |
//sprintf(file_name,"%s_c%u.txt",out_file_name,i); |
// update_file( file_name,avg_throughput,avg_latency_pck ); |
}else{ |
|
printf ("\nclass : %d \n",i); |
printf (" Total number of packet = %d \n avg_throughput = %f \n average latency per hop = %f \n average latency = %f\n",total_pck_num_per_class[i],avg_throughput,avg_latency_per_hop,avg_latency_flit); |
// sprintf(file_name,"%s_c%u.txt",out_file_name,i); |
// update_file( file_name,avg_throughput,avg_latency_flit ); |
|
|
|
|
} |
if(min_avg_latency_per_class > avg_latency_flit) min_avg_latency_per_class=avg_latency_flit; |
|
#if (STND_DEV_EN) |
std_dev= (total_pck_num_per_class[i]>0)? standard_dev( sum_clk_pow2_per_class[i],total_pck_num_per_class[i], avg_latency_flit):0; |
// sprintf(file_name,"%s_std%u.txt",out_file_name,i); |
// update_file( file_name,avg_throughput,std_dev); |
|
#endif |
|
|
}//for |
current_avg_latency_flit=min_avg_latency_per_class; |
|
|
|
|
} |
|
void print_parameter (){ |
|
printf ("Router parameters: \n"); |
printf ("\tTopology: %s\n",TOPOLOGY); |
printf ("\tRouting algorithm: %s\n",ROUTE_NAME); |
printf ("\tVC_per port: %d\n", V); |
printf ("\tBuffer_width: %d\n", B); |
printf ("\tRouter num in row: %d \n",NX); |
printf ("\tRouter num in column: %d \n",NY); |
printf ("\tNumber of Class: %d\n", C); |
printf ("\tFlit data width: %d \n", Fpay); |
printf ("\tVC reallocation mechanism: %s \n", VC_REALLOCATION_TYPE); |
printf ("\tVC/sw combination mechanism: %s \n", COMBINATION_TYPE); |
printf ("\troute-subfunction: %s \n", ROUTE_SUBFUNC ); |
printf ("\tAVC_ATOMIC_EN:%d \n", AVC_ATOMIC_EN); |
printf ("\tCongestion Index:%d \n",CONGESTION_INDEX); |
printf ("\tADD_PIPREG_AFTER_CROSSBAR:%d\n",ADD_PIPREG_AFTER_CROSSBAR); |
|
|
|
#if(DEBUG_EN) |
printf ("\tDebuging is enabled\n"); |
#else |
printf ("\tDebuging is disabled\n"); |
#endif |
|
printf ("Simulation parameters\n"); |
if(strcmp (AVG_LATENCY_METRIC,"HEAD_2_TAIL")==0)printf ("\tOutput is the average latency on sending the packet head until receiving tail\n"); |
else printf ("\tOutput is the average latency on sending the packet head until receiving the head\n"); |
printf ("\tTraffic pattern:%s\n",TRAFFIC); |
if(C>0) printf ("\ttraffic percentage of class 0 is : %d\n", C0_p); |
if(C>1) printf ("\ttraffic percentage of class 1 is : %d\n", C1_p); |
if(C>2) printf ("\ttraffic percentage of class 2 is : %d\n", C2_p); |
if(C>3) printf ("\ttraffic percentage of class 3 is : %d\n", C3_p); |
if((strcmp (TRAFFIC,"HOTSPOT")==0)|| (strcmp (TRAFFIC,"hot spot")==0)){ |
printf ("\tHot spot percentage: %u\n", HOTSPOT_PERCENTAGE); |
printf ("\tNumber of hot spot cores: %d\n", HOTSPOT_NUM); |
|
} |
//printf ("\tTotal packets sent by one router: %u\n", TOTAL_PKT_PER_ROUTER); |
printf ("\t Simulation timeout =%d\n", MAX_SIM_CLKs); |
printf ("\t Simulation ends on total packet num of =%d\n", MAX_PCK_NUM); |
printf ("\tPacket size: %u flits\n",PACKET_SIZE); |
printf ("\t SSA_EN enabled:%s \n",SSA_EN); |
} |
|
|
/************************ |
* |
* reset system |
* |
* |
* *******************/ |
|
void reset_all_register (void){ |
int i; |
|
|
|
total_router=0; |
total_pck_num=0; |
sum_clk_h2h=0; |
sum_clk_h2t=0; |
#if (STND_DEV_EN) |
sum_clk_pow2=0; |
#endif |
|
sum_clk_per_hop=0; |
count_en=0; |
clk_counter=0; |
|
for(i=0;i<C;i++) |
{ |
total_pck_num_per_class[i]=0; |
sum_clk_h2h_per_class[i]=0; |
sum_clk_h2t_per_class[i]=0; |
sum_clk_per_hop_per_class[i]=0; |
#if (STND_DEV_EN) |
sum_clk_pow2_per_class[i]=0; |
#endif |
|
} //for |
flit_counter=0; |
} |
|
|
|
|
/*********************** |
* |
* standard_dev |
* |
* ******************/ |
|
#if (STND_DEV_EN) |
|
|
double standard_dev( double sum_pow2, unsigned int total_num, double average){ |
double std_dev; |
|
std_dev = sum_pow2/(double)total_num; |
std_dev -= (average*average); |
std_dev = sqrt(std_dev); |
|
return std_dev; |
|
} |
|
#endif |
|
|
|
/********************** |
* |
* pck_class_in_gen |
* |
* *****************/ |
|
unsigned char pck_class_in_gen( |
unsigned int core_num |
|
) { |
|
unsigned char pck_class_in; |
unsigned char rnd=rand()%100; |
|
pck_class_in= ( rnd < C0_p )? 0: |
( rnd < (C0_p+C1_p) )? 1: |
( rnd < (C0_p+C1_p+C2_p))?2:3; |
|
|
|
return pck_class_in; |
} |
|
/********************************** |
|
pck_dst_gen |
|
*********************************/ |
|
void pck_dst_gen ( |
unsigned int current_x, |
unsigned int current_y, |
unsigned int core_num, |
unsigned int *dest_x, |
unsigned int *dest_y |
){ |
|
|
unsigned int rnd=0; |
unsigned int rnd100=0; |
int i; |
|
|
if((strcmp (TRAFFIC,"RANDOM")==0) || (strcmp (TRAFFIC,"random")==0)){ |
|
do{ |
rnd=rand()%NC; |
}while (rnd==core_num); // get a random IP core, make sure its not same as sender core |
|
(*dest_y) = (rnd / NX ); |
(*dest_x) = (rnd % NX ); |
|
|
} |
else if ((strcmp(TRAFFIC,"HOTSPOT")==0) || (strcmp (TRAFFIC,"hot spot")==0)){ |
|
do{ |
rnd=rand()%NC; |
}while (rnd==core_num); // get a random IP core, make sure its not same as sender core |
|
rnd100=rand()%100; |
|
if (rnd100 < HOTSPOT_PERCENTAGE && core_num !=HOTSPOT_CORE_1 ) rnd = HOTSPOT_CORE_1; |
else if((HOTSPOT_NUM > 1) && (rnd100 >= 20 ) && (rnd100 < (20+HOTSPOT_PERCENTAGE)) && core_num!=HOTSPOT_CORE_2 ) rnd = HOTSPOT_CORE_2; |
else if((HOTSPOT_NUM > 2) && (rnd100 >= 40) && (rnd100 < (40+HOTSPOT_PERCENTAGE)) && core_num!=HOTSPOT_CORE_3 ) rnd = HOTSPOT_CORE_3; |
else if((HOTSPOT_NUM > 3) && (rnd100 >= 60) && (rnd100 < (60+HOTSPOT_PERCENTAGE)) && core_num!=HOTSPOT_CORE_4 ) rnd = HOTSPOT_CORE_4; |
else if((HOTSPOT_NUM > 4) && (rnd100 >= 80) && (rnd100 < (80+HOTSPOT_PERCENTAGE)) && core_num!=HOTSPOT_CORE_5 ) rnd = HOTSPOT_CORE_5; |
|
|
|
(*dest_y) = (rnd / NX ); |
(*dest_x) = (rnd % NX ); |
|
|
} else if(( strcmp(TRAFFIC ,"TRANSPOSE1")==0)|| (strcmp (TRAFFIC,"transposed 1")==0)){ |
|
(*dest_x) = NX-current_y-1; |
(*dest_y) = NY-current_x-1; |
|
|
|
} else if(( strcmp(TRAFFIC ,"TRANSPOSE2")==0)|| (strcmp (TRAFFIC,"transposed 2")==0)){ |
(*dest_x) = current_y; |
(*dest_y) = current_x; |
|
|
} else if(( strcmp(TRAFFIC ,"BIT_REVERSE")==0)|| (strcmp (TRAFFIC,"bit reverse")==0)){ |
unsigned int joint_addr= (current_x<<Xw)+current_y; |
unsigned int reverse_addr=0; |
unsigned int pos=0; |
for(i=0; i<(Xw+Yw); i++){//reverse the address |
pos= (((Xw+Yw)-1)-i); |
reverse_addr|= ((joint_addr >> pos) & 0x01) << i; |
// reverse_addr[i] = joint_addr [((Xw+Yw)-1)-i]; |
} |
(*dest_x) = reverse_addr>>Yw; |
(*dest_y) = reverse_addr&(0xFF>> (8-Yw)); |
|
|
|
|
} else if(( strcmp(TRAFFIC ,"BIT_COMPLEMENT") ==0)|| (strcmp (TRAFFIC,"bit complement")==0)){ |
|
(*dest_x) = (~current_x) &(0xFF>> (8-Xw)); |
(*dest_y) = (~current_y) &(0xFF>> (8-Yw)); |
|
|
} else if(( strcmp(TRAFFIC ,"TORNADO") == 0)|| (strcmp (TRAFFIC,"tornado")==0)){ |
//[(x+(k/2-1)) mod k, (y+(k/2-1)) mod k], |
(*dest_x) = ((current_x + ((NX/2)-1))%NX); |
(*dest_y) = ((current_y + ((NY/2)-1))%NY); |
|
|
} else if( strcmp(TRAFFIC ,"CUSTOM") == 0){ |
//[(x+(k/2-1)) mod k, (y+(k/2-1)) mod k], |
if(current_x ==0 && current_y == 0 ){ |
(*dest_x) = NX-1; |
(*dest_y) = NY-1; |
}else{// make it unvalid |
(*dest_x) = current_x; |
(*dest_y) = current_y; |
|
} |
|
} |
|
else printf ("traffic %s is an unsupported traffic pattern\n",TRAFFIC); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
simulator.cpp
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: traffic_gen_verilator.v
===================================================================
--- traffic_gen_verilator.v (revision 30)
+++ traffic_gen_verilator.v (revision 32)
@@ -36,14 +36,15 @@
clk
);
+
function integer log2;
input integer number; begin
- log2=0;
+ log2=(number <=1) ? 1: 0;
while(2**log2