1

Can I retrieve the clock period through sc_port?

The following code doesn't work. I'd like to call method period() defined in sc_clock.

sc_in_clk clk;

*clk.get_interface()->period();
ans
  • 378
  • 1
  • 5
  • 18
Han
  • 625
  • 2
  • 7
  • 25

1 Answers1

3

You could use dynamic_cast<> to cast the sc_interface returned by get_interface() as an sc_clock:

#include <iostream>
#include <systemc>

using namespace std;
using namespace sc_core;

SC_MODULE(A) {
    sc_in_clk clk;

    SC_CTOR(A) {}

    void start_of_simulation() {
        sc_clock *channel = dynamic_cast<sc_clock *>(clk.get_interface());
        cout << name() << ": period is "
             << (channel ? channel->period() : SC_ZERO_TIME) << endl;
    }
};

int sc_main(int argc, char *argv[]) {
    A a1("a1");
    A a2("a2");

    sc_clock clk("clk", 3.0, SC_NS);
    sc_signal<bool> fake_clk("fake_clk");

    a1.clk(clk);
    a2.clk(fake_clk);

    sc_start(10, SC_NS);

    return EXIT_SUCCESS;
}

This works because sc_clock is a subclass of sc_interface.

If dynamic_cast<> succeeds, then a valid sc_clock pointer is returned. If it fails, NULL is returned.

DarrylLawson
  • 732
  • 3
  • 9