我有一个SystemC层次结构->中间->叶,并试图将叶中的multi_passthrough_initiator_socket绑定到其父模块中间的相同类型的套接字上。中间的套接字然后绑定到顶部的目标套接字。
绑定是在middle::before_end_of_elaboration()中完成的
leaf->i_socket.bind(i_socket)和top::before_end_of_elaboration()
middle->i_socket.bind(t_socket)这会在执行中间代码时创建一个异常--我注意到顶部的代码是在前面调用的(似乎before_end_of_elaboration()不是称为深度优先)。
解决方法是在其构造函数中执行中间的绑定,这意味着存在某种排序要求。有人知道这件事/能提出一个干净的解决办法吗?
发布于 2018-12-02 01:12:57
我建议你把这个张贴到Accellera支持论坛。http://forums.accellera.org/forum/14-systemc-tlm-transaction-level-modeling/
这要么是实现缺陷,要么是TLM库的无文档限制。
我亲自试验过这个案子,下面是我的发现:
下面是我的测试示例:
struct test : sc_module {
tlm_utils::multi_passthrough_initiator_socket<test> leaf{"leaf"};
tlm_utils::multi_passthrough_initiator_socket<test> middle{"middle"};
tlm_utils::simple_target_socket<test> target{"target"};
test(sc_module_name);
protected:
void before_end_of_elaboration();
};备选方案1-工程
test::test(sc_module_name)
{
leaf.bind(target);
middle.bind(leaf);
}
void test::before_end_of_elaboration() {}备选方案2-工程
test::test(sc_module_name)
{
middle.bind(leaf);
leaf.bind(target);
}
void test::before_end_of_elaboration() {}选项3-错误失败:(E126) sc_export实例已绑定
test::test(sc_module_name)
{}
void test::before_end_of_elaboration() {
middle.bind(leaf);
leaf.bind(target);
}现在出现这种行为的原因是TLM库使用before_end_of_elaboration回调来实现对分层绑定的支持(检查multi_passthrough_initiator_socket的源代码)。因此,用户代码应该在此之前完成所有套接字绑定。由于在before_end_of_elaboration之前没有回调,所以只能在构造函数中绑定TLM套接字。
请注意,信号端口的情况并非如此,您可以使用before_end_of_elaboration按任何顺序绑定这些端口:
struct test : sc_module {
sc_in<int> leaf0{"leaf0"};
sc_in<int> leaf1{"leaf1"};
sc_in<int> middle0{"middle0"};
sc_in<int> middle1{"middle1"};
sc_signal<int> sig{"sig"};
test(sc_module_name);
protected:
void before_end_of_elaboration();
};
test::test(sc_module_name)
{
}
void test::before_end_of_elaboration()
{
leaf0(middle0); // OK
middle0(sig); // OK
middle1(sig); // OK
leaf1(middle1); // OK
}https://stackoverflow.com/questions/53520240
复制相似问题