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] - Rev 56

Compare with Previous | Blame | View Log

#ifndef _SYNFUL_WRAPPER_H
	#define  _SYNFUL_WRAPPER_H
 
 
#include <iostream>
 
#include "synful/synful.h"
 
bool synful_SSExit;
int  synful_random_seed=53432145;
int  synful_packets_left = 0;
int  synful_flitw =4;
 
extern queue_t** synful_inject;
       queue_t** synful_traverse;
 
 
 
 
 
void synful_init(char * fname, bool ss_exit, int seed,unsigned int max_clk, unsigned int max_pck){
	//std::cout << "Initiating synful with: " << fname << "random seed:" << seed << std::endl;
    synful_model_init(fname, ss_exit,seed,max_clk, max_pck, traffic_model_mapping );
 
 	synful_inject   = (queue_t**) malloc( NE * sizeof(queue_t*) );
 	synful_traverse = (queue_t**) malloc( NE * sizeof(queue_t*) );
 
 	if(synful_inject == NULL || synful_traverse == NULL ) {
		printf( "ERROR: malloc fail queues\n" );
		exit(0);
	}
	for(int i = 0; i <  NE; ++i ) {
		synful_inject[i]     = queue_new();
		synful_traverse[i]   = queue_new();
	}
}
 
 
void synful_final_report(){
	int i;
 
	if(verbosity==1) 	printf("\e[?25h");//To re-enable the cursor:
	printf("\nSynful simulation results-------------------\n"
			"\tSimulation clock cycles: %llu\n"
	,synful_cycle);
	print_statistic_new (synful_cycle);
}
 
 
 
void synful_eval( ){
	int i;
	unsigned int pronoc_src_id,pronoc_dst_id;
 
	if((reset==reset_active_high) || (count_en==0))	return;
 
	if((( synful_cycle > sim_end_clk_num) || (total_sent_pck_num>= end_sim_pck_num )) && synful_packets_left==0 )  simulation_done=1;
 
	// Reset packets remaining check
	synful_packets_left = 0;
 
	synful_run_one_cycle ();
 
 
	// Inject where possible (max one per node)
	for( i = 0; i < NE; ++i ) {
		synful_packets_left |= !queue_empty( synful_inject[i] );
 
		//TODO define sent vc policy
		int sent_vc = 0;
 
		if(pck_inj[i]->pck_injct_in_pck_wr){
			//the wr_pck should be asserted only for single cycle
			pck_inj[i]->pck_injct_in_pck_wr  	   = 0;
			continue;
		}
 
		pck_inj[i]->pck_injct_in_pck_wr  	   = 0;
		if((pck_inj[i]->pck_injct_out_ready & (0x1<<sent_vc)) == 0){
			//This pck injector is not ready yet
			continue;
		}
 
		pronoc_pck_t* temp_node = (pronoc_pck_t*) queue_peek_front( synful_inject[i] );
		if( temp_node != NULL ) {
			if(verbosity>1) {
				printf( "Inject: %llu ", synful_cycle );
				synful_print_packet( temp_node );
			}
			temp_node = (pronoc_pck_t*) queue_pop_front( synful_inject[i] );
 
			pronoc_dst_id =  traffic_model_mapping[temp_node->dest];
			queue_push( synful_traverse[pronoc_dst_id], temp_node, synful_cycle );
			int flit_num =  temp_node->packetSize / synful_flitw ;
			if (flit_num*synful_flitw !=temp_node->packetSize) flit_num++;
			if (flit_num < pck_inj[i]->min_pck_size) flit_num = pck_inj[i]->min_pck_size;
 
			if(IS_SELF_LOOP_EN ==0){
				if(pronoc_dst_id == i ){
					 fprintf(stderr,"ERROR: ProNoC is not configured with self-loop enable and Netrace aims to inject\n a "
							 "packet with identical source and destination address. Enable the SELF_LOOP parameter\n"
							 "in ProNoC and rebuild the simulation model\n");
					 exit(1);
				}
			}
 
			unsigned int sent_class =0;
			long int ptr_addr = reinterpret_cast<long int> (temp_node);
			pck_inj[i]->pck_injct_in_data         = ptr_addr;
			pck_inj[i]->pck_injct_in_size         = flit_num;
			pck_inj[i]->pck_injct_in_endp_addr    = endp_addr_encoder(pronoc_dst_id);
			pck_inj[i]->pck_injct_in_class_num    = sent_class;
			pck_inj[i]->pck_injct_in_init_weight  = 1;
			pck_inj[i]->pck_injct_in_vc           = 0x1<<sent_vc;
			pck_inj[i]->pck_injct_in_pck_wr  	   = 1;
			total_sent_pck_num++;
 
			#if (C>1)
				sent_stat[i][sent_class].pck_num ++;
				sent_stat[i][sent_class].flit_num +=flit_num;
			#else
				sent_stat[i].pck_num ++;
				sent_stat[i].flit_num +=flit_num;
			#endif
		}//temp!=NULL
	}//inject
 
 
 
	// Step all network components, Eject where possible
	for( i = 0; i < NE; ++i ) {
		synful_packets_left |= !queue_empty( synful_traverse[i] );
		//check which pck injector got a packet
		if(pck_inj[i]->pck_injct_out_pck_wr==0) continue;
		//we have got a packet
		//printf( "data=%lx\n",pck_inj[i]->pck_injct_out_data);
 
		pronoc_pck_t* temp_node = (pronoc_pck_t*)  pck_inj[i]->pck_injct_out_data;
		if( temp_node != NULL ) {
			if(verbosity>1) {
				printf( "Eject: %llu ", synful_cycle );
				synful_print_packet(temp_node);
			}
			//send it to synful
			synful_Eject (temp_node);
 
			// remove from traverse
 
			queue_remove( synful_traverse[i], temp_node );
			unsigned long long int    clk_num_h2t= (synful_cycle - temp_node->cycle);
			unsigned int    clk_num_h2h= clk_num_h2t - pck_inj[i]->pck_injct_out_h2t_delay;
			/*
				printf("clk_num_h2t (%llu) h2t_delay(%u)\n", clk_num_h2t , pck_inj[i]->pck_injct_out_h2t_delay);
				if(clk_num_h2t < pck_inj[i]->pck_injct_out_h2t_delay){
					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);
					exit(1);
				}
			*/
			pronoc_src_id=traffic_model_mapping[temp_node->source];
			update_statistic_at_ejection (
					i,//	core_num
					clk_num_h2h, // clk_num_h2h,
					(unsigned int) clk_num_h2t, // clk_num_h2t,
					pck_inj[i]->pck_injct_out_distance, //    distance,
					pck_inj[i]->pck_injct_out_class_num,//  	class_num,
					pronoc_src_id, //temp_node->source
					pck_inj[i]->pck_injct_out_size
			);
 
				free( temp_node );
 
		}//emp_node != NULL
	}//for
 
	synful_cycle++;
 
	//std::cout << synful_cycle << std::endl;
 
}
 
 
 
 
 
void synful_negedge_event( ){
	int i;
	clk = 0;
	topology_connect_all_nodes ();
	//connect_clk_reset_start_all();
	sim_eval_all();
}
 
void synful_posedge_event(){
	unsigned int i;
	clk = 1;       // Toggle clock
	update_all_router_stat();
	synful_eval();
	//connect_clk_reset_start_all();
	sim_eval_all();
	//print total sent packet each 1024 clock cycles
	if(verbosity==1) if(synful_cycle&0x3FF) printf("\rTotal sent packet: %9d", total_sent_pck_num);
}
 
 
 
 
 
#endif
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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