⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tan_noc_worm_mesh_arbiter.pr.c

📁 片上网络
💻 C
📖 第 1 页 / 共 3 页
字号:
					
				
				req_pk_num++;
				if((op_intrpt_type() == OPC_INTRPT_STAT) && (op_intrpt_stat() == FIFO_mid)) {
					flag_mid = op_stat_read(FIFO_mid);
					isoccupy_mid = 1;
					req_mid++;
					if(flag_mid > 2) {
					    dest_address_mid = flag_mid - 3;
						flag_mid = 1;
					}
					if(isoccupy == 0) {
						isoccupy = 1;
						priority = 1;
					}
				}	
				else if((op_intrpt_type() == OPC_INTRPT_STAT) && (op_intrpt_stat() == FIFO_east)) {
					flag_east = op_stat_read(FIFO_east);
					isoccupy_east = 1;
					req_east++;
					if(flag_east > 2) {
						dest_address_east = flag_east - 3;
						flag_east = 1;
					}
					if(isoccupy == 0) {
						isoccupy = 1;
						priority = 2;
					}
				}
				else if((op_intrpt_type() == OPC_INTRPT_STAT) && (op_intrpt_stat() == FIFO_south)) {
					flag_east = op_stat_read(FIFO_south);
					isoccupy_south = 1;
					req_south++;
					if(flag_south > 2) {
						dest_address_south = flag_south - 3;
						flag_south = 1;
					}
					if(isoccupy == 0) {
						isoccupy = 1;
						priority = 3;
					}
				}
				else if((op_intrpt_type() == OPC_INTRPT_STAT) && (op_intrpt_stat() == FIFO_west)) {
					flag_west = op_stat_read(FIFO_west);
					isoccupy_west = 1;
					req_west++;
					if(flag_west > 2) {
						dest_address_west = flag_west - 3;
						flag_west = 1;
					}
					if(isoccupy == 0) {
						isoccupy = 1;
						priority = 4;
					}
				}	
				else if((op_intrpt_type() == OPC_INTRPT_STAT) && (op_intrpt_stat() == FIFO_north)){
					flag_north = op_stat_read(FIFO_north);
					isoccupy_north = 1;
					req_north++;
					if(flag_north > 2) {
						dest_address_north = flag_north - 3;
						flag_north = 1;
					}
					if(isoccupy == 0) {
						isoccupy = 1;
						priority = 5;
					}
				}
					
				if(crossbar_busy == 1 || next_fifo_full == 1)
					wait = 1;
				else
					{
					wait = 0;
					if(op_sim_time() != t_flag)
						{
						t_flag = op_sim_time();
						op_intrpt_schedule_self (op_sim_time (),0);
						}
					}
				
				}
				FSM_PROFILE_SECTION_OUT (state3_enter_exec)

			/** state (arbiter_start) exit executives **/
			FSM_STATE_EXIT_FORCED (3, "arbiter_start", "tan_noc_worm_mesh_arbiter [arbiter_start exit execs]")


			/** state (arbiter_start) transition processing **/
			FSM_PROFILE_SECTION_IN ("tan_noc_worm_mesh_arbiter [arbiter_start trans conditions]", state3_trans_conds)
			FSM_INIT_COND (!wait)
			FSM_TEST_COND (wait)
			FSM_TEST_LOGIC ("arbiter_start")
			FSM_PROFILE_SECTION_OUT (state3_trans_conds)

			FSM_TRANSIT_SWITCH
				{
				FSM_CASE_TRANSIT (0, 1, state1_enter_exec, ;, "!wait", "", "arbiter_start", "idel")
				FSM_CASE_TRANSIT (1, 7, state7_enter_exec, ;, "wait", "", "arbiter_start", "wait")
				}
				/*---------------------------------------------------------*/



			/** state (corssbar_busy) enter executives **/
			FSM_STATE_ENTER_FORCED (4, "corssbar_busy", state4_enter_exec, "tan_noc_worm_mesh_arbiter [corssbar_busy enter execs]")
				FSM_PROFILE_SECTION_IN ("tan_noc_worm_mesh_arbiter [corssbar_busy enter execs]", state4_enter_exec)
				{
				/*judging whether the crossbar are transmitting packets at that time or not */
				
				    crossbar_busy = 1;
				}
				FSM_PROFILE_SECTION_OUT (state4_enter_exec)

			/** state (corssbar_busy) exit executives **/
			FSM_STATE_EXIT_FORCED (4, "corssbar_busy", "tan_noc_worm_mesh_arbiter [corssbar_busy exit execs]")


			/** state (corssbar_busy) transition processing **/
			FSM_TRANSIT_FORCE (1, state1_enter_exec, ;, "default", "", "corssbar_busy", "idel")
				/*---------------------------------------------------------*/



			/** state (arbiter) enter executives **/
			FSM_STATE_ENTER_FORCED (5, "arbiter", state5_enter_exec, "tan_noc_worm_mesh_arbiter [arbiter enter execs]")
				FSM_PROFILE_SECTION_IN ("tan_noc_worm_mesh_arbiter [arbiter enter execs]", state5_enter_exec)
				{
				
				/* arbiter */
				
				/*********************************************************************************/
				
				// process mid request.
				if(priority == 1) {
					if(next_fifo_full == 0 && req_mid != 0) {
						if(flag_mid != 2) {   // 判断是否是包尾。
							op_stat_write(mid_allow, 1.0);
						}
						else {
							op_stat_write(mid_allow, 1.0);
							isoccupy_mid = 0;
							isoccupy = 0;
							if(isoccupy_east == 1) { isoccupy = 1; priority = 2;}
							else if(isoccupy_south == 1) { isoccupy = 1; priority = 3;}
							else if(isoccupy_west == 1) { isoccupy = 1; priority = 4;}
							else if(isoccupy_north == 1) {isoccupy = 1; priority = 5;}
							else priority = 0;
						}
						//printf("fifo_mid_allow \n");
						req_mid--;
					}
				}
				
				// process east request.
				else if(priority == 2) {
					if(next_fifo_full == 0 && req_east != 0) {
						if(flag_east != 2) {  // 判断是否是包尾。
							op_stat_write(east_allow, 1.0);
						}
						else {
							op_stat_write(east_allow, 1.0);
							isoccupy_east = 0;
							isoccupy = 0;
							if(isoccupy_south == 1) {isoccupy = 1; priority = 3;}
							else if(isoccupy_west == 1) { isoccupy = 1; priority = 4;}
							else if(isoccupy_north == 1) {isoccupy = 1; priority = 5;}
							else if(isoccupy_mid == 1) { isoccupy = 1; priority = 1;}
							else priority = 0;
						}
						req_east--;
					}
				}
				
				// process south request.
				else if(priority == 3) {
					if(next_fifo_full == 0 && req_south != 0) {
						if(flag_south != 2) {  // 判断是否是包尾。
							op_stat_write(south_allow, 1.0);
						}
						else {
							op_stat_write(south_allow, 1.0);
							isoccupy_south = 0;
							isoccupy = 0;
							if(isoccupy_west == 1) { isoccupy = 1; priority = 4;}
							else if(isoccupy_north == 1) {isoccupy = 1; priority = 5;}
							else if(isoccupy_mid == 1) { isoccupy = 1; priority = 1;}
							else if(isoccupy_east == 1) { isoccupy = 1; priority = 2;}
							else priority = 0;
						}
						req_south--;
					}
				}
				
				// process west request.
				else if(priority == 4) {
					if(next_fifo_full == 0 && req_west != 0) {
						if(flag_west != 2) {  // 判断是否是包尾。
							op_stat_write(west_allow, 1.0);
						}
						else {
							op_stat_write(west_allow, 1.0);
							isoccupy_west = 0;
							isoccupy = 0;
							if(isoccupy_north == 1) {isoccupy = 1; priority = 5;}
							else if(isoccupy_mid == 1) { isoccupy = 1; priority = 1;}
							else if(isoccupy_east == 1) { isoccupy = 1; priority = 2;}
							else if(isoccupy_south == 1) { isoccupy = 1; priority = 3;}
							else priority = 0;
						}
						req_west--;
					}
				}
				
				// process north request.
				else if(priority == 5) {
					if(next_fifo_full == 0 && req_north != 0) {
						if(flag_north != 2) {  // 判断是否是包尾。
							op_stat_write(north_allow, 1.0);
						}
						else {
							op_stat_write(north_allow, 1.0);
							isoccupy_north = 0;
							isoccupy = 0;
							if(isoccupy_mid == 1) { isoccupy = 1; priority = 1;}
							else if(isoccupy_east == 1) { isoccupy = 1; priority = 2;}
							else if(isoccupy_south == 1) { isoccupy = 1; priority = 3;}
							else if(isoccupy_west == 1) { isoccupy = 1; priority = 4;}
							else priority = 0;
						}
						req_north--;
					}
				}
				}
				FSM_PROFILE_SECTION_OUT (state5_enter_exec)

			/** state (arbiter) exit executives **/
			FSM_STATE_EXIT_FORCED (5, "arbiter", "tan_noc_worm_mesh_arbiter [arbiter exit execs]")


			/** state (arbiter) transition processing **/
			FSM_PROFILE_SECTION_IN ("tan_noc_worm_mesh_arbiter [arbiter trans conditions]", state5_trans_conds)
			FSM_INIT_COND (req_pk_num==0)
			FSM_TEST_COND (req_pk_num!=0)
			FSM_TEST_LOGIC ("arbiter")
			FSM_PROFILE_SECTION_OUT (state5_trans_conds)

			FSM_TRANSIT_SWITCH
				{
				FSM_CASE_TRANSIT (0, 1, state1_enter_exec, ;, "req_pk_num==0", "", "arbiter", "idel")
				FSM_CASE_TRANSIT (1, 7, state7_enter_exec, ;, "req_pk_num!=0", "", "arbiter", "wait")
				}
				/*---------------------------------------------------------*/



			/** state (crossbar_free) enter executives **/
			FSM_STATE_ENTER_FORCED (6, "crossbar_free", state6_enter_exec, "tan_noc_worm_mesh_arbiter [crossbar_free enter execs]")
				FSM_PROFILE_SECTION_IN ("tan_noc_worm_mesh_arbiter [crossbar_free enter execs]", state6_enter_exec)
				{
				crossbar_busy = 0;
				}
				FSM_PROFILE_SECTION_OUT (state6_enter_exec)

			/** state (crossbar_free) exit executives **/
			FSM_STATE_EXIT_FORCED (6, "crossbar_free", "tan_noc_worm_mesh_arbiter [crossbar_free exit execs]")


			/** state (crossbar_free) transition processing **/
			FSM_TRANSIT_FORCE (1, state1_enter_exec, ;, "default", "", "crossbar_free", "idel")
				/*---------------------------------------------------------*/



			/** state (wait) enter executives **/
			FSM_STATE_ENTER_UNFORCED (7, "wait", state7_enter_exec, "tan_noc_worm_mesh_arbiter [wait enter execs]")

			/** blocking after enter executives of unforced state. **/
			FSM_EXIT (15,"tan_noc_worm_mesh_arbiter")


			/** state (wait) exit executives **/
			FSM_STATE_EXIT_UNFORCED (7, "wait", "tan_noc_worm_mesh_arbiter [wait exit execs]")


			/** state (wait) transition processing **/
			FSM_PROFILE_SECTION_IN ("tan_noc_worm_mesh_arbiter [wait trans conditions]", state7_trans_conds)
			FSM_INIT_COND (REQUEST&&(crossbar_busy == 0))
			FSM_TEST_COND (FLOW_CONTROL&&(crossbar_busy == 0))
			FSM_TEST_COND (CROSSBAR_BUSY)
			FSM_TEST_COND (CROSSBAR_FREE)
			FSM_TEST_COND (REQUEST&&(crossbar_busy == 1))
			FSM_TEST_COND (SELF_INTRPT)
			FSM_TEST_COND (FLOW_CONTROL&&(crossbar_busy == 1))
			FSM_TEST_LOGIC ("wait")
			FSM_PROFILE_SECTION_OUT (state7_trans_conds)

			FSM_TRANSIT_SWITCH
				{
				FSM_CASE_TRANSIT (0, 3, state3_enter_exec, ;, "REQUEST&&(crossbar_busy == 0)", "", "wait", "arbiter_start")
				FSM_CASE_TRANSIT (1, 2, state2_enter_exec, ;, "FLOW_CONTROL&&(crossbar_busy == 0)", "", "wait", "flow_control")
				FSM_CASE_TRANSIT (2, 8, state8_enter_exec, ;, "CROSSBAR_BUSY", "", "wait", "corssbar_busy_0")
				FSM_CASE_TRANSIT (3, 9, state9_enter_exec, ;, "CROSSBAR_FREE", "", "wait", "crossbar_free_0")
				FSM_CASE_TRANSIT (4, 11, state11_enter_exec, ;, "REQUEST&&(crossbar_busy == 1)", "", "wait", "arbiter_start_1")
				FSM_CASE_TRANSIT (5, 7, state7_enter_exec, ;, "SELF_INTRPT", "", "wait", "wait")
				FSM_CASE_TRANSIT (6, 7, state7_enter_exec, ;, "FLOW_CONTROL&&(crossbar_busy == 1)", "", "wait", "wait")
				}
				/*---------------------------------------------------------*/



			/** state (corssbar_busy_0) enter executives **/
			FSM_STATE_ENTER_FORCED (8, "corssbar_busy_0", state8_enter_exec, "tan_noc_worm_mesh_arbiter [corssbar_busy_0 enter execs]")
				FSM_PROFILE_SECTION_IN ("tan_noc_worm_mesh_arbiter [corssbar_busy_0 enter execs]", state8_enter_exec)
				{
				/*judging whether the crossbar are transmitting packets at that time or not */
				
				    crossbar_busy = 1;
				}
				FSM_PROFILE_SECTION_OUT (state8_enter_exec)

			/** state (corssbar_busy_0) exit executives **/
			FSM_STATE_EXIT_FORCED (8, "corssbar_busy_0", "tan_noc_worm_mesh_arbiter [corssbar_busy_0 exit execs]")


			/** state (corssbar_busy_0) transition processing **/
			FSM_TRANSIT_FORCE (7, state7_enter_exec, ;, "default", "", "corssbar_busy_0", "wait")
				/*---------------------------------------------------------*/



			/** state (crossbar_free_0) enter executives **/
			FSM_STATE_ENTER_FORCED (9, "crossbar_free_0", state9_enter_exec, "tan_noc_worm_mesh_arbiter [crossbar_free_0 enter execs]")
				FSM_PROFILE_SECTION_IN ("tan_noc_worm_mesh_arbiter [crossbar_free_0 enter execs]", state9_enter_exec)
				{
				
				crossbar_busy = 0;
				}
				FSM_PROFILE_SECTION_OUT (state9_enter_exec)

			/** state (crossbar_free_0) exit executives **/
			FSM_STATE_EXIT_FORCED (9, "crossbar_free_0", "tan_noc_worm_mesh_arbiter [crossbar_free_0 exit execs]")


			/** state (crossbar_free_0) transition processing **/
			FSM_TRANSIT_FORCE (5, state5_enter_exec, ;, "default", "", "crossbar_free_0", "arbiter")
				/*---------------------------------------------------------*/



			/** state (flow_control_0) enter executives **/
			FSM_STATE_ENTER_FORCED (10, "flow_control_0", state10_enter_exec, "tan_noc_worm_mesh_arbiter [flow_control_0 enter execs]")
				FSM_PROFILE_SECTION_IN ("tan_noc_worm_mesh_arbiter [flow_control_0 enter execs]", state10_enter_exec)
				{
				/*modify the flag value about next_fifo state*/
				if(op_stat_read(FIFO_next)==1)
					next_fifo_full = 1;
				else
					next_fifo_full = 0;
				}
				FSM_PROFILE_SECTION_OUT (state10_enter_exec)

			/** state (flow_control_0) exit executives **/
			FSM_STATE_EXIT_FORCED (10, "flow_control_0", "tan_noc_worm_mesh_arbiter [flow_control_0 exit execs]")


			/** state (flow_control_0) transition processing **/
			FSM_TRANSIT_FORCE (1, state1_enter_exec, ;, "default", "", "flow_control_0", "idel")
				/*---------------------------------------------------------*/



			/** state (arbiter_start_1) enter executives **/
			FSM_STATE_ENTER_FORCED (11, "arbiter_start_1", state11_enter_exec, "tan_noc_worm_mesh_arbiter [arbiter_start_1 enter execs]")
				FSM_PROFILE_SECTION_IN ("tan_noc_worm_mesh_arbiter [arbiter_start_1 enter execs]", state11_enter_exec)
				{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -