Go4Day 7

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の豊富なライブラリが手間なく利用できるのは今後も役立ちそうです。