去年と全く同じ内容であれですが、今年はgolangで環境構築してみました。
概要
- goからexportされたfunctionをverilogから実行
- verilogのTaskをgoから実行
環境
- Linux環境(CentOS)
- Modelsim Intel FPGA Starter Edision 10.5b
verilog
verilogは、DPI-Cを使うのでSystemVerilogです。事前にコンパイルしてdpiheader.h
を吐くようにします。
`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
のオプションが必要でした。
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を指定する必要があります。
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
ライブラリリストのテキストも以下のように準備します。
#!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の豊富なライブラリが手間なく利用できるのは今後も役立ちそうです。