如何解决通过 Verilog 后端添加到进程
我想通过 Yosys 修改我的设计,对于流程中的每个任务,我需要添加另一个任务。
类似于:
always @(*) begin
a = b;
a_t = b_t; // added to process
c <= d;
c_t <= d_t; // added to process
end
我认为这可能可行,但是我在 verilog 设计上实际运行此代码时遇到了 Assert `that->chunks_.empty()' Failed in kernel/rtlil.cc
。
for (auto it = module->processes.begin(); it != module->processes.end(); ++it){ // processes
auto proc = it->second;
auto cs =&proc->root_case;
auto cs_actions = cs->actions;
for (auto it = cs_actions.begin(); it != cs_actions.end(); ++it) {
if (it->first.size() == 0) {
continue;
}
auto first = it->first.as_chunk().wire->name.c_str() + string("_t");
auto con1 = RTLIL::SigChunk(module->wire(first));
RTLIL::SigChunk con2;
if (it->second.size() == 0) {
con2 = RTLIL::SigChunk(Const(0,1));
} else {
auto second = it->first.as_chunk().wire->name.c_str() + string("_t");
con2 = RTLIL::SigChunk(module->wire(second),module->wire(second)->start_offset,module->wire(first)->width);
}
auto connection = RTLIL::SigSig(con1,con2);
cs->actions.push_back(connection);
}
for (size_t i = 0; i < proc->syncs.size(); i++){
RTLIL::Syncrule *sync = proc->syncs[i];
auto sync_actions = sync->actions;
for (auto it = sync_actions.begin(); it != sync_actions.end(); ++it) {
if (it->first.size() == 0) {
continue;
}
auto first = it->first.as_chunk().wire->name.c_str() + string("_t");
auto con1 = RTLIL::SigChunk(module->wire(first));
RTLIL::SigChunk con2;
if (it->second.size() == 0) {
con2= RTLIL::SigChunk(Const(0,1));
} else {
auto second = it->first.as_chunk().wire->name.c_str() + string("_t");
con2 = RTLIL::SigChunk(module->wire(second),module->wire(first)->width);
}
auto connection = RTLIL::SigSig(con1,con2);
sync_actions.push_back(connection);
}
}
}
错误在 push_back() 函数中弹出,我必须更改什么才能使我的预期添加工作? 我的电线是有效的,因为我预先添加了它们。我可以不使用 push_back 或 insert() 添加到进程吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。