Upload
irina-hahanova
View
419
Download
0
Embed Size (px)
Citation preview
21.02.2011д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ
e-mail: [email protected] 1
5. Подпрограммы. Библиотека PLI
Автоматизация проектирования компьютерных систем
VERILOG
21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]
2
Цель лекции и содержание
Цель – изучить методы построения и механизм использования подпрограмм в Verilog. Узнать возможности расширения функций программ моделирования с благодаря интерфейсу PLI
План Подпрограммы: Task и Function Библиотека PLI
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
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);
21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]
5
Свойства функций и задачФункция Задача
1 Может вызывать другую функцию, задачу нет
Может вызывать как задачи, так и функции
2 Всегда выполняется мгновенно
На выполнение может постребоваться ненулевой промежуток времени
3 Не может содержать временные или событийные операторы управления
Может содержать временные или событийные операторы управления
4 Имеет только входные аргументы (input)
Может иметь аргументы типа input, output и inout
5 Всегда возвращает единственное значение
Не возвращает значение, но может передавать через аргументы типа output и inout
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
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
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;
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.
21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]
10
Programming Language Interface (PLI)
Си
СистемныеЗадачи
Verilog
21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]
11
Интерфейс PLI используется для:
Создания дополнительных системных задач и функций: задач мониторинга, генерации тестов, отладки фрагментов программы;
Построения различных программных приложений: трансляторы, анализ временных параметров;
Получения информации о проекте: иерархия, связи; Создание специальных и пользовательских форм управления выводом информации;
Создания подпрограмм, формирующих тестовые последовательности;
Создания любого основанного на Verilogпрограммного приложения.
21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]
12
Programming Language Interface (PLI)
Таблицапользовательскихсистемных задач
Verilog-компилятор
Библ
иотека
подп
рограм
м P
LI
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
Использование
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-коде, которое должно начинаться с символа доллара ($)
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
};
21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]
16
Внутренний формат данныхmodule
< >имя модуля
Копии дочерних
модулей
Копии прим
итивов
Терминалы прим
итивов
Множества:
переменные к
лассов
,цепи
и регистры,
параметры
Порты
модуля
1 1 1 1
2 2 2 2
n1 n2 n3 nm
. . .
. . .
. . .
. . .
. . .
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
Внутреннее представление данных
21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]
18
Подпрограммы доступа и обслуживания
Использующая
-библиотеку
пользовательская
Си-подпрограмма
PLIA
cc P
LI-под
программ
ы
Tf P
LI-под
программ
ы
Внутреннее представление
проекта(Структуры данных)
Пользовательскоепредставление проекта
+тестовые
последовательности
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
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;}
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
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));
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)); }
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);}
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
21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]
26
Обслуживающие подпрограммы (utility routine)
#include "veriuser.h" Задачи, решаемые с применением обслуживающих подпрограмм: Получение информации о вызванных системных задачах, списке аргументов, считывание и изменение значения аргумента.
Наблюдение за изменениями значений аргументов Выполнение вспомогательных задач, таких как сохранение рабочей области, сохранения указателя на задачу.
Выполнение сложных вычислений Вывод сообщения Получение информации о времени моделирования и очереди событий.
Остановка, завершение, сохранение и восстановление процесса моделирования.
21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]
27
Обслуживающая PLI-подпрограмма. 1
Спецификация для $my_stop_finish
1-й 2-й
0 нет Остановка моделирования. Вывод сообщения и модельного времени
1 нет Завершение моделирования. Вывод сообщения и модельного времени
0 любое значение Остановка моделирования. Вывод сообщения, имя модуля из которого был произведен вызов задачи и модельного времени
1 любое значение Завершение моделирования. Вывод сообщения, имя модуля из которого был произведен вызов задачи и модельного времени
АргументыДействие
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;}
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
21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]
30
Тест-вопросы
1. Какое модельное время затрачивается на выполнение функции?
2. Можно ли в функции использовать задержки, события и операторы управления временем.
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), сравнение амплитуд
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 и возвращает управление.
21.02.2011 д.т.н. Хаханова И.В, каф.АПВТ, ХНУРЭ e-mail: [email protected]
33
Контрольные вопросы и задания.3
1.Для каких задач используются подрограммыдоступа?
2.Какие задачи решают обслуживающие подрограммы?
3.Создать пользовательскую системную задачу $get_in_port, которая формирует сообщение о входных портах заданного модуля. Иерархическое имя модуля будет входным параметром задачи.
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