错误 E109 - 完成绑定失败:端口未绑定

Error E109 - complete binding failed: port not bound

我一直在为一个实例中的一个实例创建概念证明,但我遇到了“完全绑定错误”,我一直无法通过。我在网上查了下,虽然找到了类似的案例,但都无法解释我的。为了可读性,我尽量减少了代码。基本块是一个加法器(称为 alu_unit),它由 block_unit 实例化,现在只包含 alu_unitblock_unitsc_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;
}

这是 edaplayground

上的 link