void sim_endofcompile_callback() { // Init the RSP server init_jtag_server(RSP_SERVER_PORT); // Start the RSP server from here! }
void check_for_command(char *userdata) { vpiHandle systfref, args_iter, argh; struct t_vpi_value argval; struct vpi_cmd vpi; int nb; int loaded_words = 0; (void)userdata; // Get the command from TCP server if(!connfd) init_jtag_server(RSP_SERVER_PORT); nb = read(connfd, &vpi, sizeof(struct vpi_cmd)); if (((nb < 0) && (errno == EAGAIN)) || (nb == 0)) { // Nothing in the fifo this time, let's return return; } else { if (nb < 0) { // some sort of error perror("check_for_command"); exit(1); } } /************* vpi.cmd to VPI ******************************/ // Obtain a handle to the argument list systfref = vpi_handle(vpiSysTfCall, NULL); // Now call iterate with the vpiArgument parameter args_iter = vpi_iterate(vpiArgument, systfref); // get a handle on the variable passed to the function argh = vpi_scan(args_iter); // now store the command value back in the sim argval.format = vpiIntVal; // Now set the command value vpi_get_value(argh, &argval); argval.value.integer = (uint32_t)vpi.cmd; // And vpi_put_value() it back into the sim vpi_put_value(argh, &argval, NULL, vpiNoDelay); /************* vpi.length to VPI ******************************/ // now get a handle on the next object (memory array) argh = vpi_scan(args_iter); // now store the command value back in the sim argval.format = vpiIntVal; // Now set the command value vpi_get_value(argh, &argval); argval.value.integer = (uint32_t)vpi.length; // And vpi_put_value() it back into the sim vpi_put_value(argh, &argval, NULL, vpiNoDelay); /************* vpi.nb_bits to VPI ******************************/ // now get a handle on the next object (memory array) argh = vpi_scan(args_iter); // now store the command value back in the sim argval.format = vpiIntVal; // Now set the command value vpi_get_value(argh, &argval); argval.value.integer = (uint32_t)vpi.nb_bits; // And vpi_put_value() it back into the sim vpi_put_value(argh, &argval, NULL, vpiNoDelay); /*****************vpi.buffer_out to VPI ********/ // now get a handle on the next object (memory array) argh = vpi_scan(args_iter); vpiHandle array_word; // Loop to load the words while (loaded_words < vpi.length) { // now get a handle on the current word we want in the array that was passed to us array_word = vpi_handle_by_index(argh, loaded_words); if (array_word != NULL) { argval.value.integer = (uint32_t)vpi.buffer_out[loaded_words]; // And vpi_put_value() it back into the sim vpi_put_value(array_word, &argval, NULL, vpiNoDelay); } else return; loaded_words++; } /*******************************************/ // Cleanup and return vpi_free_object(args_iter); }