# How to construct NVDLA virtual platform?
## Target
Construct NVDLA virtual platform and run demo image on ubuntu 16.04.
## Step-by-step instructions
Prepare an empty directory, ${PROJECT_PATH}, for this construction.
Make sure **cpp**, **gcc**, and **g++** are available for preliminary compilation. Use the following commands to confirm their existence.
```
$ cpp --version
$ gcc --version
$ g++ --version
```
### 1. Download the virtual platform simulator and install dependencies
```
$ pushd ${PROJECT_PATH}
$ git clone https://github.com/nvdla/vp.git
$ cd vp
$ git submodule update --init --recursive
$ sudo apt-get update
$ sudo apt-get install g++ cmake libboost-dev python-dev libglib2.0-dev libpixman-1-dev liblua5.2-dev swig libcap-dev libattr1-dev
$ popd
```
### 2. Install gcc 4.9.3 and some additional libraries
```
$ pushd ${PROJECT_PATH}
$ wget https://ftp.gnu.org/gnu/gcc/gcc-4.9.3/gcc-4.9.3.tar.gz
$ tar xvzf gcc-4.9.3.tar.gz
$ sudo apt-get install libgmp-dev libmpfr-dev libmpc-dev libc6-dev
$ pushd gcc-4.9.3
$ ./contrib/download_prerequisites
$ popd
$ mkdir -p temp_dir
$ pushd temp_dir
$ ../gcc-4.9.3/configure --prefix=${PROJECT_PATH}/gcc-4.9.3 --enable-languages=c,c++,fortran,go --disable-multilib
$ make; make install
$ popd
$ rm -rf temp_dir
$ rm -f gcc-4.9.3.tar.gz
$ popd
```
- Note: If "bootstrap comparison failure" happens, try to clean up the ${PROJECT_PATH}/gcc-4.9.3 and ${PROJECT_PATH}/temp_dir directories and install gcc 4.9.3 again.
### 3. Install SystemC-2.3.0a
```
$ pushd ${PROJECT_PATH}
$ wget -O systemc-2.3.0a.tar.gz
$ http://www.accellera.org/images/downloads/standards/systemc/systemc-2.3.0a.tar.gz
$ tar -xzvf systemc-2.3.0a.tar.gz
$ pushd systemc-2.3.0a
$ mkdir -p temp_dir
$ pushd temp_dir
$ ../configure --prefix=${PROJECT_PATH}/systemc-2.3.0a/
$ make
$ sudo make install
$ popd
$ rm -rf temp_dir
$ popd
$ rm -f systemc-2.3.0a.tar.gz
$ popd
```
### 4. Install Perl packages required
Install YAML-1.24
```
$ pushd ${PROJECT_PATH}
$ wget -O YAML-1.24.tar.gz
$ http://search.cpan.org/CPAN/authors/id/T/TI/TINITA/YAML-1.24.tar.gz
$ tar -xzvf YAML-1.24.tar.gz
$ cd YAML-1.24
$ perl Makefile.PL
$ make
$ sudo make install
$ popd
```
Install IO-Tee-0.65
```
$ pushd ${PROJECT_PATH}
$ wget -O IO-Tee-0.65.tar.gz
$ http://search.cpan.org/CPAN/authors/id/N/NE/NEILB/IO-Tee-0.65.tar.gz
$ tar -xzvf IO-Tee-0.65.tar.gz
$ cd IO-Tee-0.65
$ perl Makefile.PL
$ make
$ sudo make install
$ popd
```
Clean up
```
$ pushd ${PROJECT_PATH}
$ rm -f YAML-1.24.tar.gz
$ rm -f IO-Tee-0.65.tar.gz
$ popd
```
### 5. Build NVDLA C-model
```
$ pushd ${PROJECT_PATH}
$ sudo rm -rf hw
$ git clone https://github.com/nvdla/hw.git
$ popd
```
Modify Makefile to use correct tool version
```
$ pushd ${PROJECT_PATH}/hw
$ sed -i 's/home\/utils\/gcc/${PROJECT_PATH}\/gcc-4.9.3/g' Makefile
$ sed -i 's/home\/utils\/perl-5.8.8/usr/g' Makefile
$ sed -i 's/home\/utils\/java\/jdk1.8.0_131/usr/g' Makefile
$ sed -i 's/usr\/local\/systemc-2.3.0/${PROJECT_PATH}\/systemc-2.3.0a/g Makefile
$ popd
```
Build NVDLA C-model
```
$ pushd ${PROJECT_PATH}/hw
$ sudo make
$ sudo tools/bin/tmake -build cmod_top
$ popd
```
- Reference settings for the C-model build-up
```
Enter project names: nv_small
Enter c pre-processor path: ${PROJECT_PATH}/gcc-4.9.3/bin/cpp
g++ path: ${PROJECT_PATH}/gcc-4.9.3/bin/g++
perl path: /usr/bin/perl
java path: /usr/bin/java
systemc path: ${PROJECT_PATH}/systemc-2.3.0a/
verilator path: "\r"
clang path: "\r"
```
### 6. Build and install the virtual platform simulator
Workaround the template<class> class std::auto_ptr deprecation warning issue.
```
$ pushd ${PROJECT_PATH}/vp
$ sed -i 's/set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSC_INCLUDE_DYNAMIC_PROCESSES -Wall -Werror/set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSC_INCLUDE_DYNAMIC_PROCESSES -Wall/g' CMakeLists.txt
$ sed -i 's/set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSC_INCLUDE_DYNAMIC_PROCESSES -Wall -Werror/set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSC_INCLUDE_DYNAMIC_PROCESSES -Wall/g' CMakeLists.txt
$ sed -i 's/set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DSC_INCLUDE_DYNAMIC_PROCESSES -Wall -Werror/set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DSC_INCLUDE_DYNAMIC_PROCESSES -Wall/g' CMakeLists.txt
$ sed -i 's/set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSC_INCLUDE_DYNAMIC_PROCESSES -Wall -Werror/set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSC_INCLUDE_DYNAMIC_PROCESSES -Wall/g' ./models/nvdla/CMakeLists.txt
$ sed -i 's/set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSC_INCLUDE_DYNAMIC_PROCESSES -Wall -Werror/set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSC_INCLUDE_DYNAMIC_PROCESSES -Wall/g' ./models/nvdla/CMakeLists.txt
$ sed -i 's/set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DSC_INCLUDE_DYNAMIC_PROCESSES -Wall -Werror/set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DSC_INCLUDE_DYNAMIC_PROCESSES -Wall/g' ./models/nvdla/CMakeLists.txt
$ sed -i 's/set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSC_INCLUDE_DYNAMIC_PROCESSES -Wall -Werror/set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSC_INCLUDE_DYNAMIC_PROCESSES -Wall/g' ./fpga/aws-fpga/fpga_sc_wrapper/CMakeLists.txt
$ sed -i 's/set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSC_INCLUDE_DYNAMIC_PROCESSES -Wall -Werror/set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSC_INCLUDE_DYNAMIC_PROCESSES -Wall/g' ./fpga/aws-fpga/fpga_sc_wrapper/CMakeLists.txt
$ sed -i 's/set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DSC_INCLUDE_DYNAMIC_PROCESSES -Wall -Werror/set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DSC_INCLUDE_DYNAMIC_PROCESSES -Wall/g' ./fpga/aws-fpga/fpga_sc_wrapper/CMakeLists.txt
$ sed -i 's/set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSC_INCLUDE_DYNAMIC_PROCESSES -Wall -Werror/set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSC_INCLUDE_DYNAMIC_PROCESSES -Wall/g' ./fpga/aws-fpga/cosim_sc_wrapper/CMakeLists.txt
$ sed -i 's/set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSC_INCLUDE_DYNAMIC_PROCESSES -Wall -Werror/set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSC_INCLUDE_DYNAMIC_PROCESSES -Wall/g' ./fpga/aws-fpga/cosim_sc_wrapper/CMakeLists.txt
$ sed -i 's/set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DSC_INCLUDE_DYNAMIC_PROCESSES -Wall -Werror/set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DSC_INCLUDE_DYNAMIC_PROCESSES -Wall/g' ./fpga/aws-fpga/cosim_sc_wrapper/CMakeLists.txt
$ cmake -DCMAKE_INSTALL_PREFIX=${PROJECT_PATH}/nvdla_vs -DSYSTEMC_PREFIX=${PROJECT_PATH}/systemc-2.3.0a/ -DNVDLA_HW_PREFIX=${PROJECT_PATH}/hw/ -DNVDLA_HW_PROJECT=nv_small
$ popd
```
Build and install the virtual platform.
```
$ pushd ${PROJECT_PATH}/vp
$ make; make install
$ popd
```
### 7. Run the demo image
Run virtual simulator using pre-built Linux kernel image
```
$ pushd ${PROJECT_PATH}
$ git clone https://github.com/nvdla/sw.git
$ pushd vp
$ rm -f ./images
$ ln -s ../sw/prebuilt/arm64-linux/images .
$ export SC_SIGNAL_WRITE_CHECK=DISABLE
$ ./aarch64_toplevel -c conf/aarch64_nvdla.lua
$ popd
$ popd
```
- Virtual platform Linux account
```
buildroot login: root
Password: nvdla
```
- Reference screenshot

{"metaMigratedAt":"2023-06-15T05:08:49.396Z","metaMigratedFrom":"Content","title":"How to construct NVDLA virtual platform?","breaks":true,"contributors":"[{\"id\":\"b9903986-73ac-4692-a9f5-f8a606b9615b\",\"add\":11624,\"del\":4490}]"}