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

📄 arbiter.cpp

📁 《systemc片上系统设计》(科学出版社)一书第六章TLM级总线建模源码
💻 CPP
字号:


#include "arbiter.h"

request *
arbiter::arbitrate(const request_vec &requests)
{
  int i;
  // at least one request is here
  request *best_request = requests[0]; 

  if (m_verbose) 
    { // shows the list of pending requests
      sb_fprintf(stdout, "%g %s :", sc_simulation_time(), name());
      for (i = 0; i < requests.size(); ++i)
	{
	  request *request = requests[i];
          // lock_status encoding
          const char lock_chars[] = { '-', '=', '+' };
          // status encoding
           sb_fprintf(stdout, "\n    R[%d](%c%s@%x)",
                     request->priority,
                     lock_chars[request->lock],
                     status_str[request->status],
                     request->address);
	}
    }

  // highest priority: status==WAIT and lock is set: 
  // locked burst-action
  for (i = 0; i < requests.size(); ++i)
    {
      request *request = requests[i];
      if ((request->status == TRANSFER_WAIT) &&
	  (request->lock == LOCK_SET))
	{
	  // cannot break-in a locked burst
	  if (m_verbose)
            sb_fprintf(stdout, " -> R[%d] (rule 1)\n", request->priority);
	  return request;
	}
    }

  // second priority: lock is set at previous call, 
  // i.e. LOCK_GRANTED
  for (i = 0; i < requests.size(); ++i)
    if (requests[i]->lock == LOCK_GRANTED)
      {
	if (m_verbose)
	  sb_fprintf(stdout, " -> R[%d] (rule 2)\n", requests[i]->priority);
	return requests[i];
      }

  // third priority: priority
  for (i = 1; i < requests.size(); ++i)
    {
      sc_assert(requests[i]->priority != best_request->priority);
      if (requests[i]->priority < best_request->priority)
	best_request = requests[i];
    }

  if (best_request->lock != LOCK_NO)
    best_request->lock = LOCK_GRANTED;
	
  if (m_verbose) 
    sb_fprintf(stdout, " -> R[%d] (rule 3)\n", best_request->priority);

  return best_request;
}

⌨️ 快捷键说明

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