34
21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected] 1 5. Подпрограммы. Библиотека PLI Автоматизация проектирования компьютерных систем VERILOG

апкс 2011 05_verilog

Embed Size (px)

Citation preview

Page 1: апкс 2011 05_verilog

21.02.2011д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ

e-mail: [email protected] 1

5. Подпрограммы. Библиотека PLI

Автоматизация проектирования компьютерных систем

VERILOG

Page 2: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

2

Цель лекции и содержание

Цель – изучить методы построения и механизм использования подпрограмм в Verilog. Узнать возможности расширения функций программ моделирования с благодаря интерфейсу PLI

План Подпрограммы: Task и Function Библиотека PLI

Page 3: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

3

1 Task и Function: Старый стиль

//Синтаксис функцииfunction [automatic]

[signed] [range_or_type] identifier;

parameter_declaration;input_declaration;register_declaration;

statement;

endfunction

//Синтаксис задачиtask [ automatic ] identifier;

parameter_declaration;input_declaration;output_declaration;inout_declaration;register_declaration;event_declaration;

statement;endtask

Page 4: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

4

2 Task и Function: Новый стиль

//Синтаксис функцииfunction [automatic] [signed]

[range_or_type] identifier (function_port_list );block_item_declaration {

block_item_declaration }function_statement

endfunction

Примерfunction [7:0] getbyte

(input [15:0] address);

//Синтаксис задачиtask [ automatic ]

task_identifier(task_port_list ) ;

{ block_item_declaration }statement

endtask

Примерtask my_task (input a, b,

inout c, output d, e);

Page 5: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

5

Свойства функций и задачФункция Задача

1 Может вызывать другую функцию, задачу нет

Может вызывать как задачи, так и функции

2 Всегда выполняется мгновенно

На выполнение может постребоваться ненулевой промежуток времени

3 Не может содержать временные или событийные операторы управления

Может содержать временные или событийные операторы управления

4 Имеет только входные аргументы (input)

Может иметь аргументы типа input, output и inout

5 Всегда возвращает единственное значение

Не возвращает значение, но может передавать через аргументы типа output и inout

Page 6: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

6

Пример использования функции

function real multiply (input a, b);real a, b;multiply = ((1.2 * a) * (b * 0.17)) * 5.1;

endfunction//...real a;initial begin

a = multiply(1.5, a); end

Page 7: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

7

Функции для вычисления факториала

module tryfact;// описание функции

function [31:0] factorial;input [3:0] operand;reg [3:0] i;

beginfactorial = 1;

for (i = 2; i <= operand; i = i + 1)

factorial = i * factorial;end

endfunction

//использование функцииinteger result, n;

initialbeginfor (n = 0; n <= 7; n = n+1) beginresult = factorial(n);

$display(“%0d factorial=%0d”, n, result);end

endendmodule

Page 8: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

8

Создание и использование задачtask first_task;

parameter size=4;// Входной аргументinput a; integer a;// Двунаправленный аргумент inout [size-1:0] b;// Выходной аргументoutput c;// Внутренняя переменная reg [size-1:0] d;// Декларация событияevent e;

begind = b; c = |d;b = ~b;if (!a) -> e;

endendtask

integer x;reg a, b, y;reg [3:0] z;reg [7:0] w;. . .first_task(x, z, y); first_task(x, w[7:4], w[1]); first_task(1,{a,b,w[3], x[0]}, y);

// Использования именного события

// из задачиalways @(first_task.e)

count= count+1;

Page 9: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

9

Автоматические функции и задачи module tryfact; // описание функции

function automatic [31:0] factorial;input [3:0] operand;reg [3:0] i;

beginfactorial = 1;for (i = 2; i <= operand; i = i + 1)factorial = i * factorial;

endendfunction

//использование функцииinteger result; integer n;

initial begin

for (n = 0; n <= 7; n = n+1) begin

result = factorial(n);$display(“%0d factorial=%0d”, n, result);

endendendmodule

В автоматических задач запрещено использование:

1. неблокирующихоператоров;

2. непрерывных процедурных операторов assign и force;

3. внутриоператорногоконтроля;

4. системной задачи $monitor.

Page 10: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

10

Programming Language Interface (PLI)

Си

СистемныеЗадачи

Verilog

Page 11: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

11

Интерфейс PLI используется для:

Создания дополнительных системных задач и функций: задач мониторинга, генерации тестов, отладки фрагментов программы;

Построения различных программных приложений: трансляторы, анализ временных параметров;

Получения информации о проекте: иерархия, связи; Создание специальных и пользовательских форм управления выводом информации;

Создания подпрограмм, формирующих тестовые последовательности;

Создания любого основанного на Verilogпрограммного приложения.

Page 12: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

12

Programming Language Interface (PLI)

Таблицапользовательскихсистемных задач

Verilog-компилятор

Библ

иотека

подп

рограм

м P

LI

Verilog-код + Пользовательские системные задачи

Внутреннее представление проекта

(Структуры данных)

Моделирование

Результаты тестирования

Пользовательские

Си-подпрограмм

ы

Доступ к внутренним структурам

Управлениемоделированием

Вывод результатовтестирования

Подключение задач

Page 13: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

13

Разработка системной задачи на Си #include “veriuser.h”

#include “aldecpli.h”#include <windows.h>int welcome_task(){

io_printf(“You are welcomet!\n”);return 0;

}extern "C" __declspec(dllexport) s_tfcell veriusertfs[] ={

{usertask, 0, 0, 0, welcome_task, 0, “$welcome_task”},{0}

};

BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason,

LPVOID lpReserved ){

return TRUE;}

module start_PLI;initialbegin

$welcome_task;endendmodule

Использование

Page 14: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

14

Синтаксис массива veriusertfss_tfcell veriusertfs[] =

{ {usertask | userfunction | userrealfunction, data; checktf; sizetf; calltf; misctf; ”$tfname”},{0}}

checktf, sizetf, calltf и misctf - различные функции обратного вызова, описаны в стандарте Verilog IEEE Std1364-1995

calltf - функция, которая выполняется при вызове системной функции или процедуры в Verilog-коде

“$tfname” – это имя системной функции или задачи в Verilog-коде, которое должно начинаться с символа доллара ($)

Page 15: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

15

Пример массива veriusertfss_tfcell veriusertfs[] = {

{usertask, 0, 0, 0, welcome_task, 0, “$welcome_task”},{userfunction, 0, 0, 0, function_call, 0, “$my_function”},{0} // последний элемент должен быть 0

};

Page 16: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

16

Внутренний формат данныхmodule

< >имя модуля

Копии дочерних

модулей

Копии прим

итивов

Терминалы прим

итивов

Множества:

переменные к

лассов

,цепи

и регистры,

параметры

Порты

модуля

1 1 1 1

2 2 2 2

n1 n2 n3 nm

. . .

. . .

. . .

. . .

. . .

Page 17: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

17

Мультиплексор 2-в-1

module mux2_to_1(output out, input i0, i1, s);wire sbar, y1, y2;

not n1(sbar, s);and a1(y1, i0, sbar),

a2(y2, i1, s);or o1(out, y1, y2);

endmodule

i0

i1

out

y1a1

a2

o1

y2

n1

sbars

modulemux2_to_1

primitivenot n1

terminal

terminal

terminal

terminal

terminal

terminal

terminal

terminal

terminal

terminal

terminal

primitiveand a1

primitiveand a2

primitiveor o1

Копии прим

итивов

Цепи

Порты

модуля

Терминалы

прим

итивов

nets

ports

netsbar

neti0

porti0

nety1

neti1

porti1

nety2

netout

portout

Внутреннее представление данных

Page 18: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

18

Подпрограммы доступа и обслуживания

Использующая

-библиотеку

пользовательская

Си-подпрограмма

PLIA

cc P

LI-под

программ

ы

Tf P

LI-под

программ

ы

Внутреннее представление

проекта(Структуры данных)

Пользовательскоепредставление проекта

+тестовые

последовательности

Page 19: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

19

Подпрограммы доступа (access routine)

acc_user.h Абстрактный идентификатор (handle) Существует пять типов подпрограмм доступа: Handle routine ( acc_handle_)Next routine (acc_next_ ) Value Change Link (VCL) routine (acc_vcl_)Fetch routine (acc_fetch_.)Utility access routine (acc_initialize() и acc_close()).Modify routine

Page 20: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

20

Си подпрограмма для поиска полных иерархических имен портов #include “acc_user.h”

int get_ports(){ handle mod, port;

int input_ctr = 0; int output_ctr = 0; int inout_ctr = 0;

acc_initialize();

mod = acc_handle_tfarg(1); port = acc_handle_port(mod,0); /* получить первый порт модуля*/

while (port!=null) /*цикл для всех портов*/{

if (acc_fetch_direction(port) == accInput) /*Входной порт*/{ io_printf(“Input Port %s \n”, acc_fetch_fullname(port)); input_ctr++; }

else if (acc_fetch_direction(port) == accOutput) /*Выходной порт*/{ io_printf(“Output Port %s \n”, acc_fetch_fullname(port)); output_ctr++; }

else if (acc_fetch_direction(port) == accInout) /*Двунаправленный порт*/{io_printf(“Inout Port %s \n”, acc_fetch_fullname(port)); inout_ctr++; }port = acc_next_port(mod, port); /*перейти к следующему порту*/

}io_printf(“Input Ports = %d Output Ports = %d, Inout ports = %d\n\n”,

input_ctr, output_ctr, inout_ctr);acc_close();

return 0;}

Page 21: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

21

Использование системной задачи module top;

wire OUT;reg I0, I1, S;

mux2_to_1 my_mux(OUT, I0,I1, S); /*Копия модуля mux2_to_1*/

initialbegin

/*Вызов задачи $get_ports, генерирующей список портов*/$get_ports("top.my_mux");

endendmodule

// Результат моделирования:# Output Port top2.my_mux.out # Input Port top2.my_mux.i0 # Input Port top2.my_mux.i1 # Input Port top2.my_mux.s # Input Ports = 3 Output Ports = 1, Inout ports = 0

Page 22: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

22

Мониторинг значений сигналов.1#include “acc_user.h”

char convert_to_char();int display_net();int my_monitor(){ handle net;

char *netname; /* указатель для сохранения имени линии*/char *malloc();

acc_initialize();/*инициализация среды*/net = acc_handle_tfarg(1);/*получение идентификатора наблюдаемой линии*/

/*Следующие операторы ищут и сохраняют иерархическое имя линии*/netname = malloc(strlen(acc_fetch_fullname(net)));strcopy(netname, acc_fetch_fullname(net));

Page 23: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

23

Мониторинг значений сигналов. 2/*Вызов подпрограммы VCL для добавления сигнала в список мониторинга. Передается четыре аргумента: 1-й: handle объекта (net); 2-й: указатель на Си-подпрограмму, вызываемую при изменении значения объекта(display_net); 3-й: Строка передается в пользовательскую подпрограмму Си; 4-й: предопределенный VCL флаг: vc1_verilog_logic*/

acc_vcl_add(net, display_net, netname, vcl_verilog_logic);acc_close();return 0;}

/*Пользовательская подпрограмма. Вызывается при каждом изменении наблюдаемых сигналов*/display_net(vc_record)

p_vc_record vc_record; /*Структура p_vc_recordпредопределена в пакете acc_user.h*/

{ *Выводится время, имя и новое значение изменившейся линии*/io_printf("%d New value of net %s is %c \n", vc_record -> vc_lowtime, vc_record -> user_data, convert_to_char(vc_record->out_value.logic_value)); }

Page 24: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

24

Мониторинг значений сигналов. 3

/*Смешанные подпограммы для преобразования константы предопределенного символа в ASCII символ*/char convert_to_char(logic_val)char logic_val;{

char temp;switch(logic_val){/*vc10, vc11, vc1x предопределены в пакете acc_user.h*/case vcl0: temp = '0'; break;case vcl1: temp = '1'; break;case vclX: temp = 'X'; break;case vclZ: temp = 'Z'; break;}

return(temp);}

Page 25: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

25

Использование задачи мониторинга

module top;wire OUT;reg I0, I1, S;

mux2_to_1 my_mux(OUT, I0, I1, S); //Копия модуля mux2_to_1

initial // Добавление сигнала в список мониторингаbegin

$my_monitor("top.my_mux.sbar");$my_monitor("top.my_mux.y1");

end

initial beginI0 = 1'b0; I1 = 1'b1; S = 1'b0; #5 I0 = 1'b1; I1 = 1'b1; S = 1'b1;#5 I0 = 1'b0; I1 = 1'b1; S = 1'bx;#5 I0 = 1'b1; I1 = 1'b1; S = 1'b1;

endendmodule

Page 26: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

26

Обслуживающие подпрограммы (utility routine)

#include "veriuser.h" Задачи, решаемые с применением обслуживающих подпрограмм: Получение информации о вызванных системных задачах, списке аргументов, считывание и изменение значения аргумента.

Наблюдение за изменениями значений аргументов Выполнение вспомогательных задач, таких как сохранение рабочей области, сохранения указателя на задачу.

Выполнение сложных вычислений Вывод сообщения Получение информации о времени моделирования и очереди событий.

Остановка, завершение, сохранение и восстановление процесса моделирования.

Page 27: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

27

Обслуживающая PLI-подпрограмма. 1

Спецификация для $my_stop_finish

1-й 2-й

0 нет Остановка моделирования. Вывод сообщения и модельного времени

1 нет Завершение моделирования. Вывод сообщения и модельного времени

0 любое значение Остановка моделирования. Вывод сообщения, имя модуля из которого был произведен вызов задачи и модельного времени

1 любое значение Завершение моделирования. Вывод сообщения, имя модуля из которого был произведен вызов задачи и модельного времени

АргументыДействие

Page 28: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

28

Обслуживающая PLI-подпрограмма. 2 int my_stop_finish()

{if(tf_nump() == 1) { if (tf_getp(1)==0)

{ io_printf("Mymessage: Simulation stopped at time %d\n", tf_gettime());tf_dostop(); /*Остановка моделирования*/

}else if (tf_getp(1) == 1) /*Если аргумент = 1, моделирование завершается*/{ io_printf("Mymessage: Simulation finished at time &d\n", tf_gettime());

tf_dofinish(); /*Завершение моделирования*/}else tf_warning("Bad arguments to $my_stop_finish at time %d\n", tf_gettime());}

else if (tf_nump() == 2) { if (tf_getp(1) == 0)

{ io_printf("Mymessage: Simulation stopped at time %d in instance %s \n", tf_gettime(), tf_mipname()); tf_dostop(); }

else if (tf_getp(1) == 1) { io_printf("Mymessage: Simulation finished at time %d in instance %s \n",

tf_gettime(), tf_mipname()); tf_dofinish(); }

else tf_warning("Bad arguments to $my_stop_finish at time %d\n", tf_gettime()); }

return 0;}

Page 29: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

29

Обслуживающая PLI-подпрограмма. 3 module top;

wire OUT;reg I0, I1, S;

mux2_to_1 my_mux(OUT, I0, I1, S);

initialbegin

I0 = 1'b0; I1 = 1'b1; S = 1'b0; $my_stop_finish(0); #5 I0 = 1'b1; I1 = 1'b1; S = 1'b1; $my_stop_finish(0,1); #5 I0 = 1'b0; I1 = 1'b1; S = 1'bx; $my_stop_finish(2,1); #5 I0 = 1'b1; I1 = 1'b1; S = 1'b1;

$my_stop_finish(1,1); endendmodule

Результат моделирования# Mymessage: Simulation

stopped at time 0

# Mymessage: Simulationstopped at time 5 in instancetop

# : Bad arguments to$my_stop_finish at time 10# : : $my_stop_finishf:\My_Designs\new\my_new/src/top1.v(13)

# Mymessage: Simulationfinished at time 15 in instancetop

Page 30: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

30

Тест-вопросы

1. Какое модельное время затрачивается на выполнение функции?

2. Можно ли в функции использовать задержки, события и операторы управления временем.

Page 31: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

31

Контрольные задания.11. Создать функцию, умножающую два 4-битовых числа и

формирующую 32-битовый результат. Написать тестовый модуль для вызова функции и проверки результата ее работы.

2. Создать функцию, моделирующую восьмиоперационное АЛУ. Функция принимает 3-битовый код операции, два 4-разрядных операнда, а возвращает 5-битовый результат. Написать тестовый модуль для вызова функции и проверки результата ее работы. OP Функция

3'b000 out = a3'b001 out = a + b3'b010 out = a - b3'b011 out = a / b3'b100 out = a % b3'b101 out = a << b3'b110 out = a >> b3'b111 out = (a > b), сравнение амплитуд

Page 32: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

32

Контрольные задания.21. Создать задачу, выполняющую проверку на четность 16-битового

числа. Результат – 31-битовое число. На него поступает значение после трех положительных фронтов синхронизации. Использовать оператор repeat.

2. Написать задачу, вычисляющую сумму квадратов входных значений A и B. Входные значения имеют тип real. Задача возвращает значение через вещественную переменную sum_of_squares. Разработать testbench для тестирования работы задачи из п. а).

Тестовые значения формировать с помощьюсистемной функции $random. Результаты моделирования выводить в текстовый файл в формате:

A = значение B = значение sum_of_squares = значение. Например, A = 3 B = 2 sum_of_squares = 13.

Написать задачу, генерирующую импульсы синхросигнала syn_clkдлиной 1 ед. времени с периодом в 20 ед. времени. Когда сигнал reset = 1, то задача переключает syn_clk в 0 и возвращает управление.

Page 33: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

33

Контрольные вопросы и задания.3

1.Для каких задач используются подрограммыдоступа?

2.Какие задачи решают обслуживающие подрограммы?

3.Создать пользовательскую системную задачу $get_in_port, которая формирует сообщение о входных портах заданного модуля. Иерархическое имя модуля будет входным параметром задачи.

Page 34: апкс 2011 05_verilog

21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]

34

Контрольные вопросы и задания.41. Написать пользовательскую системную задачу

$count_and_gates, которая подсчитывает число стандартных примитивов and в модуле. Длятестирования использовать следующую модельмультиплексора:

• module mux_4_to_1 (Out, In0, In1, In2, In3, Sel1, Sel0);output Out;input In0, In1, In2, In3, Sel1, Sel0;wire NotSel0, NotSel1;wire Y0, Y1, Y2, Y3;

and (Y1, In1, NotSel1, NotSel0);not (NotSel0, Sel0);and (Y3, In3, Sel1, Sel0);or (Out, Y0, Y1, Y2, Y3);and (Y0, In0, NotSel1, NotSel0);not (NotSel1, Sel1);and (Y2, In2, Sel1, NotSel0);

endmodule