OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_47/] [or1ksim/] [cpu/] [common/] [stats.c] - Diff between revs 30 and 34

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 30 Rev 34
Line 32... Line 32...
struct fstats_entry fstats[FSTATS_LEN]; /* functional units stats */
struct fstats_entry fstats[FSTATS_LEN]; /* functional units stats */
struct mstats_entry mstats;             /* misc units stats */
struct mstats_entry mstats;             /* misc units stats */
struct cachestats_entry ic_stats;       /* instruction cache stats */
struct cachestats_entry ic_stats;       /* instruction cache stats */
struct cachestats_entry dc_stats;       /* data cache stats */
struct cachestats_entry dc_stats;       /* data cache stats */
struct raw_stats raw_stats;             /* RAW hazard stats */
struct raw_stats raw_stats;             /* RAW hazard stats */
 
struct slp_stats slp_stats;             /* SLP stats */
 
 
/* Dependency */
/* Dependency */
 
 
int check_depend()
int check_depend()
{
{
Line 125... Line 126...
        memset(fstats, 0, sizeof(fstats));
        memset(fstats, 0, sizeof(fstats));
        memset(&mstats, 0, sizeof(mstats));
        memset(&mstats, 0, sizeof(mstats));
        memset(&ic_stats, 0, sizeof(ic_stats));
        memset(&ic_stats, 0, sizeof(ic_stats));
        memset(&dc_stats, 0, sizeof(dc_stats));
        memset(&dc_stats, 0, sizeof(dc_stats));
        memset(&raw_stats, 0, sizeof(raw_stats));
        memset(&raw_stats, 0, sizeof(raw_stats));
 
        memset(&slp_stats, 0, sizeof(slp_stats));
 
}
 
 
 
/* SLP
 
 
 
1: R
 
2:  R
 
3:   R
 
OK
 
 
 
1:     W
 
2: R
 
3: R
 
flush 2 3
 
 
 
1:     R
 
2: W
 
3:  R
 
OK
 
 
 
1: R
 
2:     W
 
3:  R
 
flush 3
 
 
 
flushing: don't flush if written location hasn't change after the write since
 
original read got correct data.
 
 
 
*/
 
 
 
void slp_checkaccess(unsigned long addr, char type)
 
{
 
        if ((addr < (MEMORY_START + MEMORY_LEN - 4000)) &&
 
            slp_stats.supercnt && (type == SLP_MEMWRITE)) {
 
                slp_stats.supercalls++;
 
                slp_stats.supercnt = 0;
 
        }
 
}
 
 
 
void slp_func_entry()
 
{
 
        if (++slp_stats.curdepth > slp_stats.maxdepth)
 
                slp_stats.maxdepth = slp_stats.curdepth;
 
 
 
        slp_stats.calls++;
 
        slp_stats.supercnt++;
 
}
 
 
 
void slp_func_exit()
 
{
 
        slp_stats.curdepth--;
}
}
 
 
void printstats(int which)
void printstats(int which)
{
{
        int i, all = 0, dependall = 0;
        int i, all = 0, dependall = 0;
Line 185... Line 237...
                }
                }
 
 
        for(i = 0; (i < RAW_RANGE) && (which == 5); i++)
        for(i = 0; (i < RAW_RANGE) && (which == 5); i++)
                printf(" Register set and reused in %d. cycle: %d cases\n", i, raw_stats.range[i]);
                printf(" Register set and reused in %d. cycle: %d cases\n", i, raw_stats.range[i]);
 
 
 
        if (which == 6) {
 
                printf("SLP:\n");
 
                printf("maxdepth: %6d  calls: %6d\n", slp_stats.maxdepth, slp_stats.calls);
 
                printf("calls: %6d    supercalls: %6d\n", slp_stats.calls, slp_stats.supercalls);
 
        }
 
 
        printf("SUM: %d instructions (dynamic, functional units stats)  depend: %d%%\n", all, (dependall * 100) / SD(all));
        printf("SUM: %d instructions (dynamic, functional units stats)  depend: %d%%\n", all, (dependall * 100) / SD(all));
        printf("Byte ADD: %d instructions\n", mstats.byteadd);
        printf("Byte ADD: %d instructions\n", mstats.byteadd);
        printf("bnf: %d (%d%%) taken,", mstats.beqz.taken, (mstats.beqz.taken * 100) / SD(mstats.beqz.taken + mstats.beqz.nottaken));
        printf("bnf: %d (%d%%) taken,", mstats.beqz.taken, (mstats.beqz.taken * 100) / SD(mstats.beqz.taken + mstats.beqz.nottaken));
        printf(" %d (%d%%) not taken,", mstats.beqz.nottaken, (mstats.beqz.nottaken * 100) / SD(mstats.beqz.taken + mstats.beqz.nottaken));
        printf(" %d (%d%%) not taken,", mstats.beqz.nottaken, (mstats.beqz.nottaken * 100) / SD(mstats.beqz.taken + mstats.beqz.nottaken));
        printf(" %d (%d%%) forward,", mstats.beqz.forward, (mstats.beqz.forward * 100) / SD(mstats.beqz.forward + mstats.beqz.backward));
        printf(" %d (%d%%) forward,", mstats.beqz.forward, (mstats.beqz.forward * 100) / SD(mstats.beqz.forward + mstats.beqz.backward));

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.