首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从sc_out驱动sc_signal

从sc_out驱动sc_signal
EN

Stack Overflow用户
提问于 2016-09-19 13:52:45
回答 2查看 2.2K关注 0票数 1

考虑以下示例,其中一个模块的输出(inner::out)应该驱动上层层次的两个输出(outer::outouter::out2):

代码语言:javascript
运行
复制
#include <systemc.h>

SC_MODULE(inner) {
    sc_out<bool> out;

    SC_CTOR(inner) : out("out") {
        SC_THREAD(doit);
    };

    void doit() {
        for (int i=0; i<10; ++i) {
            out != out;
            wait(10, SC_NS);
        }
    }
};


SC_MODULE(outer) {
    sc_out<bool> out, out2;

    SC_CTOR(outer) : out("out"), out2("out2"), i("inner"), out_s("out_s") {
        i.out(out_s);

        out(out_s);
        out2(out_s);
    }

    inner i;

    sc_signal<bool> out_s;
};


int sc_main(int argc, char **argv) {
    outer o("outer");

    sc_start(1, SC_MS);

    return 0;
}

https://www.edaplayground.com/x/5s2C#

运行此操作将导致以下错误:

代码语言:javascript
运行
复制
Error: (E115) sc_signal<T> cannot have more than one driver: 
 signal `outer.out_s' (sc_signal)
 first driver `outer.inner.out'  (sc_out)
 second driver `outer.out2' (sc_out)
In file: ../../../../src/sysc/communication/sc_signal.cpp:73

outer::out2似乎被认为是驱动out_s而不是由它驱动的。有什么明显的东西我忽略了吗?是否有一种在不使用对SC_METHOD内部的inner::out敏感的显式outer的情况下工作的方法?

EN

回答 2

Stack Overflow用户

发布于 2016-09-20 13:12:13

您的设计描述了由三个不同的输出端口驱动的信号--而不是您想要的。

您可能需要使用端口到端口绑定。如果您不熟悉这个概念,那么SystemC LRM中的4.1.3节“端口绑定和导出绑定”将如下描述:

当A港受B港约束,而B港受C道约束时,其效果须犹如A港直接受C通道约束一样。凡本标准指A港受C信道约束,则须假定A港是直接受C通道约束的,或与根据这同一规则本身受C信道约束的另一港口绑定一样。这一规则应适用于具有约束力的出口。

通过端口到端口的绑定,您可以直接将inner::out绑定到outer::outouter::out2,而之间没有信号。例如:

代码语言:javascript
运行
复制
#include <systemc.h>

SC_MODULE(inner) {
    sc_port<sc_signal_inout_if<bool>, 2> out;

    SC_CTOR(inner) : out("out") {
        SC_THREAD(doit);
    };

    void doit() {
        for (int i=0; i<10; ++i) {
            out[0]->write(!out[0]->read());
            out[1]->write(!out[1]->read());
            wait(10, SC_NS);
        }
    }
};


SC_MODULE(outer) {
    sc_out<bool> out, out2;

    SC_CTOR(outer) : out("out"), out2("out2"), i("inner") {
        i.out(out);
        i.out(out2);
    }

    inner i;
};


int sc_main(int argc, char **argv) {
    outer o("outer");
    sc_signal<bool> out_s;
    sc_signal<bool> out2_s;

    o.out(out_s);
    o.out2(out2_s);

    sc_trace_file *tf = sc_create_vcd_trace_file("trace");
    sc_trace(tf, out_s, "out_s");
    sc_trace(tf, out2_s, "out2_s");

    sc_start(1, SC_MS);

    sc_core::sc_close_vcd_trace_file(tf);

    return 0;
}

在上面的代码中有几件事需要注意:

  • inner::out被声明为sc_port<sc_signal_inout_if<bool>, 2>,这基本上与sc_out相同,但允许将端口绑定到两个通道。sc_out只能绑定到单个信道。
  • 当写入inner::out时,您必须指定要驱动的绑定通道。这是通过[]操作符完成的--参见上面的inner::doit(),其中两个绑定通道都是驱动的。

当运行时,上面的代码生成一个trace.vcd文件,该文件显示out_sout2_s这两个信号的级别。

在解释了所有这些之后,我不确定这是否真的是你想要的。像这样输出端口风扇是非常不寻常的。您真的需要outer上的两个输出端口吗?

票数 1
EN

Stack Overflow用户

发布于 2018-06-13 16:32:31

错误:(E115) sc_signal不能有多个驱动程序:

可以用SC_MANY_WRITERS来解决。

例如:

代码语言:javascript
运行
复制
sc_signal < bool, SC_MANY_WRITERS > reset_sig;

然后,对于一个称为初始化器的模块,我们可以这样绑定这个信号:

代码语言:javascript
运行
复制
initializer<int, 16> init("init");

init.reset(reset_sig);

现在对于另一个模块,生产者模块,它使用相同的信号:

代码语言:javascript
运行
复制
producer<int, 16> prc("prc");

prc.resetIn(reset_sig);
prc.resetOut(reset_sig);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39574912

复制
相关文章

相似问题

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