Reputation: 53
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
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
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
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