Kernel de simulación de SystemC

0

Utilizando el siguiente código del tutorial de doulos en SystemC

#include "systemc.h"
#include 
SC_MODULE(mon)
{
    sc_in<bool> A,B,F;
    sc_in<bool> Clk;

  void monitor()
  {
    cout << setw(10) << "Time";
    cout << setw(2) << "A" ;
    cout << setw(2) << "B";
    cout << setw(2) << "F" << endl;
    while (true)
    {
      cout << setw(10) << sc_time_stamp();
      cout << setw(2) << A.read();
      cout << setw(2) << B.read();
      cout << setw(2) << F.read() << endl;
      wait();    // wait for 1 clock cycle
    }
  }

  SC_CTOR(mon)
  {
    SC_THREAD(monitor);
    sensitive << Clk.pos();
  }
};

y una declaración de reloj sc_clock TestClk("TestClock", 10, SC_NS,0.5); en sc_main La salida contiene resultados del tiempo 0
pero cuando el borde positivo del reloj se retrasa 1 ns (es decir, sc_clock TestClk("TestClock", 10, SC_NS,0.5, 1, SC_NS); ), la salida comienza desde el momento 1 ns.
Esto es lógico, ya que el primer desencadenante del proceso se retrasa hasta 1 ns.
La pregunta es ¡no se supone que el kernel de simulación ejecute todos los procesos una vez en el tiempo cero! De acuerdo con esto, los resultados deben comenzar desde el momento 0 en ambos casos. ¿que me estoy perdiendo aqui?

    
pregunta Abdo Saied Anwar

1 respuesta

1

Acabo de compilar y ejecutar el siguiente código (agregué un sc_main a tu ejemplo) contra el Sistema 2.3.1:

#include <iostream>
#include <iomanip>
#include "systemc.h"

using namespace std;

SC_MODULE(mon)
{
    sc_in<bool> A,B,F;
    sc_in<bool> Clk;

  void monitor()
  {
    cout << setw(10) << "Time";
    cout << setw(2) << "A" ;
    cout << setw(2) << "B";
    cout << setw(2) << "F" << endl;
    while (true)
    {
      cout << setw(10) << sc_time_stamp();
      cout << setw(2) << A.read();
      cout << setw(2) << B.read();
      cout << setw(2) << F.read() << endl;
      wait();    // wait for 1 clock cycle
    }
  }

  SC_CTOR(mon)
  {
    SC_THREAD(monitor);
    sensitive << Clk.pos();
  }
};

int sc_main(int argc, char **argv) {
    mon m("m");

    sc_signal<bool> A,B,F;
    sc_clock TestClk("TestClock", 10, SC_NS, 0.5, 1, SC_NS);

    m.A(A);
    m.B(B);
    m.F(F);
    m.Clk(TestClk);

    sc_start(50, SC_NS);

    return 0;
}

y vi esta salida:

    SystemC 2.3.1-Accellera --- Nov 29 2014 15:29:06
    Copyright (c) 1996-2014 by all Contributors,
    ALL RIGHTS RESERVED
  Time A B F
   0 s 0 0 0
  1 ns 0 0 0
 11 ns 0 0 0
 21 ns 0 0 0
 31 ns 0 0 0
 41 ns 0 0 0

Hay salida en el tiempo 0, como esperabas. No estoy seguro de por qué no estás viendo eso. Tal vez hay un error tipográfico en su código. Tal vez intente nuevamente con el código de ejemplo que incluí arriba?

    
respondido por el DarrylLawson

Lea otras preguntas en las etiquetas