Files
iverilog/ivtest/vpi/force.c
T
Stephen Williams cea237b407 Add ivtest to the iverilog source tree
By adding ivtest to the iverilog source tree, it is easier to keep
the regression test synchronized with the source that is being tested.
This should be especially helpful for PRs that add a new feature, and
have a matching ivtest PR with the regression test for that feature.
2022-01-15 10:18:50 -08:00

134 lines
3.2 KiB
C

# include <vpi_user.h>
# include <assert.h>
static PLI_INT32 peek_calltf(PLI_BYTE8 *xx)
{
s_vpi_value val;
vpiHandle sys = vpi_handle(vpiSysTfCall, 0);
vpiHandle argv = vpi_iterate(vpiArgument, sys);
vpiHandle arg;
(void)xx;
arg = vpi_scan(argv);
vpi_free_object(argv); /* Free iterator since we did not scan to NULL. */
assert(arg != 0);
val.value.str = "";
val.format = vpiBinStrVal;
vpi_get_value(arg, &val);
vpi_printf("peek : %s\n", val.value.str);
return 0;
}
static int count = 0;
static PLI_INT32 poke_calltf(PLI_BYTE8 *xx)
{
s_vpi_value val;
vpiHandle sys = vpi_handle(vpiSysTfCall, 0);
vpiHandle argv = vpi_iterate(vpiArgument, sys);
vpiHandle arg;
(void)xx;
arg = vpi_scan(argv);
vpi_free_object(argv); /* Free iterator since we did not scan to NULL. */
assert(arg != 0);
val.value.integer = count++;
val.format = vpiIntVal;
vpi_put_value(arg, &val, 0, vpiNoDelay);
vpi_printf("poke : %d\n", val.value.integer);
return 0;
}
static PLI_INT32 force_calltf(PLI_BYTE8 *xx)
{
s_vpi_value val;
vpiHandle sys = vpi_handle(vpiSysTfCall, 0);
vpiHandle argv = vpi_iterate(vpiArgument, sys);
vpiHandle arg;
(void)xx;
arg = vpi_scan(argv);
vpi_free_object(argv); /* Free iterator since we did not scan to NULL. */
assert(arg != 0);
val.value.str = "10";
val.format = vpiBinStrVal;
vpi_put_value(arg, &val, 0, vpiForceFlag);
vpi_printf("force : %s\n", val.value.str);
return 0;
}
static PLI_INT32 release_calltf(PLI_BYTE8 *xx)
{
s_vpi_value val;
vpiHandle sys = vpi_handle(vpiSysTfCall, 0);
vpiHandle argv = vpi_iterate(vpiArgument, sys);
vpiHandle arg;
(void)xx;
arg = vpi_scan(argv);
vpi_free_object(argv); /* Free iterator since we did not scan to NULL. */
assert(arg != 0);
val.format = vpiBinStrVal;
vpi_put_value(arg, &val, 0, vpiReleaseFlag);
vpi_printf("release : %s\n", val.value.str);
return 0;
}
void peekpoke_register(void)
{
s_vpi_systf_data tf_data;
tf_data.type = vpiSysTask;
tf_data.tfname = "$peek";
tf_data.calltf = peek_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
vpi_register_systf(&tf_data);
tf_data.type = vpiSysTask;
tf_data.tfname = "$poke";
tf_data.calltf = poke_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
vpi_register_systf(&tf_data);
tf_data.type = vpiSysTask;
tf_data.tfname = "$force";
tf_data.calltf = force_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
vpi_register_systf(&tf_data);
tf_data.type = vpiSysTask;
tf_data.tfname = "$release";
tf_data.calltf = release_calltf;
tf_data.compiletf = 0;
tf_data.sizetf = 0;
vpi_register_systf(&tf_data);
}
/*
* This is a table of register functions. This table is the external
* symbol that the simulator looks for when loading this .vpi module.
*/
void (*vlog_startup_routines[])(void) = {
peekpoke_register,
0
};