[54] | 1 | #ifdef VHDL |
---|
| 2 | /* |
---|
| 3 | * $Id: Read_queue_vhdl_body.cpp 81 2008-04-15 18:40:01Z rosiere $ |
---|
| 4 | * |
---|
| 5 | * [ Description ] |
---|
| 6 | * |
---|
| 7 | */ |
---|
| 8 | |
---|
| 9 | #include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Read_unit/Read_unit/Read_queue/include/Read_queue.h" |
---|
| 10 | |
---|
| 11 | namespace morpheo { |
---|
| 12 | namespace behavioural { |
---|
| 13 | namespace core { |
---|
| 14 | namespace multi_execute_loop { |
---|
| 15 | namespace execute_loop { |
---|
| 16 | namespace multi_read_unit { |
---|
| 17 | namespace read_unit { |
---|
| 18 | namespace read_queue { |
---|
| 19 | |
---|
| 20 | |
---|
| 21 | void Read_queue::vhdl_body (Vhdl * & vhdl) |
---|
| 22 | { |
---|
| 23 | log_printf(FUNC,Read_queue,"vhdl_body","Begin"); |
---|
| 24 | vhdl->set_body (""); |
---|
[68] | 25 | vhdl->set_body(""); |
---|
| 26 | vhdl->set_body("-----------------------------------"); |
---|
| 27 | vhdl->set_body("-- Instance queue "); |
---|
| 28 | vhdl->set_body("-----------------------------------"); |
---|
| 29 | vhdl->set_body(""); |
---|
| 30 | |
---|
| 31 | vhdl->set_body("instance_"+_name+"_queue : "+_name+"_queue"); |
---|
| 32 | vhdl->set_body("port map ("); |
---|
| 33 | vhdl->set_body("\t in_CLOCK \t=>\t in_CLOCK "); |
---|
| 34 | vhdl->set_body("\t, in_NRESET \t=>\t in_NRESET"); |
---|
| 35 | vhdl->set_body("\t, in_INSERT_VAL \t=>\tinternal_QUEUE_INSERT_VAL"); |
---|
| 36 | vhdl->set_body("\t,out_INSERT_ACK \t=>\tinternal_QUEUE_INSERT_ACK"); |
---|
| 37 | vhdl->set_body("\t, in_INSERT_DATA \t=>\tinternal_QUEUE_INSERT_DATA"); |
---|
| 38 | vhdl->set_body("\t,out_RETIRE_VAL \t=>\tinternal_QUEUE_RETIRE_VAL"); |
---|
| 39 | vhdl->set_body("\t, in_RETIRE_ACK \t=>\tinternal_QUEUE_RETIRE_ACK"); |
---|
| 40 | vhdl->set_body("\t,out_RETIRE_DATA \t=>\tinternal_QUEUE_RETIRE_DATA"); |
---|
| 41 | vhdl->set_body(");"); |
---|
| 42 | |
---|
| 43 | vhdl->set_body(""); |
---|
| 44 | vhdl->set_body("-----------------------------------"); |
---|
| 45 | vhdl->set_body("-- Queue_data "); |
---|
| 46 | vhdl->set_body("-----------------------------------"); |
---|
| 47 | vhdl->set_body(""); |
---|
| 48 | |
---|
| 49 | uint32_t min = 0; |
---|
| 50 | uint32_t max; |
---|
| 51 | |
---|
| 52 | if(_param->_have_port_context_id ) |
---|
| 53 | { |
---|
| 54 | max = min-1+_param->_size_context_id; |
---|
| 55 | vhdl->set_body ("internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_CONTEXT_ID;"); |
---|
| 56 | min = max+1; |
---|
| 57 | } |
---|
| 58 | if(_param->_have_port_front_end_id ) |
---|
| 59 | { |
---|
| 60 | max = min-1+_param->_size_front_end_id; |
---|
| 61 | vhdl->set_body ("internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_FRONT_END_ID;"); |
---|
| 62 | min = max+1; |
---|
| 63 | } |
---|
| 64 | if(_param->_have_port_ooo_engine_id ) |
---|
| 65 | { |
---|
| 66 | max = min-1+_param->_size_ooo_engine_id; |
---|
| 67 | vhdl->set_body ("internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_OOO_ENGINE_ID;"); |
---|
| 68 | min = max+1; |
---|
| 69 | } |
---|
| 70 | if(_param->_have_port_rob_id ) |
---|
| 71 | { |
---|
| 72 | max = min-1+_param->_size_rob_id; |
---|
| 73 | vhdl->set_body ("internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_ROB_ID;"); |
---|
| 74 | min = max+1; |
---|
| 75 | } |
---|
| 76 | |
---|
| 77 | max = min-1+_param->_size_operation; |
---|
| 78 | vhdl->set_body ("internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_OPERATION;"); |
---|
| 79 | min = max+1; |
---|
| 80 | |
---|
| 81 | max = min-1+_param->_size_type; |
---|
| 82 | vhdl->set_body ("internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_TYPE;"); |
---|
| 83 | min = max+1; |
---|
| 84 | |
---|
| 85 | max = min; |
---|
| 86 | vhdl->set_body ("internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_HAS_IMMEDIAT;"); |
---|
| 87 | min = max+1; |
---|
| 88 | |
---|
| 89 | max = min-1+_param->_size_general_data; |
---|
| 90 | vhdl->set_body ("internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_IMMEDIAT;"); |
---|
| 91 | min = max+1; |
---|
| 92 | |
---|
| 93 | max = min; |
---|
| 94 | vhdl->set_body ("internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_READ_RA;"); |
---|
| 95 | min = max+1; |
---|
| 96 | |
---|
| 97 | max = min-1+_param->_size_general_register; |
---|
| 98 | vhdl->set_body ("internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_NUM_REG_RA;"); |
---|
| 99 | min = max+1; |
---|
| 100 | |
---|
| 101 | max = min; |
---|
| 102 | vhdl->set_body ("internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_READ_RB;"); |
---|
| 103 | min = max+1; |
---|
| 104 | |
---|
| 105 | max = min-1+_param->_size_general_register; |
---|
| 106 | vhdl->set_body ("internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_NUM_REG_RB;"); |
---|
| 107 | min = max+1; |
---|
| 108 | |
---|
| 109 | max = min; |
---|
| 110 | vhdl->set_body ("internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_READ_RC;"); |
---|
| 111 | min = max+1; |
---|
| 112 | |
---|
| 113 | max = min-1+_param->_size_special_register; |
---|
| 114 | vhdl->set_body ("internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_NUM_REG_RC;"); |
---|
| 115 | min = max+1; |
---|
| 116 | |
---|
| 117 | max = min; |
---|
| 118 | vhdl->set_body ("internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_WRITE_RD;"); |
---|
| 119 | min = max+1; |
---|
| 120 | |
---|
| 121 | max = min-1+_param->_size_general_register; |
---|
| 122 | vhdl->set_body ("internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_NUM_REG_RD;"); |
---|
| 123 | min = max+1; |
---|
| 124 | |
---|
| 125 | max = min; |
---|
| 126 | vhdl->set_body ("internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_WRITE_RE;"); |
---|
| 127 | min = max+1; |
---|
| 128 | |
---|
| 129 | max = min-1+_param->_size_special_register; |
---|
| 130 | vhdl->set_body ("internal_QUEUE_INSERT_DATA"+std_logic_range(_param->_size_internal_queue,max,min)+" <= in_READ_QUEUE_IN_NUM_REG_RE;"); |
---|
| 131 | min = max+1; |
---|
| 132 | |
---|
| 133 | vhdl->set_body ("internal_QUEUE_RETIRE_ACK <= internal_READ_QUEUE_OUT_VAL and in_READ_QUEUE_OUT_ACK;"); |
---|
| 134 | |
---|
| 135 | vhdl->set_body(""); |
---|
| 136 | vhdl->set_body("-----------------------------------"); |
---|
| 137 | vhdl->set_body("-- Interface read"); |
---|
| 138 | vhdl->set_body("-----------------------------------"); |
---|
| 139 | vhdl->set_body(""); |
---|
| 140 | vhdl->set_body("-- GPR"); |
---|
| 141 | vhdl->set_body ("out_GPR_READ_0_VAL <= internal_QUEUE_RETIRE_VAL and internal_READ_RA_VAL;"); |
---|
| 142 | vhdl->set_body ("out_GPR_READ_1_VAL <= internal_QUEUE_RETIRE_VAL and internal_READ_RB_VAL;"); |
---|
| 143 | if(_param->_have_port_ooo_engine_id) |
---|
| 144 | { |
---|
| 145 | vhdl->set_body ("out_GPR_READ_0_OOO_ENGINE_ID <= internal_OOO_ENGINE_ID;"); |
---|
| 146 | vhdl->set_body ("out_GPR_READ_1_OOO_ENGINE_ID <= internal_OOO_ENGINE_ID;"); |
---|
| 147 | } |
---|
| 148 | vhdl->set_body ("out_GPR_READ_0_NUM_REG <= internal_NUM_REG_RA;"); |
---|
| 149 | vhdl->set_body ("out_GPR_READ_1_NUM_REG <= internal_NUM_REG_RB;"); |
---|
| 150 | vhdl->set_body(""); |
---|
| 151 | |
---|
| 152 | vhdl->set_body("-- SPR"); |
---|
| 153 | vhdl->set_body ("out_SPR_READ_0_VAL <= internal_QUEUE_RETIRE_VAL and internal_READ_RC_VAL;"); |
---|
| 154 | if(_param->_have_port_ooo_engine_id) |
---|
| 155 | { |
---|
| 156 | vhdl->set_body ("out_SPR_READ_0_OOO_ENGINE_ID <= internal_OOO_ENGINE_ID;"); |
---|
| 157 | } |
---|
| 158 | vhdl->set_body ("out_SPR_READ_0_NUM_REG <= internal_NUM_REG_RC;"); |
---|
| 159 | |
---|
| 160 | vhdl->set_body(""); |
---|
| 161 | vhdl->set_body("-----------------------------------"); |
---|
| 162 | vhdl->set_body("-- Interface read_queue_out"); |
---|
| 163 | vhdl->set_body("-----------------------------------"); |
---|
| 164 | vhdl->set_body(""); |
---|
| 165 | |
---|
| 166 | if(_param->_have_port_context_id ) |
---|
| 167 | vhdl->set_body ("out_READ_QUEUE_OUT_CONTEXT_ID <= internal_CONTEXT_ID ;"); |
---|
| 168 | if(_param->_have_port_front_end_id ) |
---|
| 169 | vhdl->set_body ("out_READ_QUEUE_OUT_FRONT_END_ID <= internal_FRONT_END_ID ;"); |
---|
| 170 | if(_param->_have_port_ooo_engine_id ) |
---|
| 171 | vhdl->set_body ("out_READ_QUEUE_OUT_OOO_ENGINE_ID <= internal_OOO_ENGINE_ID;"); |
---|
| 172 | if(_param->_have_port_rob_id ) |
---|
| 173 | vhdl->set_body ("out_READ_QUEUE_OUT_ROB_ID <= internal_ROB_ID ;"); |
---|
| 174 | vhdl->set_body ("out_READ_QUEUE_OUT_OPERATION <= internal_OPERATION ;"); |
---|
| 175 | vhdl->set_body ("out_READ_QUEUE_OUT_TYPE <= internal_TYPE ;"); |
---|
| 176 | vhdl->set_body ("out_READ_QUEUE_OUT_HAS_IMMEDIAT <= internal_HAS_IMMEDIAT ;"); |
---|
| 177 | vhdl->set_body ("out_READ_QUEUE_OUT_IMMEDIAT <= internal_IMMEDIAT ;"); |
---|
| 178 | vhdl->set_body ("out_READ_QUEUE_OUT_READ_RA <= internal_READ_RA ;"); |
---|
| 179 | vhdl->set_body ("out_READ_QUEUE_OUT_NUM_REG_RA <= internal_NUM_REG_RA ;"); |
---|
| 180 | vhdl->set_body ("out_READ_QUEUE_OUT_DATA_RA_VAL <= internal_NEXT_DATA_RA_VAL;"); |
---|
| 181 | vhdl->set_body ("out_READ_QUEUE_OUT_DATA_RA <= internal_NEXT_DATA_RA ;"); |
---|
| 182 | vhdl->set_body ("out_READ_QUEUE_OUT_READ_RB <= internal_READ_RB ;"); |
---|
| 183 | vhdl->set_body ("out_READ_QUEUE_OUT_NUM_REG_RB <= internal_NUM_REG_RB ;"); |
---|
| 184 | vhdl->set_body ("out_READ_QUEUE_OUT_DATA_RB_VAL <= internal_NEXT_DATA_RB_VAL;"); |
---|
| 185 | vhdl->set_body ("out_READ_QUEUE_OUT_DATA_RB <= internal_NEXT_DATA_RB ;"); |
---|
| 186 | vhdl->set_body ("out_READ_QUEUE_OUT_READ_RC <= internal_READ_RC ;"); |
---|
| 187 | vhdl->set_body ("out_READ_QUEUE_OUT_NUM_REG_RC <= internal_NUM_REG_RC ;"); |
---|
| 188 | vhdl->set_body ("out_READ_QUEUE_OUT_DATA_RC_VAL <= internal_NEXT_DATA_RC_VAL;"); |
---|
| 189 | vhdl->set_body ("out_READ_QUEUE_OUT_DATA_RC <= internal_NEXT_DATA_RC ;"); |
---|
| 190 | vhdl->set_body ("out_READ_QUEUE_OUT_WRITE_RD <= internal_WRITE_RD ;"); |
---|
| 191 | vhdl->set_body ("out_READ_QUEUE_OUT_NUM_REG_RD <= internal_NUM_REG_RD ;"); |
---|
| 192 | vhdl->set_body ("out_READ_QUEUE_OUT_WRITE_RE <= internal_WRITE_RE ;"); |
---|
| 193 | vhdl->set_body ("out_READ_QUEUE_OUT_NUM_REG_RE <= internal_NUM_REG_RE ;"); |
---|
| 194 | |
---|
| 195 | vhdl->set_body(""); |
---|
| 196 | vhdl->set_body("-----------------------------------"); |
---|
| 197 | vhdl->set_body("-- next reg update"); |
---|
| 198 | vhdl->set_body("-----------------------------------"); |
---|
| 199 | vhdl->set_body(""); |
---|
| 200 | vhdl->set_body("-- read_rx_val - 1 : must access at the registerFile (after access, is set at 0)"); |
---|
| 201 | |
---|
| 202 | { |
---|
| 203 | vhdl->set_body(""); |
---|
| 204 | vhdl->set_body("internal_NEXT_READ_RA_VAL <="); |
---|
| 205 | vhdl->set_body("\t'0' when"); |
---|
| 206 | // bypass |
---|
| 207 | vhdl->set_body("\t\t-- check bypass"); |
---|
| 208 | for (int32_t i=_param->_nb_gpr_write-1; i>=0 ; i--) |
---|
| 209 | { |
---|
[75] | 210 | std::string cmp; |
---|
[68] | 211 | |
---|
| 212 | if (_param->_have_port_ooo_engine_id) |
---|
| 213 | cmp = "and (in_GPR_WRITE_"+toString(i)+"_OOO_ENGINE_ID=internal_OOO_ENGINE_ID) "; |
---|
| 214 | else |
---|
| 215 | cmp = ""; |
---|
| 216 | |
---|
| 217 | vhdl->set_body("\t\t((in_GPR_WRITE_"+toString(i)+"_VAL='1') "+cmp+"and (internal_NUM_REG_RA=in_GPR_WRITE_"+toString(i)+"_NUM_REG)) or"); |
---|
| 218 | } |
---|
| 219 | vhdl->set_body("\t\tfalse else"); |
---|
| 220 | vhdl->set_body("\tinternal_READ_RA_VAL and not in_GPR_READ_0_ACK;"); |
---|
| 221 | } |
---|
| 222 | { |
---|
| 223 | vhdl->set_body(""); |
---|
| 224 | vhdl->set_body("internal_NEXT_READ_RB_VAL <="); |
---|
| 225 | vhdl->set_body("\t'0' when"); |
---|
| 226 | // bypass |
---|
| 227 | vhdl->set_body("\t\t-- check bypass"); |
---|
| 228 | for (int32_t i=_param->_nb_gpr_write-1; i>=0 ; i--) |
---|
| 229 | { |
---|
[75] | 230 | std::string cmp; |
---|
[68] | 231 | |
---|
| 232 | if (_param->_have_port_ooo_engine_id) |
---|
| 233 | cmp = "and (in_GPR_WRITE_"+toString(i)+"_OOO_ENGINE_ID=internal_OOO_ENGINE_ID) "; |
---|
| 234 | else |
---|
| 235 | cmp = ""; |
---|
| 236 | |
---|
| 237 | vhdl->set_body("\t\t((in_GPR_WRITE_"+toString(i)+"_VAL='1') "+cmp+"and (internal_NUM_REG_RB=in_GPR_WRITE_"+toString(i)+"_NUM_REG)) or"); |
---|
| 238 | } |
---|
| 239 | vhdl->set_body("\t\tfalse else"); |
---|
| 240 | vhdl->set_body("\tinternal_READ_RB_VAL and not in_GPR_READ_1_ACK;"); |
---|
| 241 | } |
---|
| 242 | { |
---|
| 243 | vhdl->set_body(""); |
---|
| 244 | vhdl->set_body("internal_NEXT_READ_RC_VAL <="); |
---|
| 245 | vhdl->set_body("\t'0' when"); |
---|
| 246 | // bypass |
---|
| 247 | vhdl->set_body("\t\t-- check bypass"); |
---|
| 248 | for (int32_t i=_param->_nb_spr_write-1; i>=0 ; i--) |
---|
| 249 | { |
---|
[75] | 250 | std::string cmp; |
---|
[68] | 251 | |
---|
| 252 | if (_param->_have_port_ooo_engine_id) |
---|
| 253 | cmp = "and (in_SPR_WRITE_"+toString(i)+"_OOO_ENGINE_ID=internal_OOO_ENGINE_ID) "; |
---|
| 254 | else |
---|
| 255 | cmp = ""; |
---|
| 256 | |
---|
| 257 | vhdl->set_body("\t\t((in_SPR_WRITE_"+toString(i)+"_VAL='1') "+cmp+"and (internal_NUM_REG_RC=in_SPR_WRITE_"+toString(i)+"_NUM_REG)) or"); |
---|
| 258 | } |
---|
| 259 | vhdl->set_body("\t\tfalse else"); |
---|
| 260 | vhdl->set_body("\tinternal_READ_RC_VAL and not in_SPR_READ_0_ACK;"); |
---|
| 261 | } |
---|
| 262 | { |
---|
| 263 | vhdl->set_body(""); |
---|
| 264 | vhdl->set_body("internal_READ_QUEUE_OUT_VAL <= not internal_NEXT_READ_RA_VAL and not internal_NEXT_READ_RB_VAL and not internal_NEXT_READ_RC_VAL;"); |
---|
| 265 | vhdl->set_body(" out_READ_QUEUE_OUT_VAL <= internal_READ_QUEUE_OUT_VAL and internal_QUEUE_RETIRE_VAL;"); |
---|
| 266 | |
---|
| 267 | } |
---|
| 268 | |
---|
| 269 | vhdl->set_body(""); |
---|
| 270 | vhdl->set_body("-- data_rx_val - 1 : the read of registerFile is valid"); |
---|
| 271 | |
---|
| 272 | { |
---|
| 273 | vhdl->set_body(""); |
---|
| 274 | vhdl->set_body("internal_NEXT_DATA_RA_VAL <="); |
---|
| 275 | vhdl->set_body("\t'1' when"); |
---|
| 276 | // bypass |
---|
| 277 | vhdl->set_body("\t\t-- check bypass"); |
---|
| 278 | for (int32_t i=_param->_nb_gpr_write-1; i>=0 ; i--) |
---|
| 279 | { |
---|
[75] | 280 | std::string cmp; |
---|
[68] | 281 | |
---|
| 282 | if (_param->_have_port_ooo_engine_id) |
---|
| 283 | cmp = "and (in_GPR_WRITE_"+toString(i)+"_OOO_ENGINE_ID=internal_OOO_ENGINE_ID) "; |
---|
| 284 | else |
---|
| 285 | cmp = ""; |
---|
| 286 | |
---|
| 287 | vhdl->set_body("\t\t((in_GPR_WRITE_"+toString(i)+"_VAL='1') "+cmp+"and (internal_NUM_REG_RA=in_GPR_WRITE_"+toString(i)+"_NUM_REG)) or"); |
---|
| 288 | } |
---|
| 289 | vhdl->set_body("\t\tfalse else"); |
---|
| 290 | vhdl->set_body("\tinternal_DATA_RA_VAL or (internal_READ_RA_VAL and in_GPR_READ_0_ACK and in_GPR_READ_0_DATA_VAL);"); |
---|
| 291 | } |
---|
| 292 | { |
---|
| 293 | vhdl->set_body(""); |
---|
| 294 | vhdl->set_body("internal_NEXT_DATA_RB_VAL <="); |
---|
| 295 | vhdl->set_body("\t'1' when"); |
---|
| 296 | // bypass |
---|
| 297 | vhdl->set_body("\t\t-- check bypass"); |
---|
| 298 | for (int32_t i=_param->_nb_gpr_write-1; i>=0 ; i--) |
---|
| 299 | { |
---|
[75] | 300 | std::string cmp; |
---|
[68] | 301 | |
---|
| 302 | if (_param->_have_port_ooo_engine_id) |
---|
| 303 | cmp = "and (in_GPR_WRITE_"+toString(i)+"_OOO_ENGINE_ID=internal_OOO_ENGINE_ID) "; |
---|
| 304 | else |
---|
| 305 | cmp = ""; |
---|
| 306 | |
---|
| 307 | vhdl->set_body("\t\t((in_GPR_WRITE_"+toString(i)+"_VAL='1') "+cmp+"and (internal_NUM_REG_RB=in_GPR_WRITE_"+toString(i)+"_NUM_REG)) or"); |
---|
| 308 | } |
---|
| 309 | vhdl->set_body("\t\tfalse else"); |
---|
| 310 | vhdl->set_body("\tinternal_DATA_RB_VAL or (internal_READ_RB_VAL and in_GPR_READ_1_ACK and in_GPR_READ_1_DATA_VAL);"); |
---|
| 311 | } |
---|
| 312 | { |
---|
| 313 | vhdl->set_body(""); |
---|
| 314 | vhdl->set_body("internal_NEXT_DATA_RC_VAL <="); |
---|
| 315 | vhdl->set_body("\t'1' when"); |
---|
| 316 | // bypass |
---|
| 317 | vhdl->set_body("\t\t-- check bypass"); |
---|
| 318 | for (int32_t i=_param->_nb_spr_write-1; i>=0 ; i--) |
---|
| 319 | { |
---|
[75] | 320 | std::string cmp; |
---|
[68] | 321 | |
---|
| 322 | if (_param->_have_port_ooo_engine_id) |
---|
| 323 | cmp = "and (in_SPR_WRITE_"+toString(i)+"_OOO_ENGINE_ID=internal_OOO_ENGINE_ID) "; |
---|
| 324 | else |
---|
| 325 | cmp = ""; |
---|
| 326 | |
---|
| 327 | vhdl->set_body("\t\t((in_SPR_WRITE_"+toString(i)+"_VAL='1') "+cmp+"and (internal_NUM_REG_RC=in_SPR_WRITE_"+toString(i)+"_NUM_REG)) or"); |
---|
| 328 | } |
---|
| 329 | vhdl->set_body("\t\tfalse else"); |
---|
| 330 | vhdl->set_body("\tinternal_DATA_RC_VAL or (internal_READ_RC_VAL and in_SPR_READ_0_ACK and in_SPR_READ_0_DATA_VAL);"); |
---|
| 331 | } |
---|
| 332 | |
---|
| 333 | vhdl->set_body(""); |
---|
| 334 | vhdl->set_body("-- data_rx - data read"); |
---|
| 335 | { |
---|
| 336 | vhdl->set_body(""); |
---|
| 337 | vhdl->set_body("internal_NEXT_DATA_RA <="); |
---|
| 338 | #ifdef SYSTEMC_VHDL_COMPATIBILITY |
---|
| 339 | vhdl->set_body("\t"+std_logic_others(_param->_size_general_data,0)+" when internal_READ_RA='0' else"); |
---|
| 340 | #endif |
---|
| 341 | // bypass |
---|
| 342 | vhdl->set_body("\t\t-- check bypass"); |
---|
| 343 | for (int32_t i=_param->_nb_gpr_write-1; i>=0 ; i--) |
---|
| 344 | { |
---|
[75] | 345 | std::string cmp; |
---|
[68] | 346 | |
---|
| 347 | if (_param->_have_port_ooo_engine_id) |
---|
| 348 | cmp = "and (in_GPR_WRITE_"+toString(i)+"_OOO_ENGINE_ID=internal_OOO_ENGINE_ID) "; |
---|
| 349 | else |
---|
| 350 | cmp = ""; |
---|
| 351 | |
---|
| 352 | vhdl->set_body("\tin_GPR_WRITE_"+toString(i)+"_DATA when ((in_GPR_WRITE_"+toString(i)+"_VAL='1') "+cmp+"and (internal_NUM_REG_RA=in_GPR_WRITE_"+toString(i)+"_NUM_REG)) else"); |
---|
| 353 | } |
---|
| 354 | vhdl->set_body("\treg_DATA_RA when (internal_DATA_RA_VAL='1') else"); |
---|
| 355 | vhdl->set_body("\tin_GPR_READ_0_DATA;"); |
---|
| 356 | } |
---|
| 357 | { |
---|
| 358 | vhdl->set_body(""); |
---|
| 359 | vhdl->set_body("internal_NEXT_DATA_RB <="); |
---|
| 360 | #ifdef SYSTEMC_VHDL_COMPATIBILITY |
---|
| 361 | vhdl->set_body("\t"+std_logic_others(_param->_size_general_data,0)+" when internal_READ_RB='0' else"); |
---|
| 362 | #endif |
---|
| 363 | // bypass |
---|
| 364 | vhdl->set_body("\t\t-- check bypass"); |
---|
| 365 | for (int32_t i=_param->_nb_gpr_write-1; i>=0 ; i--) |
---|
| 366 | { |
---|
[75] | 367 | std::string cmp; |
---|
[68] | 368 | |
---|
| 369 | if (_param->_have_port_ooo_engine_id) |
---|
| 370 | cmp = "and (in_GPR_WRITE_"+toString(i)+"_OOO_ENGINE_ID=internal_OOO_ENGINE_ID) "; |
---|
| 371 | else |
---|
| 372 | cmp = ""; |
---|
| 373 | |
---|
| 374 | vhdl->set_body("\tin_GPR_WRITE_"+toString(i)+"_DATA when ((in_GPR_WRITE_"+toString(i)+"_VAL='1') "+cmp+"and (internal_NUM_REG_RB=in_GPR_WRITE_"+toString(i)+"_NUM_REG)) else"); |
---|
| 375 | } |
---|
| 376 | vhdl->set_body("\treg_DATA_RB when (internal_DATA_RB_VAL='1') else"); |
---|
| 377 | vhdl->set_body("\tin_GPR_READ_1_DATA;"); |
---|
| 378 | } |
---|
| 379 | { |
---|
| 380 | vhdl->set_body(""); |
---|
| 381 | vhdl->set_body("internal_NEXT_DATA_RC <="); |
---|
| 382 | #ifdef SYSTEMC_VHDL_COMPATIBILITY |
---|
| 383 | vhdl->set_body("\t"+std_logic_others(_param->_size_special_data,0)+" when internal_READ_RC='0' else"); |
---|
| 384 | #endif |
---|
| 385 | // bypass |
---|
| 386 | vhdl->set_body("\t\t-- check bypass"); |
---|
| 387 | for (int32_t i=_param->_nb_spr_write-1; i>=0 ; i--) |
---|
| 388 | { |
---|
[75] | 389 | std::string cmp; |
---|
[68] | 390 | |
---|
| 391 | if (_param->_have_port_ooo_engine_id) |
---|
| 392 | cmp = "and (in_SPR_WRITE_"+toString(i)+"_OOO_ENGINE_ID=internal_OOO_ENGINE_ID) "; |
---|
| 393 | else |
---|
| 394 | cmp = ""; |
---|
| 395 | |
---|
| 396 | vhdl->set_body("\tin_SPR_WRITE_"+toString(i)+"_DATA when ((in_SPR_WRITE_"+toString(i)+"_VAL='1') "+cmp+"and (in_SPR_WRITE_"+toString(i)+"_NUM_REG=internal_NUM_REG_RC)) else"); |
---|
| 397 | } |
---|
| 398 | vhdl->set_body("\treg_DATA_RC when (internal_DATA_RC_VAL='1') else"); |
---|
| 399 | vhdl->set_body("\tin_SPR_READ_0_DATA;"); |
---|
| 400 | |
---|
| 401 | vhdl->set_body(""); |
---|
| 402 | vhdl->set_body("-----------------------------------"); |
---|
| 403 | vhdl->set_body("-- transition"); |
---|
| 404 | vhdl->set_body("-----------------------------------"); |
---|
| 405 | vhdl->set_body(""); |
---|
| 406 | vhdl->set_body("-- need a new head if :"); |
---|
| 407 | vhdl->set_body("-- * queue is empty"); |
---|
| 408 | vhdl->set_body("-- * pop with queue"); |
---|
| 409 | vhdl->set_body ("internal_NEXT_NEED_NEW_HEAD <= not internal_QUEUE_RETIRE_VAL or (internal_QUEUE_RETIRE_VAL and internal_QUEUE_RETIRE_ACK);"); |
---|
| 410 | |
---|
| 411 | vhdl->set_body ("internal_READ_RA_VAL <= internal_READ_RA when reg_NEED_NEW_HEAD='1' else reg_READ_RA_VAL;"); |
---|
| 412 | vhdl->set_body ("internal_READ_RB_VAL <= internal_READ_RB when reg_NEED_NEW_HEAD='1' else reg_READ_RB_VAL;"); |
---|
| 413 | vhdl->set_body ("internal_READ_RC_VAL <= internal_READ_RC when reg_NEED_NEW_HEAD='1' else reg_READ_RC_VAL;"); |
---|
| 414 | vhdl->set_body ("internal_DATA_RA_VAL <= not internal_READ_RA when reg_NEED_NEW_HEAD='1' else reg_DATA_RA_VAL;"); |
---|
| 415 | vhdl->set_body ("internal_DATA_RB_VAL <= not internal_READ_RB when reg_NEED_NEW_HEAD='1' else reg_DATA_RB_VAL;"); |
---|
| 416 | vhdl->set_body ("internal_DATA_RC_VAL <= not internal_READ_RC when reg_NEED_NEW_HEAD='1' else reg_DATA_RC_VAL;"); |
---|
| 417 | |
---|
| 418 | |
---|
| 419 | vhdl->set_body (""); |
---|
| 420 | vhdl->set_body ("transition: process (in_CLOCK)"); |
---|
| 421 | vhdl->set_body ("begin -- process transition"); |
---|
| 422 | vhdl->set_body ("\tif in_CLOCK'event and in_CLOCK = '1' then"); |
---|
| 423 | vhdl->set_body (""); |
---|
| 424 | vhdl->set_body ("\t\tif (in_NRESET = '0') then"); |
---|
| 425 | vhdl->set_body ("\t\t\treg_NEED_NEW_HEAD <= '1';"); |
---|
| 426 | vhdl->set_body ("\t\telse"); |
---|
| 427 | vhdl->set_body ("\t\t\treg_NEED_NEW_HEAD <= internal_NEXT_NEED_NEW_HEAD;"); |
---|
| 428 | vhdl->set_body ("\t\t\treg_READ_RA_VAL <= internal_NEXT_READ_RA_VAL;"); |
---|
| 429 | vhdl->set_body ("\t\t\treg_READ_RB_VAL <= internal_NEXT_READ_RB_VAL;"); |
---|
| 430 | vhdl->set_body ("\t\t\treg_READ_RC_VAL <= internal_NEXT_READ_RC_VAL;"); |
---|
| 431 | vhdl->set_body ("\t\t\treg_DATA_RA_VAL <= internal_NEXT_DATA_RA_VAL;"); |
---|
| 432 | vhdl->set_body ("\t\t\treg_DATA_RB_VAL <= internal_NEXT_DATA_RB_VAL;"); |
---|
| 433 | vhdl->set_body ("\t\t\treg_DATA_RC_VAL <= internal_NEXT_DATA_RC_VAL;"); |
---|
| 434 | vhdl->set_body ("\t\t\treg_DATA_RA <= internal_NEXT_DATA_RA ;"); |
---|
| 435 | vhdl->set_body ("\t\t\treg_DATA_RB <= internal_NEXT_DATA_RB ;"); |
---|
| 436 | vhdl->set_body ("\t\t\treg_DATA_RC <= internal_NEXT_DATA_RC ;"); |
---|
| 437 | |
---|
| 438 | vhdl->set_body ("\t\tend if;"); |
---|
| 439 | vhdl->set_body (""); |
---|
| 440 | vhdl->set_body ("\tend if;"); |
---|
| 441 | vhdl->set_body ("end process transition;"); |
---|
| 442 | |
---|
| 443 | } |
---|
| 444 | |
---|
| 445 | |
---|
[54] | 446 | log_printf(FUNC,Read_queue,"vhdl_body","End"); |
---|
| 447 | }; |
---|
| 448 | |
---|
| 449 | }; // end namespace read_queue |
---|
| 450 | }; // end namespace read_unit |
---|
| 451 | }; // end namespace multi_read_unit |
---|
| 452 | }; // end namespace execute_loop |
---|
| 453 | }; // end namespace multi_execute_loop |
---|
| 454 | }; // end namespace core |
---|
| 455 | |
---|
| 456 | }; // end namespace behavioural |
---|
| 457 | }; // end namespace morpheo |
---|
| 458 | #endif |
---|