首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绑定multi_passthrough_initiator_sockets有任何订单要求吗?

绑定multi_passthrough_initiator_sockets有任何订单要求吗?
EN

Stack Overflow用户
提问于 2018-11-28 13:09:49
回答 1查看 936关注 0票数 0

我有一个SystemC层次结构->中间->叶,并试图将叶中的multi_passthrough_initiator_socket绑定到其父模块中间的相同类型的套接字上。中间的套接字然后绑定到顶部的目标套接字。

绑定是在middle::before_end_of_elaboration()中完成的

代码语言:javascript
复制
leaf->i_socket.bind(i_socket)

top::before_end_of_elaboration()

代码语言:javascript
复制
middle->i_socket.bind(t_socket)

这会在执行中间代码时创建一个异常--我注意到顶部的代码是在前面调用的(似乎before_end_of_elaboration()不是称为深度优先)。

解决方法是在其构造函数中执行中间的绑定,这意味着存在某种排序要求。有人知道这件事/能提出一个干净的解决办法吗?

EN

回答 1

Stack Overflow用户

发布于 2018-12-02 01:12:57

我建议你把这个张贴到Accellera支持论坛。http://forums.accellera.org/forum/14-systemc-tlm-transaction-level-modeling/

这要么是实现缺陷,要么是TLM库的无文档限制。

我亲自试验过这个案子,下面是我的发现:

  • 没有订购要求。
  • 但是不允许对tlm套接字绑定使用before_end_of_elaboration()

下面是我的测试示例:

代码语言:javascript
复制
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-工程

代码语言:javascript
复制
test::test(sc_module_name)
{
    leaf.bind(target);
    middle.bind(leaf);
}

void test::before_end_of_elaboration() {}

备选方案2-工程

代码语言:javascript
复制
test::test(sc_module_name)
{
    middle.bind(leaf);
    leaf.bind(target);
}

void test::before_end_of_elaboration() {}

选项3-错误失败:(E126) sc_export实例已绑定

代码语言:javascript
复制
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按任何顺序绑定这些端口:

代码语言:javascript
复制
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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53520240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档