вопрос об out_msg. Назначение в ответном сообщении MOESI_CMP_directory - PullRequest
1 голос
/ 20 марта 2019

В MOESI_CMP_directory-L2cache.sm-- действии j_forwardGlobalRequestToLocalOwner, "out_msg.Requestor" сообщения запроса заполняется в machineID этого кэша L2, поэтому он является правильным запросчиком.

Хотя, чтобы ответить на это сообщение в "MOESI_CMP_directory-L1cache.sm"-- действии "ee_sendDataExclusive", когда in_msg.RequestorMachine == MachineType:L2Cache, почему out_msg.Destination заполняется "mapAddressToRange" вместо "in_msg.Requestor"?
(мне кажется, это "out_msg.Requestor" значение сообщения запроса.)

L2 кеш:

action(j_forwardGlobalRequestToLocalOwner, "j", desc="Forward external request to local owner") {
peek(requestNetwork_in, RequestMsg) {
  enqueue( localRequestNetwork_out, RequestMsg, response_latency ) {
    out_msg.addr := in_msg.addr;
    out_msg.Type := in_msg.Type;
    out_msg.Requestor := machineID;// the machineID of the request L2
    out_msg.RequestorMachine := MachineType:L2Cache;
    out_msg.Destination.add(getLocalOwner(cache_entry, in_msg.addr));
    out_msg.Type := in_msg.Type;
    out_msg.MessageSize := MessageSizeType:Forwarded_Control;
    out_msg.Acks := 0 - 1;
  }
}

} L1 кеш:

action(ee_sendDataExclusive, "\e", desc="Send data from cache to requestor, don't keep a shared copy") {
peek(requestNetwork_in, RequestMsg) {
  assert(is_valid(cache_entry));
  if (in_msg.RequestorMachine == MachineType:L2Cache) {
    enqueue(responseNetwork_out, ResponseMsg, request_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceResponseType:DATA_EXCLUSIVE;
      out_msg.Sender := machineID;
      out_msg.SenderMachine := MachineType:L1Cache;
      out_msg.Destination.add(mapAddressToRange(address, MachineType:L2Cache,
          l2_select_low_bit, l2_select_num_bits, intToID(0)));//why do not filled in "in_msg.Requestor"?                              
      out_msg.DataBlk := cache_entry.DataBlk;
      out_msg.Dirty := cache_entry.Dirty;
      out_msg.Acks := in_msg.Acks;
      out_msg.MessageSize := MessageSizeType:Response_Data;
    }
    DPRINTF(RubySlicc, "Sending exclusive data to L2\n");
  }
  else {
    enqueue(responseNetwork_out, ResponseMsg, request_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceResponseType:DATA_EXCLUSIVE;
      out_msg.Sender := machineID;
      out_msg.SenderMachine := MachineType:L1Cache;
      out_msg.Destination.add(in_msg.Requestor);
      out_msg.DataBlk := cache_entry.DataBlk;
      out_msg.Dirty := cache_entry.Dirty;
      out_msg.Acks := in_msg.Acks;
      out_msg.MessageSize := MessageSizeType:ResponseLocal_Data;
    }
    DPRINTF(RubySlicc, "Sending exclusive data to L1\n");
  }
}

}

...