Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Оператор ASSERT



Оператор ASSERT дозволяє контролювати істинність арифметичного виразу, операндами якого є: параметри, числа, позначені арифметичні вирази, а також значення вбудованої в пакет функції USED.

Функція USED застосовується для перевірки виводів модуля. Аргументом функції є ім'я виводу модуля. Значення, що повертається:

■ FALSE - якщо даний вивід модуля не підключений при використанні модуля як компонента в описі більш високого рівня ієрархії;

■ TRUE - якщо вивід підключений.

Як ілюстрацію розглянемо наведений нижче текстовий опис, що базується на представленому раніше описі модуля IF_GEN.

PARAMETERS

(

WIDTH = 8,

MODULE_TYPE = "ADD"

);

ASSERT (WIDTH > 0)

REPORT "WIDTH of % must be more then %" Module_Type, WIDTH

SEVERITY ERROR;

SUBDESIGN ASSERT_

(

A[WIDTH..1],B[WIDTH..1]: INPUT;

RESULT[WIDTH..1], Cout: OUTPUT;

)

BEGIN

ASSERT (Module_Type =="ADD") or (Module_Type =="SUB")

REPORT "Module_Type must be ""ADD"" or ""SUB"" but not %" Module_Type

SEVERITY ERROR;

IF Module_Type == "ADD" GENERATE

(Cout,Result[]) = (GND,A[]) + (GND,B[]);

ELSE GENERATE

(Cout,Result[]) = (GND,A[]) - (GND,B[]);

END GENERATE;

END;

У наведеному прикладі оператор ASSERT використовується для контролю значення параметрів WIDTH і Module_Type.

Так, якщо значення параметра Module_Type, задане поза даним текстовим описом, відмінно від ADD і SUB (наприклад, дорівнює MIN), то компілятор сформує наступне повідомлення:

Error: Line 17, File c:\max_work\assert_.tdf:

Module_Type must be "ADD" or "SUB" but not MIN

Оскільки «рівень строгості» даного повідомлення - ERROR, то компілятор припинить роботу.

Відзначимо, що при «рівнях строгості» WARRING і INFO компілятор продовжує роботу.

3.14. Примітиви

Для використання в текстовому описі модуля примітива необхідно звернутися до вбудованого в пакет функціонального опису даного примітива й зіставити його виводам: числа, константи, змінні або виводи модуля.

У мові AHDL визначені два способи звертання до примітива:

■ безпосереднє звертання (In_line Reference);

■ присвоєння примітиву символічного імені, тобто оголошення його змінною або звертання до нього як до змінної.

Безпосереднє звертання до примітива здійснюється в такий спосіб:

■ вказується вихід (або внутрішня змінна) модуля, на який передається сигнал з виходу примітива;

■ далі ставиться знак рівності й ім'я примітива;

■ за ім'ям примітива в круглих дужках, через кому перераховуються передані значення:

- числа,

- константи,

- змінні або виводи модуля, що зіставляються входам примітива;

■ за круглими дужками ставиться крапка з комою.

Зіставлення входів примітива з переданими значеннями може здійснюватися:

■ позиційно;

■ за іменами.

При позиційному зіставленні порядок перерахування переданих значень повинен відповідати порядку перерахування входів, використаному в описі прототипу примітива.

Вихід модуля (внутрішня змінна)=

Ім'я примітива (передане значення, передане значення,...);

Як приклад розглянемо текстовий опис схеми, представленої на рис.18

Рис. 18

Текстовий опис:

SUBDESIGN Prim_in_line1

(

D_in, Enadle: INPUT;

D_tri: OUTPUT;

)

BEGIN

D_tri = TRI(D_in, Enable);

END;

При описі присвоєння в програмі можливі наступні варіанти, що ілюструють метод присвоєння за іменами.

D_tri = TRI(.IN = D_in, OE = Enable);

D_tri = TRI(OE = Enable,.IN = D_in);

Відзначимо, що прототипи примітивів вбудовані в пакет, і для їхнього підключення до текстового опису, оператор INCLUDE не використовується. Прототип примітива TRI у пакеті MAX+plus II заданий у такий спосіб:

FUNCTION TRI (IN, OE)

RETURNS (OUT);

При звертанні до примітива в списку переданих значень першим зазначений вхід D_in. Тому він буде з'єднаний із входом, зазначеним першим в описі прототипу примітива. Відповідно, вхід Enable модуля буде з'єднаний із входом ОЕ примітива TRI.

Якщо деякі із входів примітива не використовуються, то відповідні позиції в списку переданих значень повинні бути залишені порожніми. Проілюструємо це на прикладі текстового опису схеми, наведеної на рис.19.

Рис. 19.

Текстовий опис:

SUBDESIGN Prim_in_line2

(

D_in, CLK, Enadle: INPUT;

D_out: OUTPUT;

)

BEGIN

D_out = DFFE(D_in, CLK,,,Enable);

END;

У даному прикладі використаний примітив DFFE, прототип якого в пакеті MAX+plus II має вигляд:

FUNCTION DFFE (D, CLK, CLRn, PRn, ENA)

RETURNS (Q);

Входи CLRn і PRn примітива в модулі Prim_in_line2 не використовуються, тому їхні позиції виділені в списку переданих значень комами й залишені порожніми.

При зіставленні переданих значень і входів примітива за іменами у списку значень, що передаються, через кому перераховуються: вхід і значення, що передається.

Формат запису:

Вихід модуля (внутрішня змінна) = Ім'я примітива

(ім'я виходу=передане значення, ім'я виходу = передане значення,...);

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

Наведений нижче текстовий опис схеми, логічно еквівалентний текстовому опису модуля Prim_in_line2, ілюструє даний спосіб зіставлення.

SUBDESIGN Prim_in_line3

(

D_in, CLK, Enadle: INPUT;

D_out: OUTPUT;

)

BEGIN

D_out = DFFE(.CLK = CLK,.D = D_in,.ENA = Enable);

END;

Інший спосіб звертання до примітива — звертання до нього як до змінної.

При реалізації цього способу, примітив, насамперед, варто оголосити змінною. Для цього в розділі змінних (Variable Section) символічному імені або групі символічних імен зіставляється примітив. Оголошена в такий спосіб змінна, а так само кожна змінна з оголошеної групи змінних, буде мати той же набір виводів, що й примітив.

Звертання до конкретного виводу примітива здійснюється шляхом вказівки імені змінної, розділяючої крапки й імені виводу примітива.

Як приклад, що ілюструє такий спосіб звертання до примітива, розглянемо текстовий опис схеми, наведеної на рис. 20.

Текстовий опис:

SUBDESIGN PRIM_VAR

(

En_BUSA,En_BUSB,Load,Load,CLK: INPUT;

BUS_A, BUS_B: BIDIR;

)

VARIABLE

RG_BUSA, RG_BUSB: DFFE;

BUF_A, BUF_B: TRI;

BEGIN

(RG_BUSA, RG_BUSB).CLK = CLK;

RG_BUSA.(D, ENA) = (BUS_B, Load);

RG_BUSB.(D, ENA) = (BUS_A, Load);

BUF_A.(IN, OE) = (RG_BUSA.Q,En_BUSA);

BUF_B.(IN, OE) = (RG_BUSB.Q,En_BUSB);

BUS_A = BUF_A.OUT;

BUS_B = BUF_B.OUT;

END;

Рис.2.20.

У даному прикладі оголошені чотири змінні. Змінні RG_BUSA і RG_BUSB позначають примітиви тригерів DFFE, а змінні BUF_A і BUF_B - примітиви буферів з Z станом.

Перше логічне рівняння текстового опису задає з'єднання входу CLK модуля із входами CLK двох тригерів. Четверте логічне рівняння визначає зв'язок виходу Q одного із тригерів (тригера, позначеного RG_BUSA) і входу En_BUSA модуля із входами IN і ОЕ буферa TRI (буфера, позначеного BUF_A). Шосте логічне рівняння описує підключення виходу буфера TRI (буфера, позначеного BUF_A) до виводу BUS_A модуля.

Результати моделювання створеного модуля наведені на рис. 21.

Рис. 21.





Дата публикования: 2014-11-29; Прочитано: 233 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2025 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.751 с)...