OpenCores
URL https://opencores.org/ocsvn/spdif_transmitter/spdif_transmitter/trunk

Subversion Repositories spdif_transmitter

[/] [spdif_transmitter/] [trunk/] [testbench/] [sc_vpi_clock.h] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 ultra_embe
#ifndef __SC_VPI_CLOCK_H__
2
#define __SC_VPI_CLOCK_H__
3
 
4
#include <systemc.h>
5
#include <vpi_user.h>
6
 
7
 
8
static int sc_vpi_clock_after_delay(p_cb_data cb_data);
9
 
10
class sc_vpi_clock
11
{
12
public:
13
 
14
    sc_signal <bool> m_clk;
15
    int              m_low_ns;
16
    int              m_high_ns;
17
 
18
    sc_module_name   m_name;
19
 
20
    vpiHandle        m_vpi_handle;
21
 
22
    sc_vpi_clock(sc_module_name name) : m_clk(name), m_name(name)
23
    {
24
        m_low_ns  = 5;
25
        m_high_ns = 5;
26
 
27
        m_vpi_handle = vpi_handle_by_name((const char*)name, NULL);
28
        sc_assert(m_vpi_handle != NULL);
29
    }
30
 
31
    void start(void) { after_delay(); }
32
 
33
    int after_delay(void)
34
    {
35
        bool clk_next = !m_clk.read();
36
        s_vpi_time  vpi_time_s;
37
        s_cb_data   cb_data_s;
38
 
39
        vpi_time_s.type = vpiSimTime;
40
        vpi_time_s.high = 0;
41
        vpi_time_s.low  = 0;
42
 
43
        s_vpi_value  value_s;
44
        value_s.format = vpiIntVal;
45
        value_s.value.integer = clk_next;
46
        vpi_put_value(m_vpi_handle, &value_s, &vpi_time_s, vpiInertialDelay);
47
 
48
        // Setup wait time
49
        vpi_time_s.high = 0;
50
        vpi_time_s.low  = clk_next ? m_high_ns : m_low_ns;
51
        vpi_time_s.type = vpiSimTime;
52
 
53
        m_clk.write(clk_next);
54
 
55
        // Attach value change callbacks for outputs
56
        cb_data_s.user_data = (PLI_BYTE8*)this;
57
        cb_data_s.reason    = cbAfterDelay;
58
        cb_data_s.cb_rtn    = sc_vpi_clock_after_delay;
59
        cb_data_s.time      = &vpi_time_s;
60
        cb_data_s.value     = NULL;
61
        vpi_register_cb(&cb_data_s);
62
    }
63
};
64
 
65
static int sc_vpi_clock_after_delay(p_cb_data cb_data)
66
{
67
    sc_vpi_clock *p = (sc_vpi_clock*)cb_data->user_data;
68
    return p->after_delay();
69
}
70
 
71
 
72
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.