SystemC灵敏度列表行为/从主程序驱动引脚

时间:2013-06-24 06:39:14

标签: systemc

我正在编写一个用于模拟和逻辑的简单System C程序。敏感度列表有a,b作为其成员。我想在主程序中的这些行上驱动0,1,根据灵敏度列表的定义,我和模块应该运行并给我新的值。

#include<systemc.h>

SC_MODULE(digital_logic)
{
  sc_in<sc_logic> a,b;
  sc_out<sc_logic> c;

  SC_CTOR(digital_logic)
  {
    SC_METHOD (process);
    sensitive << a << b;
  }

  void process()
  {
    cout << "PRINT FROM MODULE\n";
    c = a.read() & b.read();
    cout << a.read() << b.read() << c << endl;
  }

};

int sc_main(int argc , char* argv[])
{
  sc_signal<sc_logic> a_in ,b_in , c_out , c_out2;
  a_in  = SC_LOGIC_1 , b_in = SC_LOGIC_1;

  digital_logic digital_and1("digital_and1");
  digital_and1 (a_in , b_in , c_out);

  sc_start(200,SC_NS);
  cout << "PRINT FROM SC_MAIN\n";

  a_in = SC_LOGIC_1;
  cout << c_out << endl;
  b_in = SC_LOGIC_0;
  cout << c_out << endl;
  b_in = SC_LOGIC_1;
  cout << c_out << endl;

  return 0;
}

我预计,由于灵敏度列表上的信号发生了变化,输出也会发生变化,但这是o / p。如何更改主程序中的信号,以便在不编写单独的测试平台的情况下模拟和门。

OUTPUT
PRINT FROM MODULE
11X
PRINT FROM SC_MAIN
1
1
1

1 个答案:

答案 0 :(得分:1)

您必须将sc_start()放在要继续模拟的点之间。喜欢以下

a_in = SC_LOGIC_1;
b_in = SC_LOGIC_0;
sc_start(1,SC_NS);     // Add this
cout << c_out << endl;
b_in = SC_LOGIC_1;
sc_start(1,SC_NS);     // Add this
cout << c_out << endl;

在原始代码中,您只需将新值顺序分配给a_inb_in。它会更改a_inb_in的当前值,但不会影响c_out的当前值,因为您的程序不会进入SystemC模拟内核来模拟更改。因此,c_outa_in敏感度列表不会更改b_in的下一个值。