search
LoginSignup
4

More than 3 years have passed since last update.

posted at

updated at

golangとHDLで協調シミュレーションする

 去年と全く同じ内容であれですが、今年はgolangで環境構築してみました。

概要

  • goからexportされたfunctionをverilogから実行
  • verilogのTaskをgoから実行

環境

  • Linux環境(CentOS)
  • Modelsim Intel FPGA Starter Edision 10.5b

verilog

verilogは、DPI-Cを使うのでSystemVerilogです。事前にコンパイルしてdpiheader.hを吐くようにします。

top.sv
`timescale 1ns/1ps

module top();
    import "DPI-C" context task go_test_func(input int,output int);
    export "DPI-C" task sv_test_task;

    bit [10:0] m;

    initial begin
        go_test_func(8,m);
        $display("m is %0d",m);
        $finish();
    end

    task sv_test_task(int n);
        $display("Hello World @SystemVerilog %0d",n);
    endtask

endmodule

golang

 cgoでdpiheader.hを読み込んで一緒にmodelsim-GCCのincludeを参照するようにします。
また、LDFLAGには、-sharedのオプションが必要でした。

test.go
package main

/*
#cgo CFLAGS: -I/XXXXX/modelsim_ase/include
#cgo LDFLAGS: -shared
#include "dpiheader.h"
*/
import "C"
import "fmt"

func main() {}

//export go_test_func
func go_test_func(n C.int, m *C.int) C.int {
        fmt.Println("HelloWorld @golang", n)
        C.sv_test_task(n)
        *m = 10
        return 0
}

Makefile

Makefileです。verilogはdpiheder.hを吐くようにします。
go側はModelsimが32bitバイナリである必要があるためGOARCHで386を指定する必要があります。

Makefile
Source
SV_FILE = top.sv
TOP_NAME = top
SRC = test.go
DPI_OBJ = golib
#Tool
VLIB = vlib
VLOG = vlog
VSIM = vsim

all : vlib vlog vsim

vlib:
        $(VLIB) work

vlog:
        $(VLOG) -sv -dpiheader dpiheader.h $(SV_FILE)

vsim: $(DPI_OBJ).so
        $(VSIM) -c -sv_liblist lib.txt $(TOP_NAME)  -do "run -all; quit -f"

$(DPI_OBJ).so :
        GOOS=linux GOARCH=386 CGO_ENABLED=1 go build -buildmode=c-shared -o $(DPI_OBJ).so $(SRC)

clean:
        rm -rf work $(DPI_OBJ).so $(OBJ) transcript *.wlf dpiheader.h

ライブラリリストのテキストも以下のように準備します。

lib.txt
#!SV_LIBRARIES
golib

実行結果

きちんと実行できました。

vsim -c -sv_liblist lib.txt top  -do "run -all; quit -f"
Reading pref.tcl

# 10.5b

# vsim -c -sv_liblist lib.txt top -do "run -all; quit -f" 
# Start time: 20:04:36 on Dec 03,2018
# Loading /tmp/XXXX_dpi_22180/linuxpe_gcc-4.7.4/export_tramp.so
# Loading sv_std.std
# Loading work.top
# Compiling /tmp/XXXX_dpi_22180/linuxpe_gcc-4.7.4/exportwrapper.c
# Loading /tmp/XXX_dpi_22180/linuxpe_gcc-4.7.4/vsim_auto_compile.so
# Loading ./golib.so
# run -all
# HelloWorld @golang 8
# Hello World @SystemVerilog 8
# m is 10
# ** Note: $finish    : top.sv(12)
#    Time: 0 ps  Iteration: 0  Instance: /top
# End time: 20:04:37 on Dec 03,2018, Elapsed time: 0:00:01
# Errors: 0, Warnings: 0

雑感

 golangは今年から勉強を始めましたがc/c++の代替としては非常に魅力的だと思いました。
本当はLinuxとWindowsとで同一環境にするためgolangを使えたらいいなと思ったのですが現時点では難しそうでした。
(Windowsではcgo込の場合、共有ライブラリが吐けない?)
verilogのみの場合だと環境がどうしてもしょぼくなってしまうので、golangの豊富なライブラリが手間なく利用できるのは今後も役立ちそうです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4