pyxsi
pyxsi copied to clipboard
(XSI runtime issue) Vivado 2021.2 crashes when more than one distinct simulator snapshot is used.
This issue is a bug in the underlying XSI implementation (in at least Vivado 2021.2). It's being tracked here to inform pyxsi users.
A testbench that instantiates multiple simulator snapshots with different RTL:
int main(int argc, char **argv)
{
s_xsi_setup_info info;
memset(&info, 0, sizeof(info));
/* First simulator kernel - no problem */
auto xsi1 = Xsi::Loader("xsim.dir/counter/xsimk.so", "librdi_simulator_kernel.so");
xsi1.open(&info);
xsi1.close();
/* Second simulator kernel - also no problem. Note that we're using the
* same xsimk.so, so any relocation may follow a degenerate code path. */
auto xsi2 = Xsi::Loader("xsim.dir/counter/xsimk.so", "librdi_simulator_kernel.so");
xsi2.open(&info);
xsi2.close();
/* Third simulator kernel - note that the RTL design we're using here
* is different. The simulator segfaults. */
auto xsi3 = Xsi::Loader("xsim.dir/widget/xsimk.so", "librdi_simulator_kernel.so");
xsi3.open(&info);
xsi3.close();
}
...will crash as follows:
./sim
munmap_chunk(): invalid pointer
./run.sh: line 19: 3269298 Aborted ./sim
There appears to be a problem in the underlying relocation code. The stack trace looks as follows:
$ gdb ./sim
Reading symbols from ./sim...
(gdb) run
Starting program: /home/gsmecher/xsi/sim
munmap_chunk(): invalid pointer
Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:49
49 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) backtrace
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:49
#1 0x00007ffff7bb5546 in __GI_abort () at abort.c:79
#2 0x00007ffff7c0ceb8 in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7ffff7d2aa78 "%s\n")
at ../sysdeps/posix/libc_fatal.c:155
#3 0x00007ffff7c1491a in malloc_printerr (str=str@entry=0x7ffff7d2ca20 "munmap_chunk(): invalid pointer") at malloc.c:5628
#4 0x00007ffff7c14d6c in munmap_chunk (p=<optimized out>) at malloc.c:2995
#5 0x00007ffff7c199e3 in __GI___libc_free (mem=<optimized out>) at malloc.c:3302
#6 0x00007ffff753a160 in iki_vhdl_file_close () from /opt/xilinx/Vivado/2021.2/lib/lnx64.o/librdi_simulator_kernel.so
#7 0x00007ffff753a1cc in iki_vhdl_file_open () from /opt/xilinx/Vivado/2021.2/lib/lnx64.o/librdi_simulator_kernel.so
#8 0x00007ffff75563fc in iki_vhdl_file_variable_register ()
from /opt/xilinx/Vivado/2021.2/lib/lnx64.o/librdi_simulator_kernel.so
#9 0x00007ffff7fc0b17 in relocate () from xsim.dir/counter/xsimk.so
#10 0x00007ffff75c2acc in ISIMK::Kernel::initialize() ()
from /opt/xilinx/Vivado/2021.2/lib/lnx64.o/librdi_simulator_kernel.so
#11 0x00007ffff75c2d58 in ISIMK::Kernel::Kernel(char const*, char const*, void (*)(char*), void (*)(char*), void (*)(char*), unsigned int, ISIMK::Host*) () from /opt/xilinx/Vivado/2021.2/lib/lnx64.o/librdi_simulator_kernel.so
#12 0x00007ffff75f1025 in ISIMK::XSIHost::XSIHost(char const*, char const*, void*, void*, void*, void*, unsigned int, void*, int, char const**) () from /opt/xilinx/Vivado/2021.2/lib/lnx64.o/librdi_simulator_kernel.so
#13 0x00007ffff7467d73 in iki_create_ccp_design () from /opt/xilinx/Vivado/2021.2/lib/lnx64.o/librdi_simulator_kernel.so
#14 0x00007ffff7467ee3 in iki_create_design () from /opt/xilinx/Vivado/2021.2/lib/lnx64.o/librdi_simulator_kernel.so
#15 0x00007ffff7045335 in xsi_open () from xsim.dir/widget/xsimk.so
#16 0x0000555555556b2d in Xsi::Loader::open (this=this@entry=0x5555555a2410, setup_info=setup_info@entry=0x7fffffffdcc0)
at xsi_loader.cpp:42
#17 0x000055555555650b in main (argc=<optimized out>, argv=<optimized out>) at testbench.cpp:30