Проблема потока внешней компиляции DPI-C и SystemVerilog - PullRequest
0 голосов
/ 05 ноября 2019

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 (что-то не так с экспортом).

Есть мысли о том, как мне преодолеть это препятствие?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Попробуйте изменить

DPI_LINK_DECL void
PrintHelloWorld();

на

DPI_LINK_DECL DPI_DLLISPEC void
PrintHelloWorld();

(если DPI_DLLISPEC не работает, замените его непосредственно на __declspec(dllimport))

0 голосов
/ 06 ноября 2019

Основываясь на рассмотрении примеров, попробуйте добавить -fPIC к вашей команде 1. Тогда команда 2 должна работать как есть.

По моему опыту, конечный файл должен быть общим объектом (.so);не динамическая библиотека ссылок (.dll). Я запускаю SystemVerilog в системах на основе Unix, так что, возможно, Windows отличается. Если вы столкнетесь с проблемой, возможно, стоит попробовать.

...