【发布时间】:2022-02-05 21:26:49
【问题描述】:
我正在尝试在 SystemC 中设计一个 LFSR 计数器,它应该看起来像这样:(click to see picture)
我认为lfsr.h 文件中的模块shiftreg.h 和lfsr-feedback.h 之间的连接有问题,但我无法弄清楚问题所在。
我在终端上运行时收到此错误消息:
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
main.cpp 文件如下所示:
#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;
}
这是lfsr.h 文件的样子:
#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;
}
};
这是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();
}
};
};
这是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();
}
};
};
这是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();
};
};
注意:我不确定 lfsr.h 中的端口 out。它是来自shiftReg.h 的sc_out<T>,也是LFSR.h 的输出形式。但是,同一个端口应该是lfsr_feedback.h 的输入。
【问题讨论】:
标签: systemc