From: Sebastien Bourdeauducq Date: Sun, 4 Mar 2012 20:27:02 +0000 (+0100) Subject: sim: compile VPI module X-Git-Tag: 24jan2021_ls180~2099^2~1003 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c0b0161ec9f99e41003f8073fd0de45297268e4b;p=litex.git sim: compile VPI module --- diff --git a/vpi/Makefile b/vpi/Makefile new file mode 100644 index 00000000..b939822c --- /dev/null +++ b/vpi/Makefile @@ -0,0 +1,16 @@ +CC=clang +OBJ=ipc.o main.o + +all: migensim.vpi + +%.o: %.c + $(CC) -fPIC -Wall -O2 -c -o $@ $< + +migensim.vpi: $(OBJ) + $(CC) -shared -o $@ $(OBJ) -lvpi + +clean: + rm -f $(OBJ) + rm -f migensim.vpi + +.PHONY: clean diff --git a/vpi/main.c b/vpi/main.c new file mode 100644 index 00000000..48923543 --- /dev/null +++ b/vpi/main.c @@ -0,0 +1,121 @@ +#include +#include +#include + +#include "ipc.h" + +struct migensim_softc { + struct ipc_softc *ipc; + int has_go; +}; + +static int h_go(void *user) +{ + struct migensim_softc *sc = (struct migensim_softc *)user; + + printf("GO\n"); + sc->has_go = 1; + + return 1; +} + +static int h_write(char *name, int nchunks, const unsigned char *chunks, void *user) +{ + int i; + + printf("WRITE: %s / nchunks: %d / ", name, nchunks); + for(i=0;ihas_go = 0; + while(!sc->has_go) { + if(!ipc_receive(sc->ipc)) + return 0; + } + return 1; +} + +static int connect_calltf(char *user) +{ + struct migensim_softc *sc = (struct migensim_softc *)user; + vpiHandle sys; + vpiHandle argv; + vpiHandle item; + s_vpi_value value; + + sys = vpi_handle(vpiSysTfCall, 0); + argv = vpi_iterate(vpiArgument, sys); + item = vpi_scan(argv); + value.format = vpiStringVal; + vpi_get_value(item, &value); + + sc->ipc = ipc_connect(value.value.str, h_go, h_write, h_read, sc); + if(sc->ipc == NULL) { + perror("ipc_connect"); + vpi_control(vpiFinish, 1); + return 0; + } + + if(!process_until_go(sc)) { + vpi_control(vpiFinish, 1); + return 0; + } + + return 0; +} + +static int tick_calltf(char *user) +{ + struct migensim_softc *sc = (struct migensim_softc *)user; + + if(!ipc_tick(sc->ipc)) { + perror("ipc_tick"); + vpi_control(vpiFinish, 1); + return 0; + } + if(!process_until_go(sc)) { + vpi_control(vpiFinish, 1); + return 0; + } + + return 0; +} + +static struct migensim_softc sc; + +static void simple_register(const char *tfname, PLI_INT32 (*calltf)(PLI_BYTE8*)) +{ + s_vpi_systf_data tf_data; + + tf_data.type = vpiSysTask; + tf_data.tfname = tfname; + tf_data.calltf = calltf; + tf_data.compiletf = NULL; + tf_data.sizetf = 0; + tf_data.user_data = (void *)≻ + vpi_register_systf(&tf_data); +} + +static void migensim_register() +{ + simple_register("$migensim_connect", connect_calltf); + simple_register("$migensim_tick", tick_calltf); +} + +void (*vlog_startup_routines[])() = { + migensim_register, + 0 +};