#ifdef VHDL /* * $Id: Execute_queue_vhdl_body.cpp 98 2008-12-31 10:18:08Z rosiere $ * * [ Description ] * */ #include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Write_unit/Write_unit/Execute_queue/include/Execute_queue.h" namespace morpheo { namespace behavioural { namespace core { namespace multi_execute_loop { namespace execute_loop { namespace multi_write_unit { namespace write_unit { namespace execute_queue { #undef FUNCTION #define FUNCTION "Execute_queue::vhdl_body" void Execute_queue::vhdl_body (Vhdl * & vhdl) { log_printf(FUNC,Execute_queue,FUNCTION,"Begin"); vhdl->set_comment(0,""); vhdl->set_comment(0,"-----------------------------------"); vhdl->set_comment(0,"-- Instance queue "); vhdl->set_comment(0,"-----------------------------------"); vhdl->set_comment(0,""); vhdl->set_body (0,"instance_"+_name+"_queue : "+_name+"_queue"); vhdl->set_body (0,"port map ("); vhdl->set_body (1," in_CLOCK \t=>\t in_CLOCK "); vhdl->set_body (1,", in_NRESET \t=>\t in_NRESET"); vhdl->set_body (1,", in_INSERT_VAL \t=>\tinternal_QUEUE_INSERT_VAL"); vhdl->set_body (1,",out_INSERT_ACK \t=>\tinternal_QUEUE_INSERT_ACK"); vhdl->set_body (1,", in_INSERT_DATA \t=>\tinternal_QUEUE_INSERT_DATA"); vhdl->set_body (1,",out_RETIRE_VAL \t=>\tinternal_QUEUE_RETIRE_VAL"); vhdl->set_body (1,", in_RETIRE_ACK \t=>\tinternal_QUEUE_RETIRE_ACK"); vhdl->set_body (1,",out_RETIRE_DATA \t=>\tinternal_QUEUE_RETIRE_DATA"); vhdl->set_body (0,");"); vhdl->set_comment(0,""); vhdl->set_comment(0,"-----------------------------------"); vhdl->set_comment(0,"-- Input Buffer "); vhdl->set_comment(0,"-----------------------------------"); vhdl->set_comment(0,""); { uint32_t min = 0; uint32_t max, size; if(_param->_have_port_context_id ) { size = _param->_size_context_id; max = min-1+size; vhdl->set_body (0,"internal_QUEUE_INSERT_DATA "+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_EXECUTE_QUEUE_IN_CONTEXT_ID;"); min = max+1; } if(_param->_have_port_front_end_id ) { size = _param->_size_front_end_id; max = min-1+size; vhdl->set_body (0,"internal_QUEUE_INSERT_DATA "+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_EXECUTE_QUEUE_IN_FRONT_END_ID;"); min = max+1; } if(_param->_have_port_ooo_engine_id ) { size = _param->_size_ooo_engine_id; max = min-1+size; vhdl->set_body (0,"internal_QUEUE_INSERT_DATA "+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_EXECUTE_QUEUE_IN_OOO_ENGINE_ID;"); min = max+1; } if(_param->_have_port_rob_ptr) { size = _param->_size_rob_ptr; max = min-1+size; vhdl->set_body (0,"internal_QUEUE_INSERT_DATA "+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_EXECUTE_QUEUE_IN_PACKET_ID;"); min = max+1; } // size = _param->_size_operation; // max = min-1+size; // vhdl->set_body (0,"internal_QUEUE_INSERT_DATA "+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_EXECUTE_QUEUE_IN_OPERATION;"); // min = max+1; // // size = _param->_size_type; // max = min-1+size; // vhdl->set_body (0,"internal_QUEUE_INSERT_DATA "+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_EXECUTE_QUEUE_IN_TYPE;"); // min = max+1; size = _param->_size_special_data; max = min-1+size; vhdl->set_body (0,"internal_QUEUE_INSERT_DATA "+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_EXECUTE_QUEUE_IN_FLAGS;"); min = max+1; size = _param->_size_exception; max = min-1+size; vhdl->set_body (0,"internal_QUEUE_INSERT_DATA "+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_EXECUTE_QUEUE_IN_EXCEPTION;"); min = max+1; size = 1; max = min-1+size; vhdl->set_body (0,"internal_QUEUE_INSERT_DATA "+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_EXECUTE_QUEUE_IN_NO_SEQUENCE;"); min = max+1; size = _param->_size_instruction_address; max = min-1+size; vhdl->set_body (0,"internal_QUEUE_INSERT_DATA "+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_EXECUTE_QUEUE_IN_ADDRESS;"); min = max+1; size = _param->_size_general_data; max = min-1+size; vhdl->set_body (0,"internal_QUEUE_INSERT_DATA "+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_EXECUTE_QUEUE_IN_DATA;"); min = max+1; } vhdl->set_comment(0,""); vhdl->set_comment(0,"-----------------------------------"); vhdl->set_comment(0,"-- Output Buffer "); vhdl->set_comment(0,"-----------------------------------"); vhdl->set_comment(0,""); if(_param->_have_port_context_id) vhdl->set_body (0,"out_EXECUTE_QUEUE_OUT_CONTEXT_ID <= internal_EXECUTE_QUEUE_OUT_CONTEXT_ID ;"); if(_param->_have_port_front_end_id) vhdl->set_body (0,"out_EXECUTE_QUEUE_OUT_FRONT_END_ID <= internal_EXECUTE_QUEUE_OUT_FRONT_END_ID ;"); if(_param->_have_port_ooo_engine_id) vhdl->set_body (0,"out_EXECUTE_QUEUE_OUT_OOO_ENGINE_ID <= internal_EXECUTE_QUEUE_OUT_OOO_ENGINE_ID;"); if(_param->_have_port_rob_ptr) vhdl->set_body (0,"out_EXECUTE_QUEUE_OUT_PACKET_ID <= internal_EXECUTE_QUEUE_OUT_PACKET_ID ;"); // vhdl->set_body (0,"out_EXECUTE_QUEUE_OUT_OPERATION <= internal_EXECUTE_QUEUE_OUT_OPERATION ;"); // vhdl->set_body (0,"out_EXECUTE_QUEUE_OUT_TYPE <= internal_EXECUTE_QUEUE_OUT_TYPE ;"); vhdl->set_body (0,"out_EXECUTE_QUEUE_OUT_FLAGS <= internal_EXECUTE_QUEUE_OUT_FLAGS ;"); vhdl->set_body (0,"out_EXECUTE_QUEUE_OUT_EXCEPTION <= internal_EXECUTE_QUEUE_OUT_EXCEPTION ;"); vhdl->set_body (0,"out_EXECUTE_QUEUE_OUT_NO_SEQUENCE <= internal_EXECUTE_QUEUE_OUT_NO_SEQUENCE ;"); vhdl->set_body (0,"out_EXECUTE_QUEUE_OUT_ADDRESS <= internal_EXECUTE_QUEUE_OUT_ADDRESS ;"); vhdl->set_body (0,"out_EXECUTE_QUEUE_OUT_DATA <= internal_EXECUTE_QUEUE_OUT_DATA ;"); // vhdl->set_body (0,""); // vhdl->set_body (0,"process (in_CLOCK)"); // vhdl->set_body (0,"begin"); // vhdl->set_body (1,"if in_CLOCK'event and in_CLOCK = '1' then"); // // vhdl->set_body (2,"if in_NRESET = '0' then"); // // vhdl->set_body (3,"reg_CURRENT_STATE <= STATE_0;"); // // vhdl->set_body (2,"else"); // vhdl->set_body (3,"reg_CURRENT_STATE <= sig_NEXT_STATE;"); // // vhdl->set_body (2,"end if;"); // for (uint32_t i = 0; i <_param->_size_queue - 1; i++) // { // vhdl->set_body (2,"if sig_WEN_"+toString(i)+" = '1' then"); // vhdl->set_body (3,"if sig_SEL_"+toString(i)+" = '0' then"); // if (_param->_have_port_context_id) // vhdl->set_body (4,"reg_CONTEXT_ID_"+toString(i)+" <= in_EXECUTE_QUEUE_IN_CONTEXT_ID;"); // if (_param->_have_port_front_end_id) // vhdl->set_body (4,"reg_FRONT_END_ID_"+toString(i)+" <= in_EXECUTE_QUEUE_IN_FRONT_END_ID;"); // if (_param->_have_port_ooo_engine_id) // vhdl->set_body (4,"reg_OOO_ENGINE_ID_"+toString(i)+" <= in_EXECUTE_QUEUE_IN_OOO_ENGINE_ID;"); // if (_param->_have_port_rob_ptr) // vhdl->set_body (4,"reg_PACKET_ID_"+toString(i)+" <= in_EXECUTE_QUEUE_IN_PACKET_ID;"); // vhdl->set_body (4, "reg_FLAGS_"+toString(i)+" <= in_EXECUTE_QUEUE_IN_FLAGS;"); // vhdl->set_body (4, "reg_EXCEPTION_"+toString(i)+" <= in_EXECUTE_QUEUE_IN_EXCEPTION;"); // vhdl->set_body (4, "reg_NO_SEQUENCE_"+toString(i)+" <= in_EXECUTE_QUEUE_IN_NO_SEQUENCE;"); // vhdl->set_body (4, "reg_ADDRESS_"+toString(i)+" <= in_EXECUTE_QUEUE_IN_ADDRESS;"); // vhdl->set_body (4, "reg_DATA_"+toString(i)+" <= in_EXECUTE_QUEUE_IN_DATA;"); // vhdl->set_body (3, "else"); // if (_param->_have_port_context_id) // vhdl->set_body (4,"reg_CONTEXT_ID_"+toString(i)+" <= reg_CONTEXT_ID_"+toString(i+1)+";"); // if (_param->_have_port_front_end_id) // vhdl->set_body (4,"reg_FRONT_END_ID_"+toString(i)+" <= reg_FRONT_END_ID_"+toString(i+1)+";"); // if (_param->_have_port_ooo_engine_id) // vhdl->set_body (4,"reg_OOO_ENGINE_ID_"+toString(i)+" <= reg_OOO_ENGINE_ID_"+toString(i+1)+";"); // if (_param->_have_port_rob_ptr) // vhdl->set_body (4,"reg_PACKET_ID_"+toString(i)+" <= reg_PACKET_ID_"+toString(i+1)+";"); // vhdl->set_body (4, "reg_FLAGS_"+toString(i)+" <= reg_FLAGS_"+toString(i+1)+";"); // vhdl->set_body (4, "reg_EXCEPTION_"+toString(i)+" <= reg_EXCEPTION_"+toString(i+1)+";"); // vhdl->set_body (4, "reg_NO_SEQUENCE_"+toString(i)+" <= reg_NO_SEQUENCE_"+toString(i+1)+";"); // vhdl->set_body (4, "reg_ADDRESS_"+toString(i)+" <= reg_ADDRESS_"+toString(i+1)+";"); // vhdl->set_body (4, "reg_DATA_"+toString(i)+" <= reg_DATA_"+toString(i+1)+";"); // vhdl->set_body (3,"end if;"); // vhdl->set_body (2,"end if;"); // } // vhdl->set_body (2,"if sig_WEN_"+toString(_param->_size_queue-1)+" = '1' then"); // if (_param->_have_port_context_id) // vhdl->set_body (3,"reg_CONTEXT_ID_"+toString(_param->_size_queue-1)+" <= in_EXECUTE_QUEUE_IN_CONTEXT_ID;"); // if (_param->_have_port_front_end_id) // vhdl->set_body (3,"reg_FRONT_END_ID_"+toString(_param->_size_queue-1)+" <= in_EXECUTE_QUEUE_IN_FRONT_END_ID;"); // if (_param->_have_port_ooo_engine_id) // vhdl->set_body (3,"reg_OOO_ENGINE_ID_"+toString(_param->_size_queue-1)+" <= in_EXECUTE_QUEUE_IN_OOO_ENGINE_ID;"); // if (_param->_have_port_rob_ptr) // vhdl->set_body (3,"reg_PACKET_ID_"+toString(_param->_size_queue-1)+" <= in_EXECUTE_QUEUE_IN_PACKET_ID;"); // vhdl->set_body (3, "reg_FLAGS_"+toString(_param->_size_queue-1)+" <= in_EXECUTE_QUEUE_IN_FLAGS;"); // vhdl->set_body (3, "reg_EXCEPTION_"+toString(_param->_size_queue-1)+" <= in_EXECUTE_QUEUE_IN_EXCEPTION;"); // vhdl->set_body (3, "reg_NO_SEQUENCE_"+toString(_param->_size_queue-1)+" <= in_EXECUTE_QUEUE_IN_NO_SEQUENCE;"); // vhdl->set_body (3, "reg_ADDRESS_"+toString(_param->_size_queue-1)+" <= in_EXECUTE_QUEUE_IN_ADDRESS;"); // vhdl->set_body (3, "reg_DATA_"+toString(_param->_size_queue-1)+" <= in_EXECUTE_QUEUE_IN_DATA;"); // vhdl->set_body (2,"end if;"); // vhdl->set_body (1,"end if;"); // vhdl->set_body (0,"end process;"); // vhdl->set_body (0,""); // vhdl->set_body (0,""); // vhdl->set_body (0,""); // vhdl->set_body (0,"out_EXECUTE_QUEUE_OUT_VAL <= sig_OUT_VAL;"); // vhdl->set_body (0,"out_EXECUTE_QUEUE_IN_ACK <= sig_IN_ACK;"); // if (_param->_have_port_context_id) // vhdl->set_body (0,"out_EXECUTE_QUEUE_OUT_CONTEXT_ID <= reg_CONTEXT_ID_0;"); // if (_param->_have_port_front_end_id) // vhdl->set_body (0,"out_EXECUTE_QUEUE_OUT_FRONT_END_ID <= reg_FRONT_END_ID_0;"); // if (_param->_have_port_ooo_engine_id) // vhdl->set_body (0,"out_EXECUTE_QUEUE_OUT_OOO_ENGINE_ID <= reg_OOO_ENGINE_ID_0;"); // if (_param->_have_port_rob_ptr) // vhdl->set_body (0,"out_EXECUTE_QUEUE_OUT_PACKET_ID <= reg_PACKET_ID_0;"); // vhdl->set_body (0, "out_EXECUTE_QUEUE_OUT_FLAGS <= reg_FLAGS_0;"); // vhdl->set_body (0, "out_EXECUTE_QUEUE_OUT_EXCEPTION <= reg_EXCEPTION_0;"); // vhdl->set_body (0, "out_EXECUTE_QUEUE_OUT_NO_SEQUENCE <= reg_NO_SEQUENCE_0;"); // vhdl->set_body (0, "out_EXECUTE_QUEUE_OUT_ADDRESS <= reg_ADDRESS_0;"); // vhdl->set_body (0, "out_EXECUTE_QUEUE_OUT_DATA <= reg_DATA_0;"); // vhdl->set_body (0,""); // vhdl->set_body (0,"process (reg_CURRENT_STATE, in_EXECUTE_QUEUE_OUT_ACK, in_EXECUTE_QUEUE_IN_VAL, in_NRESET)"); // vhdl->set_body (0,"begin"); // vhdl->set_body (1,"if in_NRESET = '0' then"); // vhdl->set_body (2,"sig_NEXT_STATE <= STATE_0;"); // vhdl->set_body (1,"else"); // vhdl->set_body (2,"case reg_CURRENT_STATE is"); // for (uint32_t i = 0; i <_param->_size_queue + 1; i++) // { // vhdl->set_body (3,"when STATE_"+toString(i)+" =>"); // if (i == 0) // { // vhdl->set_body (4,"if in_EXECUTE_QUEUE_IN_VAL = '1' then"); // vhdl->set_body (5,"sig_NEXT_STATE <= reg_CURRENT_STATE ("+toString(_param->_size_queue-1)+" downto 0) & '0';"); // vhdl->set_body (4,"else"); // vhdl->set_body (5,"sig_NEXT_STATE <= reg_CURRENT_STATE;"); // vhdl->set_body (4,"end if;"); // continue; // } // if (i == (_param->_size_queue)) // { // vhdl->set_body (4,"if in_EXECUTE_QUEUE_OUT_ACK = '1' then"); // vhdl->set_body (5,"sig_NEXT_STATE <= '0' & reg_CURRENT_STATE ("+toString(_param->_size_queue)+" downto 1);"); // vhdl->set_body (4,"else"); // vhdl->set_body (5,"sig_NEXT_STATE <= reg_CURRENT_STATE;"); // vhdl->set_body (4,"end if;"); // continue; // } // vhdl->set_body (4,"if in_EXECUTE_QUEUE_IN_VAL = '1' and in_EXECUTE_QUEUE_OUT_ACK = '0' then"); // vhdl->set_body (5,"sig_NEXT_STATE <= reg_CURRENT_STATE ("+toString(_param->_size_queue-1)+" downto 0) & '0';"); // vhdl->set_body (4,"elsif in_EXECUTE_QUEUE_IN_VAL = '0' and in_EXECUTE_QUEUE_OUT_ACK = '1' then"); // vhdl->set_body (5,"sig_NEXT_STATE <= '0' & reg_CURRENT_STATE ("+toString(_param->_size_queue)+" downto 1);"); // vhdl->set_body (4,"else"); // vhdl->set_body (5,"sig_NEXT_STATE <= reg_CURRENT_STATE;"); // vhdl->set_body (4,"end if;"); // } // vhdl->set_body (3,"when others => assert false report \"wrong state\" severity failure;"); // vhdl->set_body (2,"end case;"); // vhdl->set_body (1,"end if;"); // vhdl->set_body (2,"case reg_CURRENT_STATE is"); // for (uint32_t i = 0; i <_param->_size_queue + 1; i++) // { // vhdl->set_body (3,"when STATE_"+toString(i)+" =>"); // if (i == 0) // { // vhdl->set_body (4,"sig_OUT_VAL <= '0';"); // vhdl->set_body (4,"sig_IN_ACK <= '1';"); // for (uint32_t j = 0; j <_param->_size_queue; j++) // { // if (i == j) // { // vhdl->set_body (4,"sig_SEL_"+toString(j)+" <= '0';"); // vhdl->set_body (4,"sig_WEN_"+toString(j)+" <= in_EXECUTE_QUEUE_IN_VAL;"); // } // else // { // if (j < (_param->_size_queue - 1)) // vhdl->set_body (4,"sig_SEL_"+toString(j)+" <= '0';"); // vhdl->set_body (4,"sig_WEN_"+toString(j)+" <= '0';"); // } // } // continue; // } // if (i == (_param->_size_queue)) // { // vhdl->set_body (4,"sig_OUT_VAL <= '1';"); // vhdl->set_body (4,"sig_IN_ACK <= '0';"); // for (uint32_t j = 0; j <_param->_size_queue; j++) // { // if (j == (i - 1)) // { // vhdl->set_body (4,"sig_WEN_"+toString(j)+" <= '0';"); // } // else // { // vhdl->set_body (4,"sig_SEL_"+toString(j)+" <= in_EXECUTE_QUEUE_OUT_ACK;"); // vhdl->set_body (4,"sig_WEN_"+toString(j)+" <= in_EXECUTE_QUEUE_OUT_ACK;"); // } // } // continue; // } // vhdl->set_body (4,"sig_OUT_VAL <= '1';"); // vhdl->set_body (4,"sig_IN_ACK <= '1';"); // for (uint32_t j = 0; j <_param->_size_queue; j++) // { // if (j < (i - 1)) // { // vhdl->set_body (4,"sig_SEL_"+toString(j)+" <= in_EXECUTE_QUEUE_OUT_ACK;"); // vhdl->set_body (4,"sig_WEN_"+toString(j)+" <= in_EXECUTE_QUEUE_OUT_ACK;"); // } // if (j == (i - 1)) // { // vhdl->set_body (4,"sig_SEL_"+toString(j)+" <= '0';"); // vhdl->set_body (4,"sig_WEN_"+toString(j)+" <= in_EXECUTE_QUEUE_OUT_ACK and in_EXECUTE_QUEUE_IN_VAL;"); // } // if (j == i) // { // if (j < (_param->_size_queue - 1)) // vhdl->set_body (4,"sig_SEL_"+toString(j)+" <= '0';"); // vhdl->set_body (4,"sig_WEN_"+toString(j)+" <= in_EXECUTE_QUEUE_IN_VAL and not in_EXECUTE_QUEUE_OUT_ACK;"); // } // if (j > i) // { // if (j < (_param->_size_queue - 1)) // vhdl->set_body (4,"sig_SEL_"+toString(j)+" <= '0';"); // vhdl->set_body (4,"sig_WEN_"+toString(j)+" <= '0';"); // } // } // } // vhdl->set_body (3,"when others =>"); // vhdl->set_body (2,"end case;"); // vhdl->set_body (0,"end process;"); log_printf(FUNC,Execute_queue,FUNCTION,"End"); }; }; // end namespace execute_queue }; // end namespace write_unit }; // end namespace multi_write_unit }; // end namespace execute_loop }; // end namespace multi_execute_loop }; // end namespace core }; // end namespace behavioural }; // end namespace morpheo #endif