pyxsi icon indicating copy to clipboard operation
pyxsi copied to clipboard

(XSI runtime issue) Vivado 2021.2 crashes when more than one distinct simulator snapshot is used.

Open gsmecher opened this issue 2 years ago • 0 comments

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

gsmecher avatar Apr 27 '22 00:04 gsmecher