使用Golang和硬件描述语言(HDL)进行协同模拟
去年和完全相同的內容,今年試著用golang進行環境構建。
简要概述
-
- goからexportされたfunctionをverilogから実行
- verilogのTaskをgoから実行
环境
-
- Linux環境(CentOS)
- Modelsim Intel FPGA Starter Edision 10.5b
Verilog (短语描述硬件描述语言)
使用DPI-C的Verilog是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
Go语言
使用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。为了生成Verilog,需要让它输出dpheader.h。
对于go部分,需要在GOARCH中指定386,因为Modelsim需要一个32位二进制文件。
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
随想
我今年开始学习Go语言,我认为它非常有吸引力作为C/C++的替代品。
我原本希望能够在Linux和Windows上创建相同的开发环境,所以希望使用Go语言,但目前看来有些困难。
(在Windows上使用cgo时,无法生成共享库?)
如果只使用Verilog,环境就会变得非常糟糕,因此,将来可以方便地使用Go语言丰富的库将非常有用。