问题描述
我想通过 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 (将#修改为@)