端口未绑定SystemC(E112)

时间:2019-10-10 03:03:22

标签: systemc

我试图通过存储控制器(实现接口simple_mem_interface)实现与存储元素(从属)对话的生产者(主)。 注意:随附的代码未完全提及某些功能的详细信息和include语句。

搜索代码中的错误。 添加调试工具以在Write Enable Port中查找故障。

binding.cpp

int sc_main(int argc, char* argv[])
{

sc_signal<unsigned int> d_out,d_in,address_d;
sc_signal<bool> wen, ren, ack;

sc_clock ClkFast("ClkFast", 100, SC_NS);
sc_clock ClkSlow("ClkSlow", 50, SC_NS);

Memory_Controller Controller1 ("Controller");
d_out = Controller1.data_mem_read;
ren.write(Controller1.REN);
ack.write(Controller1.ack);
d_in.write(Controller1.data_write);
address_d.write(Controller1.address);
wen.write(Controller1.WEN);


producer P1("Producer");
P1.out(Controller1);
P1.Clk(ClkFast);

Memory_module MEM("Memory");
MEM.Wen(wen);
MEM.Ren(ren);
MEM.ack(ack);
MEM.Clock(ClkSlow);
MEM.data_in(d_in);
MEM.data_out(d_out);
MEM.address(address_d);

sc_start(5000, SC_NS);

return 0;

Memory_controller.h

#define MEM_SIZE 100
#include <interface_func.h>
class Memory_Controller :  public sc_module, public simple_mem_if
{
public:
// Ports
sc_in <unsigned int> data_mem_read{ "Data_Read_from_Memory" };
sc_out<bool> REN { "Read_Enable" };
sc_out<bool> WEN { "Write_Enable" };
sc_out <bool> ack{ "ACK_Bool" };
sc_out<unsigned int> address{ "Memory_Address" }, data_write{ 
"Data_Written_to_Memory" };

// constructor
Memory_Controller(sc_module_name nm) : sc_module(nm)
{ // Creating a 2 dimentional array holding adresses and data
    WEN.write(false);
    REN.write(false);
    ack.write(false);
}
~Memory_Controller() //destructor
{

}

bool Write(unsigned int address_i, unsigned int datum)        // blocking write
{
    WEN.write(true);
    REN.write(false);
    data_write.write(datum);
    address.write(address_i);
    if (ack == true)
        return true;
    else
        return false;
}
bool Read(unsigned int address_i, unsigned int& datum_i)        // blocking read
{
    WEN.write(false);
    REN.write(true);
    datum_i=data_mem_read;
    address.write(address_i);
    if (ack == true)
        return true;
    else
        return false;
}

void register_port(sc_port_base& port, const char* if_typename)
{
    cout << "binding    " << port.name() << " to "
        << "interface: " << if_typename << endl;
}
};

Memory.h

#define MEM_SIZE 100
#include "interface_func.h"
class Memory_module : public sc_module
{
public:
sc_in<bool> Wen,Ren;
sc_in <unsigned int> address, data_in ;
sc_in<bool> Clock;
sc_out <unsigned int> data_out;
sc_out <bool> ack;

bool fileinput = false;
ifstream myfile;
unsigned int item [MEM_SIZE];
Memory_module()
{
}



void Write()        // blocking write
{
    while (true)
    {
        wait();
        if (Wen==true)
        {   
            if (address >= MEM_SIZE || address < 0)
            {
                ack=false;
            }
            else
            {
                item[address]=data_in;
                ack=true;
            }
        }
    }
}

void Read()        // blocking read
{
    while (true)
    {
        wait();
        if (Ren)
        {
            if (address >= MEM_SIZE || address < 0)
                ack=false;
            else
            {
                data_out.write(item[address]);
                ack=true;
            }


        }
    }

}

SC_CTOR(Memory_module)
{
    SC_THREAD(Read);
    sensitive << Clock.pos();
    SC_THREAD(Write);
    sensitive << Clock.pos();
}
};

interface_func.h

class simple_mem_if : virtual public sc_interface
{
public:
virtual bool Write(unsigned int addr, unsigned int data) = 0;
virtual bool Read(unsigned int addr, unsigned int& data) = 0;
};

调试SystemC Bind.cpp代码后,会出现以下错误: (E112)获取接口失败:未绑定端口:端口'Controller.Write_Enable'(sc_out)

1 个答案:

答案 0 :(得分:2)

您无法在Memory_Controller构造函数中驱动未连接的端口。如果要在启动过程中显式驱动这些端口,请将这些调用移至start_of_simulation回调中:

Memory_Controller(sc_module_name nm) : sc_module(nm)
{}

void start_of_simulation()
{
    WEN.write(false);
    REN.write(false);
    ack.write(false);
}