mp_network_interface 

--  ----

mp_network_interface ϡ̿٥륷ߥ졼Ѥ뤿Υͥ
ȥ󥿥ե˥åȤǤ롣ץ󥰥ΥХ
ȥץ󥰥ȳΥ롼³ƻѤ롣Хͳǥץ
åΥꥯȤꡢꥯȤ˽äƥѥåȤ
롣

ץåΥꥯȤȯԤȾֳǧϡͥåȥ󥿥ե
˥åȤΥϡɥ쥸Фץå뤳Ȥˤ
ƹԤΥϡɥ쥸ϥץåʪɥ쥹֤˥ޥå
󥰤롣ǡΤμϤϡͥåȥ
ե˥åȤDMAžѤľܼ絭˥뤳Ȥˤ
ƹԤDMAžϥץåλؼ˽


--- ꥯȼ ---

ץåȯԤꥯȤϡ־ִƻססּפ3 
̤롣־ִƻפϥͥåȥ󥿥եξ֤ɽ
ѥ᡼ͤɤ߽Ф򡢡סּפϤ줾ץ
ȤͥåȥؤΥѥåȤͥåȥץ
󥰥ȤؤΥѥåȤμؼ롣


--- ꥯȽ ---

ͥåȥ󥿥եˤꥯȤνϡȼ¹Ԥ2Ĥ
ե롣

ִƻꥯȤϡȯԸ¨¤˼졢ξǼ¹Ԥλ롣
ꥯȤȼꥯȤϡޤȯԤԤ졢ΤΤ郎
ȼ롣줿塢˽ξ郎äǼ¹Ԥ
Ϥ롣

ꥯȤȯԽ̤˽롣ꥯȤϥꥯȤ
ȯԽȤ̵طˡѥåȤ˽롣ȼ
ǻѤ񸻤礷ϡͥ褵롣


-- ѥåˡ ----

ǡݤϡץåǡμ絭Υɥ쥹
ӥΡɥɥ쥹ΥѥåȸͭΥѥåID()
ͥåȥ󥿥եã롣ꥯȯԸΥͥåȥ
󥿥եΥѥåФδλϡϡɥ쥸ɤ߽Ф
Ȥǳǧ롣ΡɤѥåȤȤǧʤ
դƤʤ: ̥եȥؤǥݡȤʤФʤʤ

ǡݤϡץåϼǡǼΰμ絭
Υɥ쥹ӥΡɥɥ쥹ΥѥåȸͭΥѥ
IDͥåȥ󥿥եã롣ꥯȯԸΥѥå
δλϡϡɥ쥸ɤ߽ФȤǳǧ롣

̾³ͥåȥϥѥåȥ郎롣ͥåȥ
󥿥եϤ˽äѥåȤΤߤԤͥåȥ
Ƥ礭礭ʥǡϡץå¦
ǡʬ䤹ɬפ롣


-- ¤ ----

ͥåȥ󥿥եˤϡꥯ/ѥåȤǼʲ
5ĤΥ֥å롣

- ꥯȥХåե

  ץåꥯȤǽ˳ǼХåեǤ롣
  ХåեԤǡץåȯԤꥯȤ򤽤׵ᤵ줿
  ̤˳Ǽ롣ΥХåեϡ줿ޤλƤ
  ʤꥯȤΤߤǼ롣

  ꥯȤϡȯԤ줿Хåե롣λꥯ
  ȤIDƤ졢бbusyե饰1˽񤭴롣
  ץåƤ줿ꥯIDǧ뤳ȤǡꥯȤ
  롣

  줿ꥯȤϡλǤ٤ǡΤ絭
  ˤΤ֤Ƥ롣Τᡢ絭٤ǡΤͥ
  ȥ󥿥եžƤɬפ롣絭Υǡ
  žϡԤƬΥꥯȤ˹Ԥ롣絭Υǡ
  žԤˡͥåȥ󥿥եϥХ褦Ȼ
  ߤ롣Хγݤ衢ǡΤɤ߹ߤ򳫻Ϥ롣絭
  žã뤳ȤǡꥯȤǽ֤ˤʤ롣
  ꥯȤǽˤʤȤϡץåǤХǡ
  κǽΥɤ夷롢ץåǤʤХǡ
  κǸΥɤ夷ؤ

  ꥯȤǽ֤ˤʤȡҤ˥åȤؤã졢
  ͥåȥؤϤ롣λޤǤϥꥯ
  ȥȥХåեʤ

  ǡžλ٤ƤΥǡ˥åȤؤȡ
  λ롣λꥯȤХåե졢ޤ
  Ʊбbusyե饰0˽񤭴롣

  Хåեγƥȥϡʲξǹ롣
    ꥯID (busyե饰ΰסΥǥåб)
    Ρɥɥ쥹
    ǡΰΥɥ쥹
    ǡΰΥեåȿ
    ѥå (ϥݥ)
    progressiveե饰
  ߥ졼ϤˤĤղþ󤬤롣˴ؤ
  Ҥ򻲾ȤΤȡ

- ˥å

  ѥåȤɬ׿ΥեåȤʬ䤷ƥͥåȥ롣
  ϴ쥯饹Ƥ롣

- ˥å

  եåȤϤμ˥åȤ˳Ǽ졢ѥåȤ
  롣ס˶ꡢ٤ƤΥإåեåȤ˥å
  夷ƤСΥѥåȤϼס˳Ǽ롣٤Ƥθ
  ³եåȤ夷ǡ˥åȤõ롣

  ϴ쥯饹Ƥ롣

- ס

  ѥåȤ򸵥ǡŸƳǼ󡣤Υסˤϡ
  ꥯȤȤ̵طˡ夷ѥåȤإåȥǡŸ
  ƳǼ롣

  Хåեγƥȥϡʲξǹ롣
    椫ɤɽե饰 (ϥѥåΤؤΥݥ󥿤)
    ѥå (ϥݥ)
    ѥåID
    // Ρɥɥ쥹 (ι®Τ˻Ѥ)
    // ǡΥեåȿ (ι®Τ˻Ѥ)
    λɽե饰
    ꥯȤΥȥȤΰץե饰
    бꥯȤμꥯȥХåեΥǥå

- ꥯȥХåե

  ץåμꥯȤǼХåեǤ롣Ǽǽ
  ǿϼסȤΩƤ롣Ǽ줿ꥯȤϡ¹Բǽ
  ʤ꼡롣ʣΥꥯȤ¹ԲǽˤʤäϡХåե
  Υȥ˽(ҤȤӽۣʥꥯȤȯ
  ԤƤޤȡǤб򥽥եȥؤ椹뤳Ȥ񤷤)

  ֥ꥯȤ¹ԲǽǤפȤϡ2ĤξƤ뤳Ȥ
  ̣롣
   (1)ס˳ǡ
   (2)ХݲǽǤ

  Хåեγƥȥϡʲξǹ롣
    椫ɤɽե饰
    Ρɥɥ쥹
    ѥåID
    ǡΰΥɥ쥹
    ǡΰΥեåȿ
    ե饰 (䤦/ʤǡ䤦/ʤ
              ǡž/ΤƤ)
    progressiveե饰
    סΥȥȤΰץե饰
    бǡμסΥǥå
    ǡνλɽե饰
    񤭹ߴλɽե饰

  夷ѥåȤ˳ꥯȤʣ¸ߤ硢ʲν
  ǸԤ롣
   (1)/ǡ/ѥåIDפꥯ
   (2)/ǡꤷƤꥯ
   (3)ʤǡꤷƤꥯ
   (4)ĤΥꥯ
      (ǡʾ礭ΥѥåȤϥޥåʤ)

סȼꥯȥХåեޤäƤơʤļꥯ
ȥХåեγƥȥ꤬סΤɤΥǡˤ⳺ʤ硢ͥ
ȥ󥿥եϥǥåɥå롣ꥯȥХåեޤ
ס礭뤳Ȥǥǥåɥåβǽ㤯뤳ȤϤǤ
ͥåȥ󥿥եǺŪ˲褹ʤ¸ߤʤǥ
ɥåȯ餳򥽥եȥؤΤơǽ֤Τޤ
Υǡס뤫絭ΰХåեضŪ˰ư롣
ˤǥåɥåä롣


-- ꥯȯԤɬפʻ ---

o sense (ִƻ)

  (ꤷʤɤ)

o send / progressive send ()

  - Ρɥɥ쥹
  - ѥåID
  - ǡμ絭Υɥ쥹
  - ǡμ絭Υ (եåȿǻ)

o receive / progressive receive ()

  - Ρɥɥ쥹
  - ѥåID
  - ǡμ絭Υɥ쥹
  - ǡμ絭Υ (եåȿǻ)
  - ե饰: Ρɥɥ쥹䤦 / ʤ
  - ե饰: ǡ䤦 / ʤ

-- ץå鸫 ----

o 

  1. (send/receiveΤ)ǡΰ
  2. ꥯȤФؼ񤭹
  3. ꥯȼ̤񤭹

o senseξ

  4. ֤äƤѥ᡼ɤ

o send/receiveξ

  4. Ƥ줿ꥯIDɤߡФƤ
     IDͤϰͤäϡꥯȤϼ줿λ
     бbusyե饰1()ˤʤäƤ롣
     ⤷IDϰϳͤäϥꥯȤݤ줿3. ä
     ȥ饤
  5. ʹߤνNIԤбbusyե饰0(λ)ˤʤä¹Խλ


-- ϡɥ ----

+<num> ǼƤͤϡɥ쥹ΥեåͤǤ롣ñ̤word

o ϡɥ쥸ޥå

  +00 ꥯȤ˴ؤؼ/֤ (16words)
  +10 ѥ᡼              (8words)
  +18 ѥѥ᡼              (8words)
  +20 ꥯbusyե饰    (Ĺ)
  +?? ꥯbusyե饰    (Ĺ)

  - sense
    +00  ꥯȼ

  - send
    +00  ꥯȼ
    +01  Ƥ줿ꥯID
    +02  ΡɤΥɥ쥹
    +03  ѥåID
    +04  ǡμ絭Υɥ쥹
    +05  ǡμ絭Υ (եåȿǻ)

  - receive
    +00  ꥯȼ
    +01  Ƥ줿ꥯID
    +02  ΡɤΥɥ쥹
    +03  ѥåID
    +04  ǡμ絭Υɥ쥹
    +05  ǡμ絭Υ (եåȿǻ)
    +06  ե饰
           Ρɥɥ쥹 䤦/ʤ
           ǡ         䤦/ʤ

  - ѥ᡼
    +10  ǡĹ (եåȿ)
    +11  ꥯȥХåե礭 (= ס礭)
    +12  ꥯȥХåե礭
    +13  ס礭
    +14  λե饰Υեå (word addressing)
    +15  λե饰Υեå (word addressing)

  - ѥѥ᡼
    +18  λƤʤꥯȿ
    +19  λƤʤꥯȿ
    +1a  ס̤襨ȥ

o ꥯȼ̤Ȥ

   0  sense
   1  send
   2  psend (progressive send)
   3  recv
   4  precv (progressive receive)


--  ----

1եåȤ1wordƱ쥵Ȥ롣


-- : ѿΰ̣դޤʤ ----

state_type:
  ܤ̾դԤ󷿡

send_request_type:
  ꥯȥХåեΥȥη
    req_id:           ꥯID (NIưŪ˳ƤID)
    pkt_id:           ѥåID (ͤϥեȥؤˤäƻꤵ)
                      (ܼŪˤ: ϤȤоݡǥХåѤ)
    data_adr:         ǡʪɥ쥹
    data_len:         ǡĹ
    pkt:              ѥåΤؤΥݥ
    progressive_flag: ץå֤ݤ
    send_ready_flag:  ǽݤ
    rest_flits:       λޤǤɬפʥեå
                      (NIǻȤΤ:ͤǥȤ
                       櫓ǤϤʤ)

receive_request_type:
  ꥯȥХåեΥȥηˤĤ̤
    used_flag:        椫ݤ򼨤ե饰
    src:              Ρ
    pkt_id:           ѥåID (ͤϥեȥؤˤäƻꤵ)
    data_adr:         ǡʪɥ쥹
    data_len:         ǡĹ
    anysrc_flag:      Ρɤ䤦ݤ
    anysize_flag:     ǡĹ䤦ݤ
    progressive_flag: ץå֤ݤ

receive_pool_entry_type:
  סΥȥηˤĤ̤
    pkt:              ǼƤѥåΤؤΥݥ
    recv_end_flag:    λƤ뤫ݤ

state_:
  ߤξ֡ۻ˽롣ͤREADY

bus_if_:
  Х󥿥եNIۻ˽롣

mem_buf_:
  Υϡɥ쥸μΡNIۻ˽롣

sendreq_buf_, recvreq_buf_, recv_pool_:
  ХåեХåեס롣NIۻ˽롣

packet_header_size_, max_packet_data_size_:
  ѥåȤΥإåǡκĹñ̤flitNIۻ˽
  롣

mem_read_wait_, mem_write_wait_:
  ꥢٱ䡣NIۻ˽롣

fetched_sendreq_flag_, fetched_recvreq_flag_:
  ȯԤդޤƤʤ{|}ꥯȤ̵ͭNI
  ۻ false ˽롣

sendreq_restflit_count_:
  ˤѥåȤλĤեåȿNIۻ 0 ˽
  롣

receiving_flag_:
  NI߼ưˤ뤫ݤNIۻ false ˽롣

recvreq_count_:
  ꥯȥХåեˤꥯȤοɤ߽Фˤϥдؿ
  pending_receive_request_count() Ѥ롣NIۻ 0 ˽
  롣

recvpool_count_:
ready_to_recvreq_count_:
  m(_ _)m 

curr_sendreq_dmatrans_:
  ѥåȤΥǡΤDMAžˤƼξ֤ˤȤˤΤ߻
  ѤѿΥǡǼꥯȥХåեΥ
  򻲾Ȥݥ󥿡NIۻˤϽʤ

receiving_pool_index_:
  ѥåȼưΤ߻Ѥѿ߼ΥѥåȤǼ
  סΥȥindex͡NIۻˤϽʤ

wait_count_, access_address_, total_packet_count_, packet_index_:
  ϡɥ쥸ؤΥꥢξ֤ˤȤˤΤ
  ѤѿԤ֤λĤꡢΥɥ쥹ޥ
  ɥɿ߽ΥindexNIۻˤϽ
  ʤ


--  ----

  ֥åsendNIǤϰʤ
   - NI٥ǤΥإåξ뤫
   - եȥؤȤʬΥǤʤʤ뤫
   - ǽŻ뤷ʤХեȥؤǥ֥å󥰤뤳Ȥݾڤ
     뤫
   - ǽŻ뤹ϥ֥åsendϤ⤽Ȥʤ

  progressiveϥե饰ǤϤʤ̥ޥɤˤ롣
   - ˥ϡɥ쥸ؤΥ뤫


-- ̤ ----

- ǥåɥåȯΥǡۤФޥɤλ
- progressive sendprogressive receivecommitդ٤?
  դȤ礭ʲ¤ˤʤ롣
  ̾send, progressive send, twophase send ȤǤ⤹뤫? ޤȤ?


-- TODO ----

  mp_network_interface饹:
    ǥåɥå赡

  mpni_io_funcs饤֥:
    إåե

  ¾:
    MPIؿ
    ISISɥȤupdate
      (network_packet_receiver, mp_network_interface)

  mp_network_interface:
    state_type: NIMEMDMAž
    receive_request_type
    receive_pool_entry_type
    accept_command_recv()
    selfcheck(), deadlock()
    clock_in(), clock_out(): NIMEMDMAž
  - receiveϢ map<req_id> => state Ƴ٤?

-- ԡ̿Ǥμ˴ؤͻ ----

ԡ̿Ԥ硢ѥåȤμ絭Τɤ˽񤭹
ν񤭹֤ɤλǷꤹΤȤʤ롣

ԡ̿Ԥʤϡͥåȥ󥿥եϼ
åȤ򲿤餫μʤǥեȥؤϤǤ롣ѥåȤȤ
򸫤ɬפϤʤ̾ͥåȥ󥿥ե⤷ϥ
뤬ѥåȤ絭1Хåեž롣θ塢
ͥ뤬إå˱ƥǡΤ̤μ絭ΰ˥ԡ롣

ԡ̿Ԥϡǡν񤭹ߤԤΤեȥͥ
ȥ󥿥ե񤭹ꤹΤѥåȼ
夫4Ĥʬ롣

(1)(2) ԡ̿ǥեȥǡοʬԤϡͥ
ȥ󥿥եϼѥåȤϡɥ쥸ͳǥ
åϤץåϥեȥˤ༡ǥͥåȥ
󥿥եΥϡɥ쥸ѥåȤɤ߼ꡢإå
Ϥǡ񤭹٤ɥ쥹ȽŪμ絭ΰ
ǡž롣

(3) ԡ̿ǥͥåȥ󥿥եǡν񤭹ߤԤ
񤭹ϼ˷ꤹϡͥåȥ󥿥եϥѥ
ȼ(ΤˤϽ񤭹ꤹΤɬפʬ)˽
ꤹ뤿μ³ԤѥåȤβϤϽɬפǤ
ᡢˡѤΤǤн񤭹ηϥեȥԤ
Ȼפ롣եȥϳߤ⤷ϥݡ󥰤ǥѥåȤ
ΤѥåȤΥإåϤƽ񤭹ꤷͥå
󥿥եã롣θͥåȥ󥿥ե絭
ΰؤȥǡž롣

(4) ԡ̿ǥͥåȥ󥿥եǡν񤭹ߤԤ
񤭹˷ꤷƤϡͥåȥ󥿥եϥ
åȼˤ餫񤭹ΤäƤɬפ롣ξ
ĤĤʣΥѥåȤƱ˼ǽˤ뤿ˤϡ夹
åȤդ˼̤Ǥɬפ롣ѥåȤդ˼̤Ǥ
ΩƤʤСͥåȥ󥿥եԤ٤ñ
Ǥ: ʤ夷ѥåȤ̤ΤäƤ񤭹
Фƥǡ񤭹Ǥ롣

(1)(2)(3)ˡϡϤ鴰λޤǤδ֤˥եȥͿɬ
פ롣(4)ˡϡϤ鴰λޤǤͥåȥ󥿥ե
Τߤǽ뤳ȤǤ롣ʤ顢(4)ˡäȤû¹
֤Ȥʤ뤳ȤԤ롣

(4)¸뤿ˤϡѥåȤդ˼̤ʤФʤʤ
ϡեȥƥѥåȤФưդʼ̻Ҥ򿶤뤳ȤǲǤ
롣դʼ̻Ҥ򿶤ˡ¿ͤ뤬ʲΤ褦ñˡ
¸Ǥ롣

¦ΡɤΥեȥϡΡѥ󥿤Ѱդ
Ρɤ˥ѥåȤݤ˥ͤѥåȼ̻(ѥ
IDȤƾ嵭Ƥ)ȤƥѥåȤղä롣塢
ͤ1ʤ롣¦ΡɤǤƱͤ˼ѥ󥿤Ѱդ
ΡɤѥåȤݤ˥ͤΡɥɥ쥹
̻ҤȤƥѥåȤ롣塢ͤ1ʤ롣Τ褦ˡ
ǥ󥿤Ʊ뤳ȤǥѥåȤ̤Ǥ롣ƱΥΡɤ
߹礻ʣ̿Ԥϡ줾β̿Ȥˤ˼̻Ҥ
ɬפ롣㤨MPIʤСǥ桼ꤹ뤳Ȥ̳
Ƥ̿̿Ȥμ̻ҤȤƻѤɤ

ѥåȼ̻ҤϡѥåȤդ˼̤ǤȤϰϤ
ͤѤɬפ롣դ˸СѥåȤդ˼̤Ǥʤʤ
ϡƱ켱̻ҤƱΥѥåȤƱ참夷
롣򤹤ˤϡƱΡ/ƱΡɤĥѥ
ȷͥåȥƱ¸ߤĿʾͤǼǽʥӥå
ͤ򤹤ɤΥӥåΤ˻Ф뤿ˤϥͥ
ȥȥݥ/ϤХݥꥷ˱Ԥɬפ뤬
餯ΡɿƱ٤ΥӥåнʬǤ̥եȥ
Ʊѥåп¤뤳ȤǤ⼱̻ҤͤʤȤݾڤǤ
롣

ѥåȼ̻Ҥ鷺˼ϡ̻Ҥ̵뤷ƼԤ
Ѥμ̻Ҥ򥽥եȥؤǳƤƤͥåȥ󥿥ե
ΥϡɥݡȤפǤ롣


-- ԡ̿ȥǥåɥå˴ؤͻ ----

ͥåȥ󥿥եΤΥԡ̿(嵭(4)μˡ)
ʤΤϡͥåȥ󥿥եǼդ뤳ȤǤ
ꥯȿˤϸ¤꤬뤳ȤȡѥåȤνͽۤǤʤ
ȤǤ(: 2ΡɤƱ˼ȡɤΥѥåȤ
ΤϤ狼ʤ)ǰξ硢ͥåȥ󥿥ե³
ΥꥯȤȸ³μѥåȤƤޤ⤹٤Ƥμ
ѥåȤɤΥꥯȤˤ⳺ʤ˴٤ǽ롣
ͥåȥ󥿥եΥǥåɥåˤʤ롣

򤹤ˡȤơʲ2Ĥͤ롣

1ˡϡꥯȥХåե絭֤ȤǡꥯȥХåե
礭¾̵¤ˤˡǤ롣ˡǤϥͥåȥ
󥿥եˤ˼絭˥ɬפ뤿ᡢ®ٸ˾
ʤ

2ˡϡǥåɥåȯΤߥեȥǽˡ
Ǥ롣ǥåɥåȯ顢ԡ򤢤ƿʬμ
ѥåȤ絭ΰХåեžեȥؤǿʬ
ԤˡŪǤ㳰٤̵Ǥ٤˾
СʿѤƹ®ž¸Ǥ롣


--- Хåե¤˴ؤͻ ----

- 

  ץå¦׵ǼХåե1ɬסꥯ
  ȥХåե̾դ롣ꥯȤȯԽ˽ԤΤǡǡ
  ¤ȤԤѤ롣

- 

  ץå¦׵ǼХåե1Ĥȥͥåȥ¦
  ѥåȤǼХåե1Ĥɬס򡢼ꥯȥХ
  եȼס̾դ롣

  ꥯȤȤϡסѥåȤ椫
  ˹礦ѥåȤ򸡺ɬפ롣ޤѥåȤ夷Ȥϡ
  ꥯȥХåեꥯȤ椫˹礦ꥯȤ
  ɬפ롣ɤξ⡢˹礦Τ˽롣
  
  ФФǤϤʤᡢɤΥХåե
  Ԥ䥹åϥǡ¤ȤŬƤʤǡξХåե
  Υǡ¤ˤѤ롣

  ߥ졼ȤƤϢǤäƤ⹽ʤκݤη׻
  ̤︺Ǥ뤳ȰʳˤޤåȤϤʤϡɥ򥷥ߥ졼
  Ȥط塢źˤ륢ɥ쥷󥰤Ѥ
  礬褤
