Aug. 7, 2014: Chroot Vivado on Debian

Contents

Aug. 7, 2014: Chroot Vivado on Debian

Running Xilinx’ Vivado tools on Debian has always been a bit of a headache. It’s not one of the chosen Linux distributions (RHEL, CentOS, SUSE; see, for example, the Vivado 2014.1 release notes.

In the past month, upgrades to Debian have broken Vivado completely. Synthesis (including out-of-context design runs) now fail with an unhelpful error message.

Here, I’ll describe how to install Debian in a CentOS chroot environment. These notes are an after-the-fact reconstruction, so they are definitely incomplete.

The Problem

Synthesis fails silently. To see what’s really going on, it’s necessary to run a synthesis command in the foreground:

$ cd ~/winterland/iceboard/icecore/rtl/projects/dfmux_mgk7mb_mgmezz04/dfmux_mgk7mb_mgmezz04.runs/adcdac_fifo_synth_1
$ . /opt/xilinx/Vivado/2014.2/settings64.sh
$ vivado -mode tcl
****** Vivado v2014.2_AR61041 (64-bit)
  **** SW Build 932637 on Wed Jun 11 13:08:52 MDT 2014
  **** IP Build 924643 on Fri May 30 09:20:16 MDT 2014
    ** Copyright 1986-2014 Xilinx, Inc. All Rights Reserved.

vivado% source adcdac_fifo.tcl
[...]
Abnormal program termination (11)
Please check '/rust/home/gsmecher/winterland/iceboard/icecore/rtl/projects/dfmux_mgk7mb_mgmezz04/dfmux_mgk7mb_mgmezz04.runs/adcdac_fifo_synth_1/hs_err_pid6205.log' for details

This log contains the following trace:

#
# An unexpected error has occurred (11)
#
Stack:
/lib/x86_64-linux-gnu/libc.so.6(+0x35480) [0x7f39fe95b480]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x111f8) [0x7f39fe4191f8]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/librdi_synth.so(HARTNDb::waitForLoadPart()+0x49) [0x7f39dfa21899]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/librdi_synth.so(+0x9e38bf) [0x7f39dfa748bf]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/librdi_synth.so(+0x9dee75) [0x7f39dfa6fe75]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x331f5) [0x7f39fa84a1f5]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x76bbe) [0x7f39fa88dbbe]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(Tcl_ExprObj+0xfb) [0x7f39fa89533b]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(Tcl_ExprBooleanObj+0x16) [0x7f39fa84b0c6]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x3eae8) [0x7f39fa855ae8]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x331f5) [0x7f39fa84a1f5]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x76bbe) [0x7f39fa88dbbe]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x7e767) [0x7f39fa895767]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(TclEvalObjEx+0x77) [0x7f39fa84c327]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x3eb6a) [0x7f39fa855b6a]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x331f5) [0x7f39fa84a1f5]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x76bbe) [0x7f39fa88dbbe]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x7e767) [0x7f39fa895767]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(TclEvalObjEx+0x77) [0x7f39fa84c327]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/librdi_commontasks.so(+0x282477) [0x7f39f6e00477]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x331f5) [0x7f39fa84a1f5]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x76bbe) [0x7f39fa88dbbe]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(Tcl_ExprObj+0xfb) [0x7f39fa89533b]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(Tcl_ExprBooleanObj+0x16) [0x7f39fa84b0c6]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x3eae8) [0x7f39fa855ae8]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x331f5) [0x7f39fa84a1f5]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x34d6b) [0x7f39fa84bd6b]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(Tcl_EvalEx+0x16) [0x7f39fa84c276]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(Tcl_FSEvalFileEx+0x1d2) [0x7f39fa8b0d02]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/librdi_commontasks.so(+0x298fd7) [0x7f39f6e16fd7]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/librdi_common.so(+0x49679b) [0x7f39ff88979b]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x331f5) [0x7f39fa84a1f5]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x76bbe) [0x7f39fa88dbbe]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x7e767) [0x7f39fa895767]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(TclEvalObjEx+0x77) [0x7f39fa84c327]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0xb740f) [0x7f39fa8ce40f]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x331f5) [0x7f39fa84a1f5]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x76bbe) [0x7f39fa88dbbe]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x7e767) [0x7f39fa895767]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(TclEvalObjEx+0x77) [0x7f39fa84c327]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/librdi_commontasks.so(+0x282514) [0x7f39f6e00514]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x331f5) [0x7f39fa84a1f5]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x34d6b) [0x7f39fa84bd6b]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0xad531) [0x7f39fa8c4531]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x3491c) [0x7f39fa84b91c]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(Tcl_EvalEx+0x16) [0x7f39fa84c276]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(Tcl_FSEvalFileEx+0x1d2) [0x7f39fa8b0d02]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/librdi_commontasks.so(+0x298fd7) [0x7f39f6e16fd7]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/librdi_common.so(+0x49679b) [0x7f39ff88979b]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x331f5) [0x7f39fa84a1f5]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(Tcl_EvalObjv+0x32) [0x7f39fa84a7e2]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(TclEvalObjEx+0x322) [0x7f39fa84c5d2]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/librdi_common.so(hdi::tcltasks::task_manager::eval_in_tcl(Tcl_Interp*, Tcl_Obj*, char const*, bool)+0x885) [0x7f39ff88bd55]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/librdi_designutils.so(HRTInvoker::inProcessLaunch(HDGUIStatus&)+0x1a6) [0x7f39ee8d7256]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/librdi_designutils.so(HRTInvoker::launch(HDGUIStatus&)+0x50d) [0x7f39ee8d80ad]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/librdi_vivadotasks.so(+0x1c4eef) [0x7f39dadafeef]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/librdi_vivadotasks.so(+0x1cc7d0) [0x7f39dadb77d0]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/librdi_common.so(+0x49679b) [0x7f39ff88979b]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x331f5) [0x7f39fa84a1f5]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x34d6b) [0x7f39fa84bd6b]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(Tcl_EvalEx+0x16) [0x7f39fa84c276]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(Tcl_FSEvalFileEx+0x1d2) [0x7f39fa8b0d02]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/librdi_commontasks.so(+0x298fd7) [0x7f39f6e16fd7]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/librdi_common.so(+0x49679b) [0x7f39ff88979b]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x331f5) [0x7f39fa84a1f5]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x76bbe) [0x7f39fa88dbbe]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(+0x7e767) [0x7f39fa895767]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(TclEvalObjEx+0x77) [0x7f39fa84c327]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(Tcl_RecordAndEvalObj+0x184) [0x7f39fa89b1c4]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/librdi_commontasks.so(+0x2dea99) [0x7f39f6e5ca99]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/libtcl8.5.so(Tcl_Main+0x634) [0x7f39fa8b75d4]
/opt/xilinx/Vivado/2014.2/lib/lnx64.o/librdi_common.so(+0x4c50c9) [0x7f39ff8b80c9]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x80a4) [0x7f39fe4100a4]
/lib/x86_64-linux-gnu/libc.so.6(clone+0x6d) [0x7f39fea0c04d]

Normally, when Vivado isn’t quite portable, someone smart ferrets out a solution (example). In this case, I haven’t been able to find anything except another complaint about the same problem, so we’re on our own.

Since this is an ongoing headache, instead of trying to work around a single problem, we’ll try to figure out something that’s more stable long-term. A virtual machine (vmware, VirtualBox) is unsuitable, since we don’t want to incur the memory and CPU overhead.

Installing the Jail

We use “rinse” to generate a base image:

$ sudo apt-get install rinse
$ sudo rinse --distribution centos-6 --directory /opt/centos amd64

Then, we bind-mount some filesystems on the new image:

$ sudo mount --bind /proc /opt/centos/proc
$ sudo mount --bind /home /opt/centos/home
$ sudo mount --bind /dev /opt/centos/dev

Installing Vivado

We now change into the jail and install some necessary packages:

$ sudo chroot /opt/centos
bash-4.1# yum install tar gzip

A few extra steps:

  • In the jail, create a user (gsmecher) and modify the UID (/etc/passwd) and GID (/etc/group) to match those found in the host Debian. In my case, Debian starts at 1000 and CentOS starts at 500. If you don’t do this, your permissions will be wonky.
  • Create /opt/xilinx and set the appropriate permissions. In my case, I give my primary account full read/write access to that directory. (I’m the only active account on this PC.)

We should now be able to install Vivado:

bash-4.1# su gsmecher
bash-4.1$ /home/gsmecher/Downloads/Xilinx_Vivado_SDK_2014.2_0612_1_Lin64.bin

Contents