错误 E109 - 完成绑定失败:端口未绑定
Error E109 - complete binding failed: port not bound
我一直在为一个实例中的一个实例创建概念证明,但我遇到了“完全绑定错误”,我一直无法通过。我在网上查了下,虽然找到了类似的案例,但都无法解释我的。为了可读性,我尽量减少了代码。基本块是一个加法器(称为 alu_unit
),它由 block_unit
实例化,现在只包含 alu_unit
。 block_unit
由 sc_main
实例化,后者分配一个值并运行模拟。我将在下面为所有单元放置代码:
alu.h
#include <systemc.h>
SC_MODULE (alu_unit) {
sc_in < sc_int < 64 > > addA_in{"addA_in"};
sc_in < sc_int < 64 > > addB_in{"addB_in"};
sc_in < sc_lv <1> > carry_in{"carry_in"};
sc_out < sc_int < 64 > > sum_busout{"sum_busout"};
void sumc();
SC_CTOR(alu_unit) {
SC_THREAD(sumc);
sensitive << addA_in << addB_in << carry_in;
}
~alu_unit() { };
};
alu.cpp
#include "alu.h"
void alu_unit::sumc()
{
sum_busout.write(addA_in.read() + addB_in.read() + carry_in.read().to_int());
};
block.h
#include <systemc.h>
#include "alu.h"
SC_MODULE (block_unit) {
sc_in_clk clock;
sc_in < sc_int < 64 > > addA_in{"addA_in"};
sc_in < sc_int < 64 > > addB_in{"addB_in"};
sc_in < sc_lv <1> > carry_in{"carry_in"};
sc_out < sc_int <64> > sum_regout{"sum_busout"};
/* Instance declarations */
alu_unit alu1;
// Function declarations
void myblock();
SC_CTOR(block_unit):alu1("alu1") {
SC_THREAD(myblock);
sensitive << clock.pos();
}
~block_unit() { };
};
block.cpp
#include "block.h"
void block_unit::myblock()
{
wait();
while (true) {
// Input binding
// Port conections for block alu1
alu1.addA_in(addA_in);
alu1.addB_in(addB_in);
alu1.carry_in(carry_in);
alu1.sum_busout(sum_regout);
wait();
}
}
main.cpp
#include <systemc.h>
#include "block.h"
int sc_main(int argc, char **argv) {
sc_signal < sc_int < 64 > > addA_s;
sc_signal < sc_int < 64 > > addB_s;
sc_signal < sc_lv < 1 > > carry_s;
sc_signal < sc_int < 64 > > sum_s;
// 1ns clock with 50% duty cycle
sc_clock clock("clock", 1, SC_NS, 0.5);
block_unit block1("block1");
sc_start(55, SC_NS);
addA_s = 4;
addB_s = 3;
carry_s = 1;
block1.clock(clock);
block1.addA_in(addA_s);
block1.addB_in(addB_s);
block1.carry_in(carry_s);
block1.sum_regout.bind(sum_s);
sc_trace_file *tf = sc_create_vcd_trace_file("vcd_trace.vcd");
sc_trace(tf, clock, "clock");
sc_trace(tf, addA_s, "addA");
sc_trace(tf, addB_s, "addb");
sc_trace(tf, carry_s, "carry");
sc_trace(tf, sum_s, "sum");
sc_stop();
return 0;
}
编译工作正常使用:
g++ -I. -I/usr/local/systemc/include -O0 -g3 -Wall -c -lsystemc -std=gnu++11 alu.cpp -o alu.o
[...]
g++ -I/usr/local/systemc/include -L. -L/usr/local/systemc/lib-linux64 -o main -lsystemc -std=gnu++11 alu.o block.o main.o -lsystemc
并且模拟失败如下:
Error: (E109) complete binding failed: port not bound: port 'block1.alu1.sum_busout' (sc_out)
如有任何帮助,我们将不胜感激。我很高兴尝试使用 SystemC,这就是我进行这些概念证明的原因。
有些东西看起来很奇怪。
我认为你不想在 sc_main
中使用 bind
来连接到 sum_regout
。
我认为在调用 sc_start
之前先在 sc_main
中建立连接会更好。
我认为你不想在 myblock
函数中连接到 alu
。
我不知道 E109
错误的确切原因,但错误会随着以下代码消失:
//////////////////////// block.h
#include <systemc.h>
#include "alu.h"
SC_MODULE (block_unit) {
sc_in_clk clock;
sc_in < sc_int < 64 > > addA_in{"addA_in"};
sc_in < sc_int < 64 > > addB_in{"addB_in"};
sc_in < sc_lv <1> > carry_in{"carry_in"};
sc_out < sc_int <64> > sum_regout{"sum_regout"};
alu_unit alu1;
// Function declarations
void myblock();
SC_CTOR(block_unit):alu1("alu1") {
alu1.addA_in(addA_in);
alu1.addB_in(addB_in);
alu1.carry_in(carry_in);
alu1.sum_busout(sum_regout);
SC_THREAD(myblock);
sensitive << clock.pos();
}
~block_unit() { };
};
////////////////////////// block.cpp
#include "block.h"
void block_unit::myblock()
{
wait();
while (true) {
wait();
}
}
//////////////////////// main.cpp
#include <systemc.h>
#include "block.h"
int sc_main(int argc, char **argv) {
sc_signal < sc_int < 64 > > addA_s;
sc_signal < sc_int < 64 > > addB_s;
sc_signal < sc_lv < 1 > > carry_s;
sc_signal < sc_int < 64 > > sum_s;
// 1ns clock with 50% duty cycle
sc_clock clock("clock", 1, SC_NS, 0.5);
block_unit block1("block1");
block1.clock(clock);
block1.addA_in(addA_s);
block1.addB_in(addB_s);
block1.carry_in(carry_s);
block1.sum_regout(sum_s);
sc_start(55, SC_NS);
addA_s = 4;
addB_s = 3;
carry_s = 1;
sc_trace_file *tf = sc_create_vcd_trace_file("vcd_trace.vcd");
sc_trace(tf, clock, "clock");
sc_trace(tf, addA_s, "addA");
sc_trace(tf, addB_s, "addb");
sc_trace(tf, carry_s, "carry");
sc_trace(tf, sum_s, "sum");
sc_stop();
return 0;
}
上的 link
我一直在为一个实例中的一个实例创建概念证明,但我遇到了“完全绑定错误”,我一直无法通过。我在网上查了下,虽然找到了类似的案例,但都无法解释我的。为了可读性,我尽量减少了代码。基本块是一个加法器(称为 alu_unit
),它由 block_unit
实例化,现在只包含 alu_unit
。 block_unit
由 sc_main
实例化,后者分配一个值并运行模拟。我将在下面为所有单元放置代码:
alu.h
#include <systemc.h>
SC_MODULE (alu_unit) {
sc_in < sc_int < 64 > > addA_in{"addA_in"};
sc_in < sc_int < 64 > > addB_in{"addB_in"};
sc_in < sc_lv <1> > carry_in{"carry_in"};
sc_out < sc_int < 64 > > sum_busout{"sum_busout"};
void sumc();
SC_CTOR(alu_unit) {
SC_THREAD(sumc);
sensitive << addA_in << addB_in << carry_in;
}
~alu_unit() { };
};
alu.cpp
#include "alu.h"
void alu_unit::sumc()
{
sum_busout.write(addA_in.read() + addB_in.read() + carry_in.read().to_int());
};
block.h
#include <systemc.h>
#include "alu.h"
SC_MODULE (block_unit) {
sc_in_clk clock;
sc_in < sc_int < 64 > > addA_in{"addA_in"};
sc_in < sc_int < 64 > > addB_in{"addB_in"};
sc_in < sc_lv <1> > carry_in{"carry_in"};
sc_out < sc_int <64> > sum_regout{"sum_busout"};
/* Instance declarations */
alu_unit alu1;
// Function declarations
void myblock();
SC_CTOR(block_unit):alu1("alu1") {
SC_THREAD(myblock);
sensitive << clock.pos();
}
~block_unit() { };
};
block.cpp
#include "block.h"
void block_unit::myblock()
{
wait();
while (true) {
// Input binding
// Port conections for block alu1
alu1.addA_in(addA_in);
alu1.addB_in(addB_in);
alu1.carry_in(carry_in);
alu1.sum_busout(sum_regout);
wait();
}
}
main.cpp
#include <systemc.h>
#include "block.h"
int sc_main(int argc, char **argv) {
sc_signal < sc_int < 64 > > addA_s;
sc_signal < sc_int < 64 > > addB_s;
sc_signal < sc_lv < 1 > > carry_s;
sc_signal < sc_int < 64 > > sum_s;
// 1ns clock with 50% duty cycle
sc_clock clock("clock", 1, SC_NS, 0.5);
block_unit block1("block1");
sc_start(55, SC_NS);
addA_s = 4;
addB_s = 3;
carry_s = 1;
block1.clock(clock);
block1.addA_in(addA_s);
block1.addB_in(addB_s);
block1.carry_in(carry_s);
block1.sum_regout.bind(sum_s);
sc_trace_file *tf = sc_create_vcd_trace_file("vcd_trace.vcd");
sc_trace(tf, clock, "clock");
sc_trace(tf, addA_s, "addA");
sc_trace(tf, addB_s, "addb");
sc_trace(tf, carry_s, "carry");
sc_trace(tf, sum_s, "sum");
sc_stop();
return 0;
}
编译工作正常使用:
g++ -I. -I/usr/local/systemc/include -O0 -g3 -Wall -c -lsystemc -std=gnu++11 alu.cpp -o alu.o
[...]
g++ -I/usr/local/systemc/include -L. -L/usr/local/systemc/lib-linux64 -o main -lsystemc -std=gnu++11 alu.o block.o main.o -lsystemc
并且模拟失败如下:
Error: (E109) complete binding failed: port not bound: port 'block1.alu1.sum_busout' (sc_out)
如有任何帮助,我们将不胜感激。我很高兴尝试使用 SystemC,这就是我进行这些概念证明的原因。
有些东西看起来很奇怪。
我认为你不想在 sc_main
中使用 bind
来连接到 sum_regout
。
我认为在调用 sc_start
之前先在 sc_main
中建立连接会更好。
我认为你不想在 myblock
函数中连接到 alu
。
我不知道 E109
错误的确切原因,但错误会随着以下代码消失:
//////////////////////// block.h
#include <systemc.h>
#include "alu.h"
SC_MODULE (block_unit) {
sc_in_clk clock;
sc_in < sc_int < 64 > > addA_in{"addA_in"};
sc_in < sc_int < 64 > > addB_in{"addB_in"};
sc_in < sc_lv <1> > carry_in{"carry_in"};
sc_out < sc_int <64> > sum_regout{"sum_regout"};
alu_unit alu1;
// Function declarations
void myblock();
SC_CTOR(block_unit):alu1("alu1") {
alu1.addA_in(addA_in);
alu1.addB_in(addB_in);
alu1.carry_in(carry_in);
alu1.sum_busout(sum_regout);
SC_THREAD(myblock);
sensitive << clock.pos();
}
~block_unit() { };
};
////////////////////////// block.cpp
#include "block.h"
void block_unit::myblock()
{
wait();
while (true) {
wait();
}
}
//////////////////////// main.cpp
#include <systemc.h>
#include "block.h"
int sc_main(int argc, char **argv) {
sc_signal < sc_int < 64 > > addA_s;
sc_signal < sc_int < 64 > > addB_s;
sc_signal < sc_lv < 1 > > carry_s;
sc_signal < sc_int < 64 > > sum_s;
// 1ns clock with 50% duty cycle
sc_clock clock("clock", 1, SC_NS, 0.5);
block_unit block1("block1");
block1.clock(clock);
block1.addA_in(addA_s);
block1.addB_in(addB_s);
block1.carry_in(carry_s);
block1.sum_regout(sum_s);
sc_start(55, SC_NS);
addA_s = 4;
addB_s = 3;
carry_s = 1;
sc_trace_file *tf = sc_create_vcd_trace_file("vcd_trace.vcd");
sc_trace(tf, clock, "clock");
sc_trace(tf, addA_s, "addA");
sc_trace(tf, addB_s, "addb");
sc_trace(tf, carry_s, "carry");
sc_trace(tf, sum_s, "sum");
sc_stop();
return 0;
}
上的 link