SystemVerilog: Как подключить функцию C с помощью вызова DPI в симуляторе VCS?

У меня есть следующие файлы:

C файл с функциями:

// funcs.c

#include <stdio.h>

void something() {
    printf("something\n");
    sayHello();
}

Системный файл verilog:

// hello_world.v

module kuku;
    export "DPI-C" function sayHello;
    import "DPI-C" function void something();
    initial something();
    function int sayHello ();
        $display("hello world");
        sayHello = 1;
    endfunction
endmodule

Как я могу скомпилировать и заставить это работать так, когда я звоню something() из SV, он будет вызывать функцию C, и когда я вызываю sayHello() из C, это будет вызывать функцию SV?

4 ответа

Решение

Отвечая себе:

Когда SV-код компилируется с использованием VCS, он сначала переводится в C-код.

когда exporting функция из SV, она генерирует файл заголовка C vc_hdrs.h это должно быть включено в файл C.

Таким образом, изменение, которое я сделал в файле C, это добавить строку:

#include "vc_hdrs.h"

Затем я просто добавил файл функций C в команду компиляции VCS:

> vcs -sverilog hello_world.v funcs.c

Оно работает!

Я получаю вывод:

something
hello world

Решение, которое работает со всеми симуляторами, следующими IEEE Std 1800-2012, заключается в #include "svdpi.h" и префикс extern Ключевое слово перед всеми методами, экспортируемыми в C. funcs.c должно выглядеть так:

#include <stdio.h>
#include "svdpi.h"

extern int sayHello();

void something() {
    printf("something\n");
    sayHello();
}

Примеры из IEEE Std 1800-2012

  • § H.10.2 Пример 2. Простое приложение с упакованным массивом
  • § H.10.3 Пример 3. Применение со сложной комбинацией типов

Я вижу, вы назвали файл SystemVerilog как расширение.v. Не уверен, работает ли это или нет. Но давайте скажем, если его hello_world.sv

Ваша командная строка должна выглядеть следующим образом (для Questa Simulator),

qverilog hello_world.sv funcs.c

"qverilog" предназначен для компиляции и запуска файлов SystemVerilog.

Это все. Нет необходимости добавлять дополнительные заголовочные файлы

Привет, я привел хороший пример под этим постом /questions/5244302/kak-vstroit-interpretator-systemverilog-s-pomoschyu-dpi-c/5244321#5244321

Synopsys VCS

1) Вы компилируете код C, используя флаги и вводя определения, которые хотите добавить. В нашем случае нашему C-коду нужно определить PYTHON_PATH

#GCC in two steps for shared object
gcc -g -D 'PYTHON_PATH="'$PYTHON_DIR'"'  -fPIC -Wall -I${VCS_HOME}/include -I/usr/include/python2.6/ -lpython2.6 -c ${PROJECTDIR}/verification/PVE/keycontrol/tb/keycontrol_C_code_wrapper.c 
gcc -fPIC -shared -o keycontrol_C_code_wrapper.so  keycontrol_C_code_wrapper.o 

2) Вы выполняете разработку VCS, связывающую библиотеку python с -LDFLAGS '-lpython2.6'

vcs -timescale=1ps/1ps -ntb_opts uvm -lca -kdb -full64 keycontrol_tb_top -debug_access+all+reverse  -LDFLAGS '-lpython2.6'

3) Вы запускаете созданный файл симуляции. Вы вызываете simv, включая -sv_lib keycontrol_C_code_wrapper, чтобы импортировать общий объект C.

#RUN C CODE
./simv -gui -ucli +DVE +UVM_NO_RELNOTES  -l simv.log  +UVM_TESTNAME=keycontrol_basic_test -do ../../verification/PVE/keycontrol/tools/keycontrol_ucli_init.synopsys -sv_lib keycontrol_C_code_wrapper
Другие вопросы по тегам