OpenCores
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

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [src_verilator/] [synful_wrapper.h] - Blame information for rev 56

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 54 alirezamon
#ifndef _SYNFUL_WRAPPER_H
2
        #define  _SYNFUL_WRAPPER_H
3
 
4
 
5
#include <iostream>
6
 
7
#include "synful/synful.h"
8
 
9
bool synful_SSExit;
10
int  synful_random_seed=53432145;
11
int  synful_packets_left = 0;
12
int  synful_flitw =4;
13
 
14
extern queue_t** synful_inject;
15
       queue_t** synful_traverse;
16
 
17
 
18
 
19
 
20
 
21
void synful_init(char * fname, bool ss_exit, int seed,unsigned int max_clk, unsigned int max_pck){
22
        //std::cout << "Initiating synful with: " << fname << "random seed:" << seed << std::endl;
23
    synful_model_init(fname, ss_exit,seed,max_clk, max_pck, traffic_model_mapping );
24
 
25
        synful_inject   = (queue_t**) malloc( NE * sizeof(queue_t*) );
26
        synful_traverse = (queue_t**) malloc( NE * sizeof(queue_t*) );
27
 
28
        if(synful_inject == NULL || synful_traverse == NULL ) {
29
                printf( "ERROR: malloc fail queues\n" );
30
                exit(0);
31
        }
32
        for(int i = 0; i <  NE; ++i ) {
33
                synful_inject[i]     = queue_new();
34
                synful_traverse[i]   = queue_new();
35
        }
36
}
37
 
38
 
39
void synful_final_report(){
40
        int i;
41
 
42
        if(verbosity==1)        printf("\e[?25h");//To re-enable the cursor:
43
        printf("\nSynful simulation results-------------------\n"
44
                        "\tSimulation clock cycles: %llu\n"
45
        ,synful_cycle);
46
        print_statistic_new (synful_cycle);
47
}
48
 
49
 
50
 
51
void synful_eval( ){
52
        int i;
53
        unsigned int pronoc_src_id,pronoc_dst_id;
54
 
55 56 alirezamon
        if((reset==reset_active_high) || (count_en==0))  return;
56 54 alirezamon
 
57
        if((( synful_cycle > sim_end_clk_num) || (total_sent_pck_num>= end_sim_pck_num )) && synful_packets_left==0 )  simulation_done=1;
58
 
59
        // Reset packets remaining check
60
        synful_packets_left = 0;
61
 
62
        synful_run_one_cycle ();
63
 
64
 
65
        // Inject where possible (max one per node)
66
        for( i = 0; i < NE; ++i ) {
67
                synful_packets_left |= !queue_empty( synful_inject[i] );
68
 
69
                //TODO define sent vc policy
70
                int sent_vc = 0;
71
 
72
                if(pck_inj[i]->pck_injct_in_pck_wr){
73
                        //the wr_pck should be asserted only for single cycle
74
                        pck_inj[i]->pck_injct_in_pck_wr            = 0;
75
                        continue;
76
                }
77
 
78
                pck_inj[i]->pck_injct_in_pck_wr            = 0;
79
                if((pck_inj[i]->pck_injct_out_ready & (0x1<<sent_vc)) == 0){
80
                        //This pck injector is not ready yet
81
                        continue;
82
                }
83
 
84
                pronoc_pck_t* temp_node = (pronoc_pck_t*) queue_peek_front( synful_inject[i] );
85
                if( temp_node != NULL ) {
86
                        if(verbosity>1) {
87
                                printf( "Inject: %llu ", synful_cycle );
88
                                synful_print_packet( temp_node );
89
                        }
90
                        temp_node = (pronoc_pck_t*) queue_pop_front( synful_inject[i] );
91
 
92
                        pronoc_dst_id =  traffic_model_mapping[temp_node->dest];
93
                        queue_push( synful_traverse[pronoc_dst_id], temp_node, synful_cycle );
94
                        int flit_num =  temp_node->packetSize / synful_flitw ;
95
                        if (flit_num*synful_flitw !=temp_node->packetSize) flit_num++;
96
                        if (flit_num < pck_inj[i]->min_pck_size) flit_num = pck_inj[i]->min_pck_size;
97
 
98
                        if(IS_SELF_LOOP_EN ==0){
99
                                if(pronoc_dst_id == i ){
100
                                         fprintf(stderr,"ERROR: ProNoC is not configured with self-loop enable and Netrace aims to inject\n a "
101
                                                         "packet with identical source and destination address. Enable the SELF_LOOP parameter\n"
102
                                                         "in ProNoC and rebuild the simulation model\n");
103
                                         exit(1);
104
                                }
105
                        }
106
 
107
                        unsigned int sent_class =0;
108
                        long int ptr_addr = reinterpret_cast<long int> (temp_node);
109
                        pck_inj[i]->pck_injct_in_data         = ptr_addr;
110
                        pck_inj[i]->pck_injct_in_size         = flit_num;
111
                        pck_inj[i]->pck_injct_in_endp_addr    = endp_addr_encoder(pronoc_dst_id);
112
                        pck_inj[i]->pck_injct_in_class_num    = sent_class;
113
                        pck_inj[i]->pck_injct_in_init_weight  = 1;
114
                        pck_inj[i]->pck_injct_in_vc           = 0x1<<sent_vc;
115
                        pck_inj[i]->pck_injct_in_pck_wr            = 1;
116
                        total_sent_pck_num++;
117
 
118
                        #if (C>1)
119
                                sent_stat[i][sent_class].pck_num ++;
120
                                sent_stat[i][sent_class].flit_num +=flit_num;
121
                        #else
122
                                sent_stat[i].pck_num ++;
123
                                sent_stat[i].flit_num +=flit_num;
124
                        #endif
125
                }//temp!=NULL
126
        }//inject
127
 
128
 
129
 
130
        // Step all network components, Eject where possible
131
        for( i = 0; i < NE; ++i ) {
132
                synful_packets_left |= !queue_empty( synful_traverse[i] );
133
                //check which pck injector got a packet
134
                if(pck_inj[i]->pck_injct_out_pck_wr==0) continue;
135
                //we have got a packet
136
                //printf( "data=%lx\n",pck_inj[i]->pck_injct_out_data);
137
 
138
                pronoc_pck_t* temp_node = (pronoc_pck_t*)  pck_inj[i]->pck_injct_out_data;
139
                if( temp_node != NULL ) {
140
                        if(verbosity>1) {
141
                                printf( "Eject: %llu ", synful_cycle );
142
                                synful_print_packet(temp_node);
143
                        }
144
                        //send it to synful
145
                        synful_Eject (temp_node);
146
 
147
                        // remove from traverse
148
 
149
                        queue_remove( synful_traverse[i], temp_node );
150
                        unsigned long long int    clk_num_h2t= (synful_cycle - temp_node->cycle);
151
                        unsigned int    clk_num_h2h= clk_num_h2t - pck_inj[i]->pck_injct_out_h2t_delay;
152
                        /*
153
                                printf("clk_num_h2t (%llu) h2t_delay(%u)\n", clk_num_h2t , pck_inj[i]->pck_injct_out_h2t_delay);
154
                                if(clk_num_h2t < pck_inj[i]->pck_injct_out_h2t_delay){
155
                                        fprintf(stderr, "ERROR:clk_num_h2t (%llu) is smaller than  injector h2t_delay(%u)\n", clk_num_h2t , pck_inj[i]->pck_injct_out_h2t_delay);
156
                                        exit(1);
157
                                }
158
                        */
159
                        pronoc_src_id=traffic_model_mapping[temp_node->source];
160
                        update_statistic_at_ejection (
161
                                        i,//    core_num
162
                                        clk_num_h2h, // clk_num_h2h,
163
                                        (unsigned int) clk_num_h2t, // clk_num_h2t,
164
                                        pck_inj[i]->pck_injct_out_distance, //    distance,
165
                                        pck_inj[i]->pck_injct_out_class_num,//          class_num,
166
                                        pronoc_src_id, //temp_node->source
167
                                        pck_inj[i]->pck_injct_out_size
168
                        );
169
 
170
                                free( temp_node );
171
 
172
                }//emp_node != NULL
173
        }//for
174
 
175
        synful_cycle++;
176
 
177
        //std::cout << synful_cycle << std::endl;
178
 
179
}
180
 
181
 
182
 
183
 
184
 
185
void synful_negedge_event( ){
186
        int i;
187
        clk = 0;
188
        topology_connect_all_nodes ();
189
        //connect_clk_reset_start_all();
190
        sim_eval_all();
191
}
192
 
193
void synful_posedge_event(){
194
        unsigned int i;
195
        clk = 1;       // Toggle clock
196
        update_all_router_stat();
197
        synful_eval();
198
        //connect_clk_reset_start_all();
199
        sim_eval_all();
200
        //print total sent packet each 1024 clock cycles
201
        if(verbosity==1) if(synful_cycle&0x3FF) printf("\rTotal sent packet: %9d", total_sent_pck_num);
202
}
203
 
204
 
205
 
206
 
207
 
208
#endif

powered by: WebSVN 2.1.0

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