ArcaGraphy
ArcaGraphy

Reputation: 53

Error: (E109) complete binding failed: port not bound

I am trying to design an LFSR counter in SystemC which should look something like this: (click to see picture)

I think there is something wrong with connections between modules shiftreg.h and lfsr-feedback.h in the lfsr.h file, but I can't figure out what the problem is.

I get this error message while running on terminal:

Error: (E109) complete binding failed: port not bound: port 'top_p.LFSR_p.shiftReg_p.port_3' (sc_in)
In file: ../../../../src/sysc/communication/sc_port.cpp:231

This is how the main.cpp file looks like:

#include <iostream>
#include "systemc.h"
#include "lfsr.h"
#include "stim_shiftReg.h"

SC_MODULE(TOP)
{
    LFSR          *LFSR_p;
    stim_shiftReg *stim_shiftReg_p;

    sc_clock               sig_clk;  //define clock pin

    sc_signal< bool >      sig_rst;
    sc_signal< bool >      sig_lshift;
    sc_signal< sc_bv<8> >  sig_out;

    SC_CTOR(TOP) : sig_clk ("ClockSignal", 20, SC_NS)
    {
        stim_shiftReg_p = new stim_shiftReg("stim_shiftReg_p");
        stim_shiftReg_p -> clk(sig_clk);          //input bool
        stim_shiftReg_p -> rst(sig_rst);          //input bool
        stim_shiftReg_p -> stim_lshift(sig_lshift);    //input bool
        stim_shiftReg_p -> stim_out(sig_out);          //output sc_bv

        LFSR_p = new LFSR("LFSR_p");
        LFSR_p -> clk(sig_clk);           //input bool
        LFSR_p -> rst(sig_rst);           //input bool
        LFSR_p -> lshift(sig_lshift);
        LFSR_p -> out(sig_out);           //output sc_bv

    }
    ~TOP(){
        //free up memory
        delete LFSR_p;
        delete stim_shiftReg_p;
    }
};

TOP *top_p = NULL;

int sc_main(int argc, char* argv[])
{
    sc_set_time_resolution(1, SC_NS);
    top_p = new TOP("top_p");
    sc_start();
    return 0;
}

This is how lfsr.h file looks like:

#include"systemc.h"
#include"shiftReg.h"
#include"lfsr_feedback.h"

SC_MODULE(LFSR)
{
    shiftReg      *shiftReg_p;
    lfsr_feedback *lfsr_feedback_p;

       //define input
       sc_in<bool> clk;
       sc_in<bool> rst;
       sc_in<bool> lshift;

       //define output
       sc_out<sc_bv<8> > out;

       sc_signal<bool> rightin;

    SC_CTOR(LFSR)
    {
        shiftReg_p = new shiftReg("shiftReg_p");
        shiftReg_p -> clk(clk);                //input bool
        shiftReg_p -> rst(rst);                //input bool
        shiftReg_p -> lshift(lshift);     //enable shift signal connection
        shiftReg_p -> out(out);        //output sc_bv

        lfsr_feedback_p = new lfsr_feedback("lfsr_feedback_p");
        lfsr_feedback_p -> clk(clk);                  //input bool
        lfsr_feedback_p -> rst(rst);                  //input bool
        lfsr_feedback_p -> rightin(rightin);          //feedback signal
        lfsr_feedback_p -> out(out);                  //output sc_bv
    }
    ~LFSR()
    {
        //free up memory
        delete shiftReg_p;
        delete lfsr_feedback_p;
    }
};

This is shiftReg.h:

#include<iostream>
#include<systemc.h>
SC_MODULE(shiftReg) //'shiftReg' - Module name
{

   //define input
   sc_in<bool> clk;
   sc_in<bool> rst;
   sc_in<bool> lshift;
   sc_in<bool> rightin;

   //define output
   sc_out<sc_bv<8> > out;

   sc_bv<8> RegValue;

   SC_CTOR(shiftReg) //'shiftReg' - Module name
   {
     SC_CTHREAD(ShiftReg, clk.pos());
     async_reset_signal_is(rst, true);
   }

   private:
   void ShiftReg()
   {
       //Reset actions
       RegValue = (11111111); //Use RegValue to store the register value
       wait();
       std::cout << "Reset done! RegisterValue = " << RegValue << endl;
       wait();

       while(true)
       {
           if(lshift.read() == true)
           {
               RegValue = RegValue << 1; //shift to the left
               RegValue[0] = rightin.read();
               std::cout << "Left shift done! RegisterValue = " << RegValue << endl;
           }
           else //if both are set to FALSE, no action should happen
           {
               std::cout << "'lshift' is set to FALSE status. No shift is done!" << endl;
           }
           out.write(RegValue); //Write output value to the out port
           wait();
       }
   };
};

And this is lfsr_feedback.h:

#include<iostream>
#include<systemc.h>
SC_MODULE(lfsr_feedback) //'lfsr_feedback' - Module name
{
   sc_in< bool > clk;
   sc_in< bool > rst;
   sc_out< bool > rightin;
   sc_in< sc_bv<8> > out;

   sc_signal<bool> fb_xor, a, b, c, d;

   SC_CTOR(lfsr_feedback)    //'lfsr_feedback' - Module name
   {
     SC_CTHREAD(Feedaback_Gen, clk.pos());
     async_reset_signal_is(rst, true);
   }

   private: void Feedaback_Gen()
   {
       wait();
       while(true)
       {
           a = out[7]; b = out[5]; c = out[4]; d = out[3];
           std::cout << "Load random bits" << endl;

           fb_xor =  (a ^ b) ^ (c ^ d);
           std::cout << "Calculate xor value!" << rightin << endl;

           rightin.write(fb_xor);
           wait();
       }
   };
};

And this is stim_shiftReg.h:

#include "systemc.h"

SC_MODULE(stim_shiftReg) 
{
    //define stimuli input for shift register
    sc_in<bool> clk;
    sc_out<bool> rst;
    sc_out<bool> stim_lshift;

    //define stimuli output for shift register
    sc_in<sc_bv<8> > stim_out;

    SC_CTOR(stim_shiftReg) {   //'stim_shiftReg' module name
      SC_CTHREAD(Stim_Shift, clk.pos());
    }

    private:
    void Stim_Shift() {
        //Simulate reset signal
        wait();
        rst.write(true);
        wait();
        rst.write(false);

        //Write input value for 'in'
        stim_lshift.write(true);  //enable shifting
        wait(40000);

        sc_stop();
    };
};

Note: I am not sure about port out which is in lfsr.h. It is an sc_out<T> from shiftReg.h and also as an output form LFSR.h. But, the same port should be an input to lfsr_feedback.h.

Upvotes: 0

Views: 7259

Answers (3)

Mac
Mac

Reputation: 357

One way to deal with the less than useful message:

Error: (E109) complete binding failed: port not bound: port 'top_p.LFSR_p.shiftReg_p.port_3' (sc_in)

is to use egrep on the header file that is defining the ports of the module (guessing here):

egrep "sc_in|sc_out" shiftReg_p.h

Then you will see a list of the sc_in and sc_out in numeric order, and then have a clue which one is port_3.

Upvotes: 0

AmeyaVS
AmeyaVS

Reputation: 1054

The port "lshift" is not bound in TOP module. See my comment inline:

#include <iostream>
#include "systemc.h"
#include "lfsr.h"
#include "stim_shiftReg.h"

SC_MODULE(TOP)
{
  LFSR          *LFSR_p;
  stim_shiftReg *stim_shiftReg_p;

  sc_clock               sig_clk;  //define clock pin

  sc_signal< bool >      sig_rst;
  sc_signal< bool >      sig_lshift;
  sc_signal< sc_bv<8> >  sig_out;

  SC_CTOR(TOP) : sig_clk ("ClockSignal", 20, SC_NS)
  {
    stim_shiftReg_p = new stim_shiftReg("stim_shiftReg_p");
    stim_shiftReg_p -> clk(sig_clk);          //input bool
    stim_shiftReg_p -> rst(sig_rst);          //input bool
    stim_shiftReg_p -> stim_lshift(sig_lshift);    //input bool
    stim_shiftReg_p -> stim_out(sig_out);          //output sc_bv

    LFSR_p = new LFSR("LFSR_p");
    LFSR_p -> clk(sig_clk);           //input bool
    LFSR_p -> rst(sig_rst);           //input bool
    LFSR_p -> out(sig_out);           //output sc_bv
    LFSR_p -> lshift(sig_lshift);     //< The missing lshift port bind.
  }
  ~TOP(){
    //free up memory
    delete LFSR_p;
    delete stim_shiftReg_p;
  }
};

TOP *top_p = NULL;

int sc_main(int argc, char* argv[])
{
  sc_set_time_resolution(1, SC_NS);
  top_p = new TOP("top_p");
  sc_start();
  return 0;
}

Update: You can still use the initializer list method to call constructors for SystemC objects.

From you code sample:

SC_MODULE(LFSR)
{
  shiftReg      *shiftReg_p;
  lfsr_feedback *lfsr_feedback_p;

  //define input
  sc_in<bool> clk;
  sc_in<bool> rst;
  sc_in<bool> lshift;

  //define output
  sc_out<sc_bv<8> > out;

  sc_signal<bool> rightin;

  SC_CTOR(LFSR):
    clk("clk")    //<< Added these lines
    , rst("rst")  //<< Added these lines
    , lshift("lshift")  //<< Added these lines
    , out("out")  //<< Added these lines
    , rightin("rightin")  //<< Added these lines
  {

These changes would make the error messages more meaningful rather than just printing port_3 is not bound.

Update 2:

The port in "rightin" in module is not bound in the module: LFSR (In lfsr.h)

SC_CTOR(LFSR)
{
    shiftReg_p = new shiftReg("shiftReg_p");
    shiftReg_p -> clk(clk);                //input bool
    shiftReg_p -> rst(rst);                //input bool
    shiftReg_p -> lshift(lshift);     //enable shift signal connection
    shiftReg_p -> out(out);        //output sc_bv
    shiftReg_p -> rightin(rightin); //< Missing statement.

    lfsr_feedback_p = new lfsr_feedback("lfsr_feedback_p");
    lfsr_feedback_p -> clk(clk);                  //input bool
    lfsr_feedback_p -> rst(rst);                  //input bool
    lfsr_feedback_p -> rightin(rightin);          //feedback signal
    lfsr_feedback_p -> out(out);                  //output sc_bv
}

Note: Kindly follow the changes mentioned in the previous update so as to get more meaningful error messages than just getting "port_3" is not bound.

Upvotes: 1

random
random

Reputation: 4038

1) Most likely you forgot to bind port "out" of LFSR module instance

2) You should always initialize all sc_objects with names, so you can get readable errors. For example in C++11 you can initialize members in-place

//define input
sc_in<bool> clk{"clk"};
sc_in<bool> rst{"rst"};
sc_in<bool> lshift{"lshift"};
//define output
sc_out<sc_bv<8> > out{"out"};

Upvotes: 0

Related Questions