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