SystemVerilog 利用DPI调用其他语言

SystemVerilog 利用DPI-C调用其他语言

众所周知DPI-C调用外部C程序只需要通过import即可,但是DPI重要的一点是可以调用外部其他语言,最简单的办法就是调用Verilog的$system()任务,如果需要命令的返回值,使用linux的system()函数和WEXITSTATUS任务。
  • 调用外部c语言的sv代码:perl_test.sv
import "DPI-C" function int call_perl(string s);

program automatic perl_test;
    int ret_val;
    string script;

    initial begin
        if(!$test$plusargs("script"))begin
            $display("NO + script switch found");
            $finish;
        end

        $value$plusargs("script=%s",script);
        $display("SV: Running '%s'",script);
        ret_val = call_perl(script);
        $display("SV: Perl script return %0d",ret_val);
    end
endprogram : perl_test
  • C语言调用外部perl脚本:call_perl.c
#include "./work/vc_hdrs.h"
#include 
#include 

int call_perl(const char* command){
    int result = system(command);
    return WEXITSTATUS(result);
}
  • perl脚本:hello.pl
#!/usr/bin/perl

print "Perl:Hello,Jerry ! \n";
exit (3)
  • 最后Makefile脚本来运行测试:
    work_dir = $(abspath ./)
src =  \
      $(work_dir)/call_perl.c \
      $(work_dir)/perl_test.sv

default:
    rm -rf work ;mkdir work
    cd $(work_dir)/work && vcs \
            -full64 \
            -sverilog \
            -R \
            +incdir+$(work_dir) \
            +script="perl\ $(work_dir)/hello.pl" \
            $(work_dir)/call_perl.c \
            $(work_dir)/perl_test.sv

junks = csrc ucli.* simv* *.h

clean:
    rm -rf $(junks)

.PHONY: default clean

PS:system()可调用任意shell命令,所以理论上来讲SystemVerilog可以通过DPI调用任意脚本或者命令。

你可能感兴趣的:(SV学习笔记)