ModelSim Руководство пользователя (v10.1c), на странице 660, рассказывает о потоке автокомпиляции по умолчанию (с использованием vlog) и о потоке внешней компиляции, чтобы заставить DPI-C работать в ModelSim. Я могу заставить поток автокомпиляции работать. Я застрял с внешним потоком компиляции.
Описание проблемы: Я получаю ошибку «неопределенная ссылка», когда пытаюсь создать файл .dll, несмотря на использование правильных операторов экспорта и импорта в моем системном verilog-файле.
Вот файлы, составляющие этот проект:
файл 1: mytest.cpp
#include<stdio.h>
#include "experiment3.h"
int mymain() {
printf("---starting test in c-domain---\n");
PrintHelloWorld();
return 0;
}
файл 2: эксперимент3.h
#ifndef INCLUDED_EXPERIMENT3
#define INCLUDED_EXPERIMENT3
#ifdef __cplusplus
#define DPI_LINK_DECL extern "C"
#else
#define DPI_LINK_DECL
#endif
#include "svdpi.h"
DPI_LINK_DECL DPI_DLLESPEC
int
mymain();
DPI_LINK_DECL void
PrintHelloWorld();
#endif
файл 3: mytb.sv
module mytb;
timeunit 1ns/1ps;
export "DPI-C" function PrintHelloWorld;
import "DPI-C" context task mymain();
function void PrintHelloWorld();
$display("HelloWorld\n");
endfunction
//start test
initial begin
#10ns;
mymain();
end
endmodule
Вот команда, которую я использую:
command 1 :g++ -c -IC:\intelFPGA\17.0\modelsim_ase\include -o ./mytest.o ./mytest.cpp
comments :command 1 executes without any problem
key-words :MinGW, GCC
command 2 :g++ -shared -Bsymbolic -o ./mytest.dll ./mytest.o -LC:\intelFPGA\17.0\modelsim_ase\win32aloem
comments :[1] command 2 fails when I use the mytest.cpp showed above
[2] command 2 passes when I comment out "PrintHelloWorld()" in mytest.cpp
error :c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe:
./mytest.o:mytest.cpp:(.text+0x2d): undefined
reference to '`PrintHelloWorld' collect2.exe:error:ld
returned 1 exit status
key-words :MinGW, GCC, dll
command 3 : vsim -sv_lib ../src_cpp/mytest work.mytb
comments : [1] executed in console in ModelSim
[2] works when I don't have "PrintHelloWorld()" in mytest.cpp
Большинство онлайн-примеров DPI-C имеют дело с запуском (CPP и .SV)все в ModelSim. Я не хочу этогоЯ хочу разделить поток HW и SW. И это разделение работает в некоторой степени (у меня нет проблем с вызовом функций C из SV (импорт работает нормально). Огромным препятствием является попытка вызова функции SystemVerilog из функции C (что-то не так с экспортом).
Есть мысли о том, как мне преодолеть это препятствие?