使用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语言丰富的库将非常有用。