我试图使用Ruby在gem5中实现MSI协议:8e9b03b640e1c20748d1123fd55fd336c37d6c以下这源代码。当我运行生成时,它会引发异常并终止操作。
例外:MSI-di.sm:124:错误:未识别的函数名:'trigger_Event_Addr‘
异常发生在MSI-dir.sm文件的第219行。
in_port(memQueue_in, MemoryMsg, responseFromMemory) {
if (memQueue_in.isReady(clockEdge())) {
peek(memQueue_in, MemoryMsg) {
if (in_msg.Type == MemoryRequestType:MEMORY_READ) {
trigger(Event:MemData, in_msg.addr); //exception raised here
} else if (in_msg.Type == MemoryRequestType:MEMORY_WB) {
trigger(Event:MemAck, in_msg.addr);
} else {
error("Invalid message");
}
}
}
}我云找不到任何关于触发器函数的详细文档。根据gem5文档化,要触发的参数的数量取决于机器本身,我认为这意味着变量arguments.Also,我假设触发器的实现是有效的(我假设),因为在./src/mem/ruby/protocol中,还提供了具有触发器实现的示例协议文件(Garnet_standalone-dir.sm),其中有两个参数(trigger(Event:MemData, in_msg.addr);),就像我的一样。我的系统没有dma控制器。
为什么要提出这一例外?云我是如何解决这个问题的?
注意:在通过互联网浏览了几个小时后,gem5似乎发生了很大的变化,因为本教程已经编写完毕,而且还没有更新。因此,任何有关所有更改的来源都将是非常有用的。此外,任何更新的gem5教程源代码,像这样的,将是很好的。我发现的大部分链接主要是文档。
非常感谢。小块。
发布于 2021-09-19 13:04:42
我只是遇到了同样的问题,在互联网上找不到任何有用的信息。但是,在我查看了我的代码之后,我发现这可能是因为我在触发器中传递的参数太少,比如由事件触发的操作需要tbe和/或cache_entry,而您没有将其传递给它们。
发布于 2022-05-23 12:39:03
为了添加更多信息,我认为编译器会检查状态机中声明的结构,并查找一个没有main='false‘的带有AbstractCacheEntry接口的结构,以及一个名为TBE的结构。当找到这两个结构时,触发器接受四个参数,即触发器(Event.addr、CacheEntry、TBE)。
当没有找到这两种结构时,触发器采用两个参数触发器(Event,Addr),您将需要在操作中执行任何查找操作。
https://stackoverflow.com/questions/63969494
复制相似问题