微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过 Verilog 后端添加到进程

如何解决通过 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 举报,一经查实,本站将立刻删除。