Skip to content

farukyld/spike-cosim

Repository files navigation

CC BY-SA lisansı altında TÜBİTAK BİLGEM - TÜTEL bünyesinde geliştirilmiştir.

Developed by TÜBİTAK BİLGEM - TÜTEL under CC BY-SA.

spike-cosim

cosim/src/cpp directory'si içindeki kodlar, spike'a yapılan eklemelerin büyük bir kısmını içeriyor. (bazı eklemeler doğrudan spike'ın kaynak kodlarının içinde olması gerekti) cosimif.ccde cosimulation için kullanılacak fonksiyonlar var.

// cosimif.cc'de tanimlaniyorlar
void init();
void step();
svBit simulation_completed();
void private_get_pc(svBitVecVal* pc_o, int processor_i);
void private_get_log_reg_write(const svOpenArrayHandle log_reg_write_o, int* inserted_elements_o, const int processor_i);
void private_get_log_mem_read(const svOpenArrayHandle log_mem_read_o, int* inserted_elements_o, const int processor_i);
void private_get_log_mem_write(const svOpenArrayHandle log_mem_write_o, int* inserted_elements_o, const int processor_i);

cosim/src/pkg içerisinde bu genel amaçlı fonksiyonlar SystemVerilog Direct Programming Interface (DPI) ile import'lanıyor. Bu fonksiyonların sv'de kullanımını kolaylaştırmak için çevreleyici fonksiyonlar, enumlar, unionlar ve structları içeren sv packageları da burada.

Cosim'i kullanmak için:

  • spike'ın cosim için değiştirilmiş hâlini kurmalıyız.
  • DPI bağlantısını kuracak olan araca (verilator/questa/xcelium, ben verilator'u kullandım);
    • cpp kaynağı olarak: spike kurulumunun çıktısı olan libriscv.so ve libspike_dasm.a ile cosim/src/cppde bulunan kaynak kodlarını,
    • sv kaynağı olarak: cosim/src/pkgdeki dosyaları ve bu sv packagelarını kullanan bir top modul'ü (cosim/src/tb içerisinde örnek bir testbench var) veriyoruz.
    • include search path olarak (gcc -I flag'i) bunları tanıtmamız gerekiyor:
  # cosim için değiştirilmiş riscv-isa-sim'in absolute path'i.
  SPIKE := 

  INC_DIRS := -I$(SPIKE)/build
  INC_DIRS += -I$(SPIKE)/riscv
  INC_DIRS += -I$(SPIKE)/fesvr
  INC_DIRS += -I$(SPIKE)/
  INC_DIRS += -I$(SPIKE)/softfloat
  INC_DIRS += -I$(SPIKE)/fdt

Spike Kurulumu

spike submodule'ünü build'leyelim ama install etmeyelim. (install etmenin bir zararı yok, spike'ın normal çalışmasını etkilemez fakat gereksiz yere install etmesini beklemiş oluruz.)

(NOT: halihazırda derlemiş olduğunuz bir spike kurulumu varsa ve sıfırdan kurulmasını beklemek istemiyorsanız kurulu_spike_uzerine.md'deki adımları takip edebilirsiniz. Fakat mevcut kurulumunuzu etkilememek için submodule'u kullanmanızı tavsiye ederiz.)

(esas repo'nun readme'sinden de yararlanabilirsiniz)

  • spike'ı kurmadan önce, eğer riscv-gnu-toolchain'i henüz kurmadıysanız, kuracağınız directory'yi RISCV ortam değişkeni olarak tanımlayın:
# ~/.bashrc'ye (shell acildiginda source'lanan script) ekleyebilirsiniz
export RISCV=/opt/riscv
# PWD = spike-cosim oldugunu varsayarak
git submodule update --init riscv-isa-sim # riscv submodule'unu guncelle
( # parantezler, shell'in icinde subshell olusturuyor. boylece "parent" shell, cd'lerden etkilenmemis oluyor.
  cd riscv-isa-sim
  [sudo] apt-get install device-tree-compiler
  mkdir build
  cd build
  ../configure --prefix=$RISCV # riscv tool'larinin kurulu oldugu directory
  [sudo] make -j8 # -j8'i degistirmek isteyebilirsiniz
)

Verilator Kurulumu

verilator verilog kodlarını cpp/SystemC'ye dönüştürürüp derleme ve linkleme işlemininde gcc kullanımını otomatize eden bir araç. Çıktı olarak systemC/cpp (verilator kodlarının dönüştürülmüş hâli), veya çalıştırılabilir dosya oluşturabiliyor. Çıktı olarak üretilen çalıştırılabilir dosyayı koştuğumuzda simülasyonu koşmuş oluyoruz.

NOT: Ben simülasyon akışını verilog içerisinde (testbench'lerle) oluşturdum. Verilator, ek seçenek olarak cpp kodu içerisindeki main fonksiyonunu değiştirerek simülasyon oluşturma imkanı da sağlıyor. Şurada bununla ilgili bir örnek var.

  • verilator'u clone'layıp build'liyoruz. install yapmadım, doğrudan repo'nun yerel kopyasının içinde oluşturulan binary'leri (VERILATOR_ROOT/bindeki exexcutable'ları) kullandım. (run-in-place)

  • systemC kulanmadım.

ayrıntılı bilgi için verilator docs'a bakabilirsiniz.

# Prerequisites:
#sudo apt-get install git help2man perl python3 make autoconf g++ flex bison ccache
#sudo apt-get install libgoogle-perftools-dev numactl perl-doc
#sudo apt-get install libfl2  # Ubuntu only (ignore if gives error)
#sudo apt-get install libfl-dev  # Ubuntu only (ignore if gives error)
#sudo apt-get install zlibc zlib1g zlib1g-dev  # Ubuntu only (ignore if gives error)

# PWD = spike-cosim oldugunu varsayarak
(
  cd .. # verilator'u spike-cosim repo'sunun altina clone'lamayalim, bir ust directory'ye gecelim.
  git clone https://github.com/verilator/verilator
  cd verilator
  autoconf         # Create ./configure script
  ./configure      # Configure and create Makefile
  make -j8         # Build Verilator itself
)
  • şunları ~/.bashrcye (ubuntu için adı ~/.bashrc farklı dağıtımlarda ismi farklı olabilir, bir shell açıldığında sourcelanan script.) ekliyoruz:
# git clone yaptigimizda nereye indirdiysek,
#  mesela: /home/usr1/verilator
export VERILATOR_ROOT=
export PATH=$VERILATOR_ROOT/bin:$PATH

Cosim Örnek Kullanımı

cosim/makefile içindeki kurallar, cosim'i kullanan örnek testbench'i derlerken SPIKE environment variable'ının tanımlı olduğu varsayımı üzerine yazılmıştır. Bu variable'ı spike yerel kopyanızın bulunduğu directory'yi gösterecek şekilde mutlak yol olarak ayarlıyoruz:

# spike-cosim/riscv-isa-sim'in absolute path'i.
export SPIKE=

Baremetal örnek

  • cosim'i kullanan örnek testbench'i verilator ile derleyelim.
# PWD = spike-cosim oldugunu varsayarak
(
  cd cosim
  make clean_tb_spike_link
  make compile_tb_spike_link
)
  • ornek_test_girdileri/pk_olmadan örneğini kullanarak bir elf dosyası oluşturalım. Bu elf dosyasını oluştururken riscv-gnu-toolchain'in elf derleyicisini kullanacağız.

NOT: Eğer riscv-gnu-toolchain'i ilk defa kuracaksanız ilerde riscv proxy-kerneli kurarken sıkıntı yaşamamak için proxy-kernel.md'ye göz atmanızı tavsiye ederim. Riscv proxy-kernel kullanmayacaksanız (yalnızca bare-metal kod çalıştıracaksanız) bu NOT'u görmezden gelebilirsiniz.

# PWD = spike-cosim oldugunu varsayarak
(
  cd ornek_test_girdileri/pk_olmadan
  make all
)
  • tb_spike_link.exenin az önce oluşturduğumuz elf dosyasını kullanması için args.txt dosyasını değiştirelim.
# PWD = spike-cosim oldugunu varsayarak
echo "spike ${PWD}/ornek_test_girdileri/pk_olmadan/outputs/hello.elf" > cosim/log/args.txt

args.txt, cosimif.ccdeki void init() fonksiyonu tarafından okunuyor.

  • tb_spike_linki koşalım:
# PWD = spike-cosim oldugunu varsayarak
cd cosim
make run_with_compile_tb_spike_link
cd ..

proxy-kernel ile örnek

proxy-kernel'in kısa bir açıklaması için proxy-kernel.md'ye bakabilirsiniz.

RISCV-GNU-Toolchain kurulumu

proxy-kernel'i kurmak için önce riscv-gnu-toolchain'i kurmamız gerek (çünkü pk, riscv mimarili bilgisayar üzerinde koşmak için derlenecek):

  • prerequisite'ler:
sudo apt-get install autoconf automake autotools-dev curl python3 python3-pip libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev ninja-build git cmake libglib2.0-dev

NOT: burada hata alinirsa sudo apt-get update veya apt-get yerine apt ile deneyebilirsiniz. Yine hata alınırsa ubuntu_paket_hatalari.md'ye bakabilirsiniz.

  • newlib kurulumu (alternatif olarak linux kurulumu da var ama hiç gerek duymadım)

NOT: riscv-gnu-toolchain repo'sunu clone'lamak (git'in submodule.recurse configuration'ını true olarak ayarladıysanız.ayarlamadıysanız kurarken indirecek) uzun sürecektir. repo, submodule'lerle birlikte yaklaşık 6GB.

NOT: /opt/riscvın içine kurulum yapılıyor.

# PWD = spike-cosim oldugunu varsayarak
(
  cd .. # spike-cosim'in icine clone'lamayalim, bir ust directory'ye gecelim
  git clone https://github.com/riscv-collab/riscv-gnu-toolchain.git
  cd riscv-gnu-toolchain
  ./configure --prefix=/opt/riscv --with-arch=rv64imafdc_zifencei
  [sudo] make -j8 # -j8'i degistirmek isteyebilirsiniz.
)
  • daha sonra şu satırları ~/.bashrcye ekleyeyin:
export RISCV=/opt/riscv
export PATH=$RISCV/bin:$PATH
  • bunları ~/.bashrcye ekledikten sonra terminali açıp kapatalım ki ortam değişkenlerinin yeni hâllerini tanısın.

proxy-kernel kurulumu

riscv proxy-kernel için:

# PWD = spike-cosim oldugunu varsayarak
(
  cd .. # spike-cosim'in icine clone'lamayalim, bir ust directory'ye gecelim
  git clone https://github.com/riscv-software-src/riscv-pk.git
  cd riscv-pk
  mkdir build
  cd build
  ../configure --prefix=/opt/riscv --host=riscv64-unknown-elf --with-arch=rv64imafdc_zifencei
  make -j8 # -j8'i degistirmek isteyebilirsiniz.
  [sudo] make -j8 install
)

  • bunları yaptıktan sonra cosim'i proxy-kernel ile denemek için test girdimizi derleyelim
# PWD = spike-cosim oldugunu varsayarak
(
  cd ornek_test_girdileri/fromhost_tohost_test
  make all
)
  • args.txt'yi az önce derlediğimiz .elf dosyasını pk ile kullanacak şekilde değiştirelim:
# PWD = spike-cosim oldugunu varsayarak
echo "spike pk ${PWD}/ornek_test_girdileri/ornek_test_girdileri/fromhost_tohost_test/a.out" > cosim/log/args.txt
  • örnek testbench'i derleyip koşalım:
# PWD = spike-cosim oldugunu varsayarak
cd cosim
make run_with_compile_tb_spike_link
cd ..

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published