ЛР2 > Застосування різних типів процедур PLI. Процедура знаходження часу симуляції

Тема: Типи процедур PLI. Застосування функції vpi_get_time для зчитування часу моделювання

1. Теоретичні відомості

Verilog PLI (Programming Language Interface) це механізм виклику С або С++ функцій з коду Verilog.

VPI (Verilog Procedural Interface) процедури, які є над множиною процедур Verilog PLI (TF та ACC).

   Тестування та верифікація цифрових систем: структура курса лабораторних робіт 
 1. Розробка користувацьких системних функцій Verilog 
 2. Застосування різних типів процедур PLI. Процедура знаходження часу симуляції 
 3. Зчитування / запис даних більших за 32 біт 
 4. Організація доступу до масивів за допомогою VPI / PLI 
 5. Перевірка функції на повернення помилки та отримання аргументів симулятора 
 6. Застосування робочих областей PLI 

Особливості 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’.

Автор: Александр Романов