iverilog/ivtest/vpi/br_gh1041b.c

75 lines
1.7 KiB
C
Raw Normal View History

#include <vpi_user.h>
static void step(void);
static vpiHandle w;
static PLI_INT32 tick_cb(struct t_cb_data *cb)
{
static struct t_vpi_value val = { .format = vpiIntVal };
static int idx;
(void)cb;
++idx;
val.value.integer = idx & 1;
vpi_put_value(w, &val, NULL, vpiNoDelay);
step();
return 0;
}
/* Request a callback after a delay. */
static void step(void)
{
static struct t_vpi_time now = { .type = vpiSimTime, .low = 2 };
static struct t_cb_data cbd =
{ .reason = cbAfterDelay, .cb_rtn = tick_cb, .time = &now };
/* Callback after delay. */
vpi_register_cb(&cbd);
}
/* Callback function - simulation is starting. */
static PLI_INT32 start_cb(struct t_cb_data *cb)
{
static struct t_vpi_value val = { .format = vpiIntVal };
(void)cb;
w = vpi_handle_by_name("test.w", NULL);
if (!w)
vpi_printf("No handle!\n");
vpi_printf("Got handle for %s\n", vpi_get_str(vpiFullName, w));
val.value.integer = 0;
vpi_put_value(w, &val, NULL, vpiNoDelay);
step();
return 0;
}
/* VPI initialisation. */
static void start(void)
{
static struct t_vpi_time now = { .type = vpiSimTime };
static struct t_cb_data cbd = { .reason = cbStartOfSimulation,
.time = &now, .cb_rtn = start_cb };
/* At this point VPI objects do not exist,
* so request a callback once they do.
*/
vpi_register_cb(&cbd);
}
/* This is a table of registration functions. This table is the external
* symbol that the VVP simulator looks for when loading this .vpi module.
*/
void (*vlog_startup_routines[])(void) = {
start,
0
};