?? io.c.svn-base
字號:
printf(" dyn. read energy (nJ): %g\n",result->data_output_power.readOp.dynamic*1e9);
printf(" leak. read power (mW): %g\n",result->data_output_power.readOp.leakage*1e3);
printf(" total_out_driver (ns): %g\n", result->total_out_driver_delay_data/1e-9);
printf(" dyn. read energy (nJ): %g\n", result->total_out_driver_power_data.readOp.dynamic*1e9);
printf(" leak. read power (mW): %g\n", result->total_out_driver_power_data.readOp.leakage*1e3);
printf(" total data path (without output driver) (ns): %g\n",result->subbank_address_routing_delay/1e-9+result->decoder_delay_data/1e-9+result->wordline_delay_data/1e-9+result->bitline_delay_data/1e-9+result->sense_amp_delay_data/1e-9);
if (!parameters->fully_assoc)
{
if (A==1)
printf(" total tag path is dm (ns): %g\n", result->subbank_address_routing_delay/1e-9+result->decoder_delay_tag/1e-9+result->wordline_delay_tag/1e-9+result->bitline_delay_tag/1e-9+result->sense_amp_delay_tag/1e-9+result->compare_part_delay/1e-9);
else
printf(" total tag path is set assoc (ns): %g\n", result->subbank_address_routing_delay/1e-9+result->decoder_delay_tag/1e-9+result->wordline_delay_tag/1e-9+result->bitline_delay_tag/1e-9+result->sense_amp_delay_tag/1e-9+result->compare_part_delay/1e-9+result->drive_mux_delay/1e-9+result->selb_delay/1e-9);
}
}
void output_area_components(arearesult_type *arearesult, parameter_type *parameters)
{
printf("\nArea Components:\n\n");
//v4.1: No longer using calculate_area function as area has already been
//computed for the given tech node.
/*
printf("Aspect Ratio Data height/width: %f\n", aspect_ratio_data);
printf("Aspect Ratio Tag height/width: %f\n", aspect_ratio_tag);
printf("Aspect Ratio Subbank height/width: %f\n", aspect_ratio_subbank);
printf("Aspect Ratio Total height/width: %f\n\n", aspect_ratio_total);
*/
printf("Aspect Ratio Total height/width: %f\n\n", arearesult->aspect_ratio_total);
printf("Data array (mm^2): %f\n",arearesult->dataarray_area.scaled_area);
printf("Data predecode (mm^2): %f\n",arearesult->datapredecode_area.scaled_area);
printf("Data colmux predecode (mm^2): %f\n",arearesult->datacolmuxpredecode_area.scaled_area);
printf("Data colmux post decode (mm^2): %f\n",arearesult->datacolmuxpostdecode_area.scaled_area);
printf("Data write signal (mm^2): %f\n",arearesult->datawritesig_area.scaled_area);
printf("\nTag array (mm^2): %f\n",arearesult->tagarray_area.scaled_area);
printf("Tag predecode (mm^2): %f\n",arearesult->tagpredecode_area.scaled_area);
printf("Tag colmux predecode (mm^2): %f\n",arearesult->tagcolmuxpredecode_area.scaled_area);
printf("Tag colmux post decode (mm^2): %f\n",arearesult->tagcolmuxpostdecode_area.scaled_area);
printf("Tag output driver decode (mm^2): %f\n",arearesult->tagoutdrvdecode_area.scaled_area);
printf("Tag output driver enable signals (mm^2): %f\n",arearesult->tagoutdrvsig_area.scaled_area);
printf("\nPercentage of data ramcells alone of total area: %f %%\n", arearesult->perc_data);
printf("Percentage of tag ramcells alone of total area: %f %%\n",arearesult->perc_tag);
printf("Percentage of total control/routing alone of total area: %f %%\n",arearesult->perc_cont);
printf("\nSubbank Efficiency : %f\n", arearesult->sub_eff);
printf("Total Efficiency : %f\n",arearesult->total_eff);
printf("\nTotal area One bank (mm^2): %f\n",arearesult->totalarea);
printf("Total area subbanked (mm^2): %f\n",arearesult->subbankarea);
}
void output_data(result_type *result,arearesult_type *arearesult, parameter_type *parameters)
{
double datapath,tagpath;
FILE *stream;
stream=fopen("cache_params.aux", "w");
datapath = result->subbank_address_routing_delay+result->decoder_delay_data+result->wordline_delay_data+result->bitline_delay_data+result->sense_amp_delay_data+result->total_out_driver_delay_data+result->data_output_delay;
if (parameters->tag_associativity == 1) {
tagpath = result->subbank_address_routing_delay+result->decoder_delay_tag+result->wordline_delay_tag+result->bitline_delay_tag+result->sense_amp_delay_tag+result->compare_part_delay+result->drive_valid_delay;
} else {
tagpath = result->subbank_address_routing_delay+result->decoder_delay_tag+result->wordline_delay_tag+result->bitline_delay_tag+result->sense_amp_delay_tag+result->compare_part_delay+
//result->drive_mux_delay+
result->selb_delay+result->data_output_delay+result->total_out_driver_delay_data;
}
if (stream){
fprintf(stream, "#define PARAMNDWL %d\n#define PARAMNDBL %d\n#define PARAMNSPD %f\n#define PARAMNTWL %d\n#define PARAMNTBL %d\n#define PARAMNTSPD %d\n#define PARAMSENSESCALE %f\n#define PARAMGS %d\n#define PARAMDNOR %d\n#define PARAMTNOR %d\n#define PARAMRPORTS %d\n#define PARAMWPORTS %d\n#define PARAMRWPORTS %d\n#define PARAMMUXOVER %d\n", result->best_Ndwl, result->best_Ndbl, result->best_Nspd, result->best_Ntwl, result->best_Ntbl, result->best_Ntspd, result->senseext_scale, (result->senseext_scale==1.0), result->data_nor_inputs, result->tag_nor_inputs, parameters->num_read_ports, parameters->num_write_ports, parameters->num_readwrite_ports, result->best_muxover);
}
fclose(stream);
# if OUTPUTTYPE == LONG
printf("\n---------- CACTI version 4.1 ----------\n");
printf("\nCache Parameters:\n");
printf(" Number of banks: %d\n",(int)result->subbanks);
printf(" Total Cache Size: %d\n",(int) (parameters->cache_size));
printf(" Size in bytes of a bank: %d\n",parameters->cache_size / (int)result->subbanks);
printf(" Number of sets per bank: %d\n",parameters->number_of_sets);
if (parameters->fully_assoc)
printf(" Associativity: fully associative\n");
else
{
if (parameters->tag_associativity==1)
printf(" Associativity: direct mapped\n");
else
printf(" Associativity: %d\n",parameters->tag_associativity);
}
printf(" Block Size (bytes): %d\n",parameters->block_size);
printf(" Read/Write Ports: %d\n",parameters->num_readwrite_ports);
printf(" Read Ports: %d\n",parameters->num_read_ports);
printf(" Write Ports: %d\n",parameters->num_write_ports);
printf(" Technology Size: %2.2fum\n", parameters->tech_size);
printf(" Vdd: %2.1fV\n", parameters->VddPow);
printf("\nAccess Time (ns): %g\n",result->access_time*1e9);
printf("Cycle Time (ns): %g\n",result->cycle_time*1e9);
//if (parameters->fully_assoc)
//{
printf("Total dynamic Read Power at max. freq. (W): %g\n",result->total_power_allbanks.readOp.dynamic/result->cycle_time);
printf("Total leakage Read/Write Power all Banks (mW): %g\n",result->total_power_allbanks.readOp.leakage*1e3);
printf("Total dynamic Read Energy all Banks (nJ): %g\n",result->total_power_allbanks.readOp.dynamic*1e9);
printf("Total dynamic Write Energy all Banks (nJ): %g\n",result->total_power_allbanks.writeOp.dynamic*1e9);
printf("Total dynamic Read Energy Without Routing (nJ): %g\n",result->total_power_without_routing.readOp.dynamic*1e9);
printf("Total dynamic Write Energy Without Routing (nJ): %g\n",result->total_power_without_routing.writeOp.dynamic*1e9);
printf("Total dynamic Routing Energy (nJ): %g\n",result->total_routing_power.readOp.dynamic*1e9);
printf("Total leakage Read/Write Power Without Routing (mW): %g\n",result->total_power_without_routing.readOp.leakage*1e3);
//printf("Total leakage Write Power all Banks (mW): %g\n",result->total_power_allbanks.writeOp.leakage*1e3);
//printf("Total leakage Write Power Without Routing (mW): %g\n",result->total_power_without_routing.writeOp.leakage*1e3);
printf("Total leakage Read/Write Routing Power (mW): %g\n",result->total_routing_power.readOp.leakage*1e3);
//printf("Maximum Bank Power (nJ): %g\n",(result->subbank_address_routing_power+result->decoder_power_data+result->wordline_power_data+result->bitline_power_data+result->sense_amp_power_data+result->data_output_power+result->total_out_driver_power_data)*1e9);
// printf("Power (W) - 500MHz: %g\n",(result->decoder_power_data+result->wordline_power_data+result->bitline_power_data+result->sense_amp_power_data+result->data_output_power)*500*1e6);
//}
/*else
{
printf("Total dynamic Read Power at max. freq. (W): %g\n",result->total_power_allbanks.readOp.dynamic/result->cycle_time);
printf("Total dynamic Read Energy all Banks (nJ): %g\n",result->total_power_allbanks.readOp.dynamic*1e9);
printf("Total leakage Read Power all Banks (mW): %g\n",result->total_power_allbanks.readOp.leakage*1e3);
printf("Total dynamic Write Energy all Banks (nJ): %g\n",result->total_power_allbanks.writeOp.dynamic*1e9);
printf("Total leakage Write Power all Banks (mW): %g\n",result->total_power_allbanks.writeOp.leakage*1e3);
printf("Total dynamic Read Energy Without Routing (nJ): %g\n",result->total_power_without_routing.readOp.dynamic*1e9);
printf("Total leakage Read Power Without Routing (mW): %g\n",result->total_power_without_routing.readOp.leakage*1e3);
printf("Total dynamic Write Energy Without Routing (nJ): %g\n",result->total_power_without_routing.writeOp.dynamic*1e9);
printf("Total leakage Write Power Without Routing (mW): %g\n",result->total_power_without_routing.writeOp.leakage*1e3);
printf("Total dynamic Routing Energy (nJ): %g\n",result->total_routing_power.readOp.dynamic*1e9);
printf("Total leakage Routing Power (mW): %g\n",result->total_routing_power.readOp.leakage*1e3);*/
//printf("Maximum Bank Power (nJ): %g\n",(result->subbank_address_routing_power+result->decoder_power_data+result->wordline_power_data+result->bitline_power_data+result->sense_amp_power_data+result->total_out_driver_power_data+result->decoder_power_tag+result->wordline_power_tag+result->bitline_power_tag+result->sense_amp_power_tag+result->compare_part_power+result->drive_valid_power+result->drive_mux_power+result->selb_power+result->data_output_power)*1e9);
// printf("Power (W) - 500MHz: %g\n",(result->decoder_power_data+result->wordline_power_data+result->bitline_power_data+result->sense_amp_power_data+result->total_out_driver_power_data+result->decoder_power_tag+result->wordline_power_tag+result->bitline_power_tag+result->sense_amp_power_tag+result->compare_part_power+result->drive_valid_power+result->drive_mux_power+result->selb_power+result->data_output_power)*500*1e6);
//}
printf("\nBest Ndwl (L1): %d\n",result->best_Ndwl);
printf("Best Ndbl (L1): %d\n",result->best_Ndbl);
printf("Best Nspd (L1): %f\n",result->best_Nspd);
printf("Best Ntwl (L1): %d\n",result->best_Ntwl);
printf("Best Ntbl (L1): %d\n",result->best_Ntbl);
printf("Best Ntspd (L1): %d\n",result->best_Ntspd);
//printf("Nor inputs (data): %d\n",result->data_nor_inputs);
//printf("Nor inputs (tag): %d\n",result->tag_nor_inputs);
output_area_components(arearesult,parameters);
printf("\nTime Components:\n");
printf(" data side (with Output driver) (ns): %g\n",datapath/1e-9);
if (!parameters->fully_assoc)
printf(" tag side (with Output driver) (ns): %g\n",(tagpath)/1e-9);
output_time_components(result,parameters);
# else
printf("%d %d %d %d %d %d %d %d %d %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e\n",
parameters->cache_size,
parameters->block_size,
parameters->associativity,
result->best_Ndwl,
result->best_Ndbl,
result->best_Nspd,
result->best_Ntwl,
result->best_Ntbl,
result->best_Ntspd,
result->access_time,
result->cycle_time,
datapath,
tagpath,
result->decoder_delay_data,
result->wordline_delay_data,
result->bitline_delay_data,
result->sense_amp_delay_data,
result->decoder_delay_tag,
result->wordline_delay_tag,
result->bitline_delay_tag,
result->sense_amp_delay_tag,
result->compare_part_delay,
result->drive_mux_delay,
result->selb_delay,
result->drive_valid_delay,
result->data_output_delay,
result->precharge_delay);
# endif
}
total_result_type cacti_interface(
int cache_size,
int line_size,
int associativity,
int rw_ports,
int excl_read_ports,
int excl_write_ports,
int single_ended_read_ports,
int banks,
double tech_node,
int output_width,
int specific_tag,
int tag_width,
int access_mode,
int pure_sram,
double Nspd_predef,
int Ndwl_predef,
int Ndbl_predef,
int optimize)
{
int C,B,A,ERP,EWP,RWP,NSER;
double tech;
double logbanks, assoc;
double logbanksfloor, assocfloor;
int seq_access = 0;
int fast_access = 0;
int bits_output = output_width;
int nr_args = 9;
double NSubbanks = (double)banks;
double ratioofbankstoports;
extern int force_tag, force_tag_size;
total_result_type endresult;
result_type result;
arearesult_type arearesult;
area_type arearesult_subbanked;
parameter_type parameters;
/* input parameters:
C B A ERP EWP */
/*dt: make sure we're using some simple leakage reduction */
dualVt = FALSE;
force_tag = 0;
if(specific_tag) {
force_tag = 1;
force_tag_size = tag_width;
}
switch (access_mode){
case 0:
seq_access = fast_access = FALSE;
break;
case 1:
seq_access = TRUE;
fast_access = FALSE;
break;
case 2:
seq_access = FALSE;
fast_access = TRUE;
break;
}
B = line_size;
if ((B < 1)) {
printf("Block size must >=1\n");
return endresult;
//exit(1);
}
if ((B*8 < bits_output)) {
printf("Block size must be at least %d\n", bits_output/8);
return endresult;
//exit(1);
}
tech = tech_node;
if ((tech <= 0)) {
printf("Feature size must be > 0\n");
return endresult;
//exit(1);
}
if ((tech > 0.8)) {
printf("Feature size must be <= 0.80 (um)\n");
return endresult;
//exit(1);
}
if (nr_args ==9)
{
RWP = rw_ports;
ERP = excl_read_ports;
EWP = excl_write_ports;
NSER = single_ended_read_ports;
if ((RWP < 0) || (EWP < 0) || (ERP < 0)) {
printf("Ports must >=0\n");
return endresult;
//exit(1);
}
if (RWP > 2) {
printf("Maximum of 2 read/write ports\n");
return endresult;
//exit(1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -