Тема: Типи процедур PLI. Застосування функції vpi_get_time для зчитування часу моделювання
1. Теоретичні відомості
Verilog PLI (Programming Language Interface) це механізм виклику С або С++ функцій з коду Verilog.
Особливості VPI:
-
VPI процедури належать до 3го покоління Verilog PLI процедур.
-
TF відповідають першому поколінню; ACC процедури-другому.
-
VPI надає можливість PLI додаткам мати доступ до внутрішніх структур симулятору Verilog.
-
Існує лише 37 процедур VPI, які містяться у vpi_user.h (на відміну від TF та ACC, які мали понад 200 процедур).
-
VPI дає змогу викликати C моделі з коду Verilog.
-
C моделі не можуть викликати жодного Verilog коду.
-
Дає змогу зчитувати значення сигналів з Verilog коду в межах C коду.
-
Дає змогу змінювати значення будь-яких сигналів задекларованих в Verilog коді з C коду.
Всі VPI процедури містяться у файлі vpi_user.h, розташованому у каталогу симулятора ModelSim. Вони поділяються на групи за призначенням:
/* процедури обробників */
vpi_register_cb();
vpi_remove_cb();
vpi_get_cb_info();
vpi_register_systf();
vpi_get_systf_info();
/*доступ до посилань */
vpi_handle_by_name();
vpi_handle_by_index();
/* обробка посилань */
vpi_handle();
vpi_handle_multi();
vpi_iterate();
vpi_scan();
/* доступ до часу */
vpi_get_time();
/* керування затримками */
vpi_get_delays();
vpi_put_delays();
/* керування значеннями */
vpi_get_value();
vpi_put_value();
/* керування властивостями */
vpi_get();
vpi_get_str();
/* процедури вводу/виводу */
vpi_mcd_open();
vpi_mcd_close();
vpi_mcd_name();
vpi_mcd_printf();
vpi_printf();
/* утіліти */
vpi_compare_objects();
vpi_chk_error();
vpi_free_object();
vpi_get_vlog_info();
/* додаткові утіліти,
які додано 1364-2000 */
vpi_get_data();
vpi_put_data();
vpi_get_userdata();
vpi_put_userdata();
vpi_vprintf();
vpi_mcd_vprintf();
vpi_flush();
vpi_mcd_flush();
vpi_control();
vpi_handle_by_multi_index();
Бібліотека VPI визначає декілька вбудованих типів даних фіксованого розміру, які можуть бути використані в процедурах PLI (вони також розташовані в vpi_user.h):
typedef int PLI_INT32; // 32-bit signed int
typedef unsigned int PLI_UINT32; // 32-bit unsigned int
typedef short PLI_INT16; // 16-bit signed int
typedef unsigned short PLI_UINT16; // 16-bit unsigned int
typedef char PLI_BYTE8; // 8-bit signed int
typedef unsigned char PLI_UBYTE8; // 8-bit unsigned int
Типи процедур PLI
Тип визначається тим, коли симулятор виконує процедуру:
-
Поточні процедури виконуються підчас симуляції.
-
Процедури завантаження виконуються підчас відповідної фази до початку симуляції.
Типи деяких процедур PLI:
-
calltf процедури виконуються підчас симуляції.
-
compiletf процедури викликаються до початку симуляції (до стану часу симуляції рівному 0)
-
sizetf процедури викликається лише один раз, до часу симуляції рівного 0
-
Процедури-обробники виконуються в довільний час відносно початку симуляції.
Функція зчитування часу симуляції vpi_get_time()
Для зчитування часу симуляції застосовується наступна функція:
Рис. 1 Параметри функції зчитування часу симуляції ‘vpi_get_time’
Час симуляції повертається у вигляді спеціальної структури, яка складається із старшої та молодшої 32-бітної частин.
Рис. 2 Структура ‘t_vpi_time’
typedef struct t_vpi_time {
PLI_INT32 type; // vpiScaledRealTime or vpiSimTime
PLI_UINT32 high; // with vpiSimTime
PLI_UINT32 low; // with vpiSimTime
double real; // with vpiScaledRealTime
} s_vpi_time, *p_vpi_time;
2. Порядок виконання роботи
1. Створіть файл test_type.v та введіть код модуля:
module test_type;
reg clk;
always #5 clk = ~clk;
initial begin
clk = 0;
#50 $finish;
end
always @ (posedge clk) $cosim_type();
endmodule
2. Створіть файл cosim_type.c, де визначте користувацьку calltf функцію та функцію її реєстрації:
Рис. 3 Розробка користувацької функції та функції її реєстрації
3. Виконайте компіляцію користувацької функції та створіть динамічну бібліотеку, яка буде підключена до симулятора ModelSim під час симуляції.
Рис. 4 Компіляція користувацької функції у бібліотеку *.dll
4. Виконайте симуляцію в ModelSim. Зверніть увагу на момент виклику функції calltf.
Рис. 5 Результати симуляції в ModelSim
3. Самостійна робота
Модифікуйте демонстраційний приклад та створіть додаток PLI, який виводить час симуляції користуючись ‘vpiSimTime’ замість ‘vpiScaledRealTime’. Зверніть увагу на те, що ‘vpiSimTime’ використовує ‘high’ та ‘low’ фрагменти ‘struct t_vpi_time’.
Автор: Александр Романов