Driving an sc_out from an sc_signal
Driving an sc_out from an sc_signal
考虑以下示例,其中一个模块的输出(inner::out
(应该驱动上层的两个输出(outer::out
和outer::out2
(:
#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#
运行此操作会导致以下错误:
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
,而不是被它驱动。有什么明显的东西我忽略了吗?有没有一种方法可以在不使用对outer
中的inner::out
敏感的显式SC_METHOD
的情况下实现这一点?
错误:(E115(sc_signal不能有多个驱动程序:
可以使用SC_MANY_WRITES解决。
例如:
sc_signal < bool, SC_MANY_WRITERS > reset_sig;
然后对于一个称为初始化器的模块,我们可以这样绑定这个信号:
initializer<int, 16> init("init");
init.reset(reset_sig);
现在是另一个模块,生产者模块,它使用相同的信号:
producer<int, 16> prc("prc");
prc.resetIn(reset_sig);
prc.resetOut(reset_sig);
您的设计描述了由三个不同的输出端口驱动的信号,而不是您想要的。
您可能需要使用端口到端口绑定。如果您不熟悉这个概念,SystemC LRM中的第4.1.3节"端口绑定和导出绑定"是这样描述的:
当端口A绑定到端口B,而端口B绑定到通道C时,效果应与端口A直接绑定到通道C.当本标准提及端口A绑定至通道C.时,应假设这意味着端口A根据同样的规则直接绑定至通道C或绑定至另一个自身绑定至通道C:的端口。这一规则同样适用于约束出口。
通过端口到端口绑定,您可以将inner::out
直接绑定到outer::out
和outer::out2
,而无需在两者之间进行信号绑定。例如:
#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
基本相同,但允许端口绑定到两个信道。CCD_ 15只能绑定到单个信道- 写入
inner::out
时,必须指定要驱动的绑定通道。这是用[]
操作符完成的——请参阅上面的inner::doit()
,其中两个绑定通道都被驱动
运行时,上面的代码会生成一个trace.vcd文件,该文件显示了两个信号out_s
和out2_s
的切换级别。
解释了所有这些,我不确定这是否真的是你想要的。输出端口像这样扇出是非常不寻常的。您真的需要outer
上的两个输出端口吗?
- N-API include an .so or dll
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- 如何理解"abstract-declarator containing an ellipsis shall only be used in a parameter-declaration"
- 如何在数据库程序中添加"reduce the quantity of an item"功能?
- C++线程"Call to non-static member function without an object argument"
- Atom gpp编译器给出"'C:UsersadminUser' is not recognized as an internal or..."错误
- 尝试在类中编译内核,出现错误"__init__() got an unexpected keyword argument 'kernel'"
- 指向对象生存期之外的已分配内存的指针是"invalid pointer[s]"还是"pointer[s] to an object"?
- 如何修复" State Error (active) E0513 a value of type "const wchar_t *" cannot be assigned to an entity o
- C++ libtins "An invalid handle was specified"
- "terminate called after throwing an instance of std::invalid_argument' what(): stoi ?"
- Hash for a std::pair, for use in an unordered_map
- Divide et impera sum of the elements of an array bug
- 为什么"an inherited constructor is not a candidate for initialization from an expression of the same or
- 根据标准,究竟什么是"declaration of an object"
- shared_ptr to an array
- Truncate an AnsiString
- "error: subscripted value is not an array, pointer, or vector",我正在使用字符串
- LLVM:如何修复"Referring to an argument in another function"
- C++:将运算符作为参数传递会导致错误"expected an identifier"