dram.cc
来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· CC 代码 · 共 1,471 行 · 第 1/5 页
CC
1,471 行
full_overlapping++; } else/*in between case*/ { lat = SD_T_READ_READ_SBANK-corrected_overlap; in_between_case++; partial_overlapping++; } } else/*worst case*/ { lat = SD_T_READ_READ_SBANK; worst_case++; } same_bank_read_access++; sbr_after_read++; } else/*write*/ {/*no option case*/ lat = SD_T_WRITE_WRITE_SBANK; same_bank_write_access++; sbw_after_write++; worst_case++; } } } else /*other bank*/ { if (cmdIsRead) { /* Page empty */ if (current_row == active_row[current_bank])/*row is still active*/ { if (corrected_overlap > 0 )/*overlapping*/ { if(corrected_overlap >= pre_lat)/*best case*/ { lat = SD_BEST_T_READ_READ_OBANK; best_case++; full_overlapping++; } else/*in between case*/ { lat = SD_T_READ_READ_OBANK - corrected_overlap; in_between_case++; partial_overlapping++; } } else/*in between case*/ { lat = SD_T_READ_READ_OBANK; in_between_case++; } other_bank_read_access_hit++; obr_after_read_hit++; } else/*row is not active*/ { if (corrected_overlap > 0 )/*overlapping*/ { if(corrected_overlap >= SD_T_READ_READ_OBANK )/*best case*/ { lat = SD_BEST_T_READ_READ_OBANK; best_case++; full_overlapping++; } else/*in between case*/ { lat = SD_T_READ_READ_OBANK-corrected_overlap; in_between_case++; partial_overlapping++; } } else/*worst case*/ { lat = SD_T_READ_READ_OBANK; worst_case++; } // DR keep track of time between misses was_miss = 1; other_bank_read_access_miss[0]++; obr_after_read_miss++; } } else/*write*/ { if (current_row == active_row[current_bank])/*row is still active*/ { /*best_case*/ lat = SD_BEST_T_WRITE_WRITE_OBANK; best_case++; other_bank_write_access_hit++; obw_after_write_hit++; } else/*row is not active*/ { if (corrected_overlap > 0 )/*overlapping*/ { if(corrected_overlap >=SD_T_WRITE_WRITE_OBANK)/*best case*/ { lat = SD_BEST_T_WRITE_WRITE_OBANK; best_case++; full_overlapping++; } else/*in between case*/ { lat = SD_T_WRITE_WRITE_OBANK-corrected_overlap; in_between_case++; partial_overlapping++; } } else/*worst case*/ { lat = SD_T_WRITE_WRITE_OBANK; worst_case++; } // DR keep track of time between misses was_miss = 1; other_bank_write_access_miss[0]++; obw_after_write_miss++; } } } } else /*lastCmdIsRead != cmdIsRead*/ { if (current_bank == last_bank)/*same bank*/ { if (current_row == last_row)/*same row*/ { /* Page Hit */ if (cmdIsRead) {/*worst case*/ lat = SD_T_READ_WRITE_SROW; srow_flag = true; same_row_read_access++; srr_after_write++; worst_case++; } else/*write*/ {/*worst case*/ lat = SD_T_WRITE_READ_SROW; srow_flag = true; same_row_write_access++; srw_after_read++; worst_case++; } } else /*other row in same bank*/ { /* Page Miss */ if (cmdIsRead) {/*worst case*/ lat = SD_T_READ_WRITE_SBANK; same_bank_read_access++; sbr_after_write++; worst_case++; } else/*write*/ { if (corrected_overlap > 0 )/*overlapping*/ { if (corrected_overlap >= pre_lat)/*best case*/ { lat = SD_BEST_T_WRITE_READ_SBANK; best_case++; full_overlapping++; } else/*in between case*/ { lat = SD_T_WRITE_READ_SBANK-corrected_overlap; in_between_case++; partial_overlapping++; } } else/*worst case*/ { lat = SD_T_WRITE_READ_OBANK; worst_case++; } same_bank_write_access++; sbw_after_read++; } } } else /*other bank*/ { /* Page empty */ if (cmdIsRead) { if (current_row == active_row[current_bank])/*row is still active*/ { /*best case*/ lat = SD_BEST_T_READ_WRITE_OBANK; best_case++; other_bank_read_access_hit++; obr_after_write_hit++; } else/*row is not active*/ { if (corrected_overlap > 0 )/*overlapping*/ { if(corrected_overlap >= (pre_lat+act_lat))/*best case*/ { lat = SD_BEST_T_READ_WRITE_OBANK; best_case++; full_overlapping++; } else/*in between case*/ { lat = SD_T_READ_WRITE_OBANK-corrected_overlap; in_between_case++; partial_overlapping++; } } else/*worst case*/ { lat = SD_T_READ_WRITE_OBANK; worst_case++; } // DR keep track of time between misses was_miss = 1; other_bank_read_access_miss[0]++; obr_after_write_miss++; } } else/*write*/ { if (current_row == active_row[current_bank])/*row is still active*/ { /*best case*/ lat = SD_BEST_T_WRITE_READ_OBANK; best_case++; other_bank_write_access_hit++; obw_after_read_hit++; } else/*row is not active*/ { if (corrected_overlap > 0 )/*overlapping*/ { if (corrected_overlap >= (SD_T_WRITE_READ_OBANK-SD_BEST_T_WRITE_READ_OBANK))/*best case*/ {/*best case*/ lat = SD_BEST_T_WRITE_READ_OBANK; best_case++; full_overlapping++; } else/*in between case*/ { lat = SD_T_WRITE_READ_OBANK-corrected_overlap; in_between_case++; partial_overlapping++; } } else/*worst case*/ { lat = SD_T_WRITE_READ_OBANK; worst_case++; } // DR keep track of time between misses was_miss = 1; other_bank_write_access_miss[0]++; obw_after_read_miss++; } } } } /*fprintf(stderr,"%4d %4d ",lat,active_row[current_bank]);debugging*/ lat += chunks; /* burst length added*/ if(srow_flag == false) timing_correction = cpu_ratio*(trc_lat - pre_lat - act_lat - cas_lat - 1); /*fprintf(stderr,"%4d ",lat);debugging*/ active_row[current_bank]=current_row; /* open-page (hit) register */ lastCmdIsRead = cmdIsRead; last_bank = current_bank; last_row = current_row; if (cpu_ratio < 1.0) { lat = (lat+((int)(1/cpu_ratio)-1))/(int)(1/cpu_ratio); } else { temp = (int)(lat*cpu_ratio); lat = (lat*cpu_ratio == temp)?temp:(temp+1); /*round up*/ }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?