Моделювання програмного забезпечення RENESAS ForgeFPGA
Важлива інформація
Симуляція — це техніка застосування різних вхідних стимулів до дизайну в різний час, щоб перевірити, чи код RTL поводиться належним чином. Використовується для перевірки міцності конструкції. Симуляція дозволяє користувачеві view часову діаграму відповідних сигналів, щоб зрозуміти, як опис дизайну в дизайні file поводиться.
Тестові стенди – це фрагменти коду, які використовуються для моделювання. Простий тестовий стенд створить екземпляр тестованого пристрою (UUT) і керує вхідними даними. Програмне забезпечення Go Configure використовує Icarus Verilog (iVerilog) і GTKWave для спостереження за формами сигналів моделювання за допомогою стимулу, наданого на випробувальному стенді.
У цьому документі описано кроки, які необхідно виконати під час інсталяції Icarus у вашій системі та як запустити успішну симуляцію.
Встановлення Icarus Verilog
a. Установіть останню версію Icarus Verilog (IVerilog) з https://bleyer.org/icarus/
b. Обов’язково додайте IVerilog до PATH і дайте йому встановити GTKWave (Див. Малюнок 1)
c. Відкрийте Go Configure Software і виберіть частину: SLG47910(Rev BB), щоб відкрити Forge Workshop (див. Малюнок 2).
d. Клацніть «Редактор FPGA» посередині панелі інструментів угорі або користувач також може двічі клацнути структуру ядра FPGA посередині вікна.
e. Відкриється нове вікно під назвою Майстерня Кузні. На панелі інструментів меню вгорі натисніть «Параметри» → «Параметри». У діалоговому вікні Параметри перейдіть до Інструменти на вкладці Параметри користувача. Зніміть прапорець Використовувати «системне середовище» для Icarus Verilog і GTKWave. Додайте шлях до Iverilog і GTKWave, збережених у вашій системі, у відведене місце (див. Малюнок 4).
Ви готові симулювати тестовий стенд, і наведені вище кроки гарантують автоматичний запуск GTKWave під час моделювання тестового стенду в програмному забезпеченні Go Configure.
Тестовий стенд
Найважливішим кроком для успішного впровадження будь-якої системи є перевірка конструкції та її функціональності. Перевірка складної системи після впровадження апаратного забезпечення є нерозумним вибором. Це неефективно з точки зору грошей, часу та ресурсів. Отже, у випадку FPGA тестовий стенд використовується для тестування вихідного коду Verilog.
Припустімо, у нас є вхідний сигнал із 11 біт, і ми хочемо перевірити пристрій на всі можливі значення комбінації вхідних даних, наприклад (211). Оскільки це дуже велика кількість комбінацій, перевірити її вручну неможливо. У таких випадках тестові стенди дуже корисні, оскільки ви можете автоматично перевірити дизайн для всіх можливих значень і, отже, підтвердити надійність тестового дизайну. Verilog Testbenches використовуються для моделювання та аналізу конструкцій без необхідності будь-якого фізичного апаратного пристрою.
Випробуваний дизайн, скорочено DUT, є синтезованим модулем функціональності, який ми хочемо перевірити. Іншими словами, ми хотіли б перевірити схему схеми. Ми можемо описати наше DUT за допомогою одного з трьох стилів моделювання у Verilog – Gate-level, Dataflow або Behavioral.
Тестовий стенд не можна синтезувати, тому він використовується лише для цілей моделювання. Це дозволяє користувачеві використовувати повний спектр конструкцій Verilog, наприклад, такі ключові слова, як «for», «$display» і «$monitor» тощо для написання тестових стендів. Простий тестовий стенд створить екземпляр тестованого пристрою (UUT) або тестованого пристрою (DUT) і введе вхідні дані.
Розуміння тестового стенду
Визначення шкали часу в Testbench
Під час моделювання програмне забезпечення має знати, як визначено час. Одиниця затримки вказується за допомогою директиви timescale, яка визначає одиницю часу та точність для модулів, які слідують за нею. «Шкала часу» допомагає визначити, що означає №1 у термінах часу. # використовується для визначення затримки, яка буде введена в систему відповідно до одиниці часу, зазначеної в шкалі часу. Отже, #1 означає 1 нс затримки, якщо time_unit вказано в нс.
Синтаксис:
`часовий масштаб / /
time_unit — це кількість часу, яку представляє затримка №1. База time_precision представляє, скільки десяткових знаків точності використовувати відносно одиниць часу. (Див. рядок 23 на малюнку 5)
Ми можемо використовувати конструкції шкали часу, щоб використовувати різні одиниці часу в одному дизайні. Користувач повинен пам'ятати, що специфікації затримки не синтезуються і не можуть бути перетворені в апаратну логіку. Функції затримки призначені виключно для цілей моделювання. $час і $реального часу системні функції повертають поточний час, а стандартний формат звіту можна змінити за допомогою іншого системного завдання $timeformat.
Exampле:
`шкала часу 10us/100ns
`шкала часу 1нс/1пс
#10 скидання = 1; // затримує сигнал на 10 нс
#0.49 $display( “T = %0t at Time #0.49”, $realtime) ;
Вказана затримка становить #0.49, що менше половини одиниці часу. Однак точність часу вказана як 1 пс, і, отже, симулятор не може бути меншим за 1 нс, що змушує його округляти даний оператор затримки та давати 0 нс. Таким чином, ця заява не забезпечує жодної затримки.
Журнал моделювання:
T = 1 у час №0.49
Оголошення модуля
Оголошення модуля в будь-якому тестовому стенді відрізняється від основного коду Verilog. У тестовому стенді модуль оголошується без будь-яких термінальних портів разом із ним. (Див. рядок 25 на малюнку 5)
Синтаксис:
модуль ;
Після оголошення модуля слід визначення вхідних і вихідних сигналів, визначених раніше в основному проекті file.
Ми використовуємо два типи сигналів для управління та моніторингу сигналів під час моделювання. Тип даних reg зберігатиме значення, доки йому не буде призначено нове значення. Цьому типу даних можна присвоїти значення лише в завжди або початковому блоці.
Тип даних wire схожий на тип фізичного з’єднання. Він зберігатиме значення, кероване портом, інструкцією assign або reg. Цей тип даних не можна використовувати в початковому або завжди блоці. У цьому розділі також виконується оголошення будь-яких параметрів і цілих чисел.
Exampле:
Reg a,b; // введення в код HDL визначається як reg у тестовому стенді
Провід y; // вихідний сигнал у HDL визначається як дріт у тестовому стенді
Примірник DUT
Мета тестового стенду — перевірити, чи функціонує наш модуль DUT. Отже, нам потрібно створити екземпляр нашого модуля розробки для тестового модуля.
Синтаксис:
(. (сигнал1), . сигнал1>(сигнал2));
Exampле:
ALU d0 (.a(a), // сигнал «a» в ALU має бути з’єднаний з «a» в модулі ALU_tb
.b(b), // сигнал “b” в ALU має бути з’єднаний з “b” в модулі ALU_tb
.c(c)) ;// сигнал “c” в ALU має бути з’єднаний з “c” в модулі ALU_tb
Ми створили екземпляр ALU модуля DUT для тестового модуля. Ім'я екземпляра (d0) вибирає користувач. Сигнали з крапкою «.» перед ними знаходяться назви сигналів всередині модуля ALU, тоді як дріт або реєстр, до якого вони підключаються на випробувальному стенді, знаходиться поруч із сигналом у дужках (). Рекомендується кодувати кожне підключення порту в окремому рядку, щоб будь-яке повідомлення про помилку компіляції правильно вказувало на номер рядка, де сталася помилка. Оскільки ці зв’язки встановлюються за іменами, порядок, у якому вони з’являються, не має значення.
Екземпляр DUT також можна зробити для модулів, у яких модуль тестового стенду має різні назви сигналів. Правильне відображення сигналів є важливим під час створення екземплярів.
Example:
ALU d0 (.a(A), // сигнал «a» в ALU має бути з’єднаний з «A» в модулі ALU_tb
.clk(clock), // сигнал “clk” в ALU має бути підключений до модуля “clock” ALU_tb
.out(OUT)); // сигнал “out” в ALU повинен бути з’єднаний з “OUT” в модулі ALU_tb
Завжди та початковий блок у тестовому стенді
У Verilog є два послідовних блоки, початковий і завжди. Саме в цих блоках ми застосовуємо стимул.
Початковий блок
Початковий блок, який виконується лише один раз і завершується, коли виконується останній рядок блоку. Стимул записується в початковий блок. (Див. рядки 54-72 на малюнку 5)
Синтаксис:
..
початковий початок
$dumpfile();
$dumpvars();
..(введіть стимул)
кінець
початковий блок починає своє виконання на початку симуляції в момент часу t = 0. Починаючи з першого рядка між початком і кінцем, кожен рядок виконується зверху вниз, доки не буде досягнуто затримку. Коли затримка досягнута, виконання цього блоку очікує, доки не мине час затримки (10 одиниць часу), а потім знову розпочинає виконання.
Користувач може визначати стимули за допомогою циклів (for, while, if-else) також у цьому початковому блоці замість того, щоб вводити всі комбінації вручну.
Example:
Початковий початок
А = 0; b = 0; // почати виконання
#10 a = 0; b = 1; // виконання в t = 10 одиниць часу
#10 a = 1; b = 0; // виконання в t = 20 одиниць часу
кінець
Дамп Files
Ще одна річ, про яку слід пам’ятати, – це декларування долзвалищеfiles і $дампвари всередині початкового блоку (див. рядки 55-56 на малюнку 5). $звалищеfile використовується для скидання змін у значеннях мереж і регістрів в a file який називається його аргументом.
наприкладampле:
$звалищеfile(“alu_tb.vcd”);
скине зміни в a file під назвою alu_tb.vcd. Зміни записуються в a file називається VCD file що означає дамп зміни значення. VCD (дамп зміни значення) зберігає всю інформацію про зміни значення. Ми не можемо мати більше одного $dumpfile заяви в симуляції Verilog.
$дампвари використовується для визначення того, які змінні потрібно скинути (у file згаданий $dumpfile). Найпростіший спосіб використовувати це без аргументів. Загальний синтаксис $dumpvars такий
$дампвари ( <, >);
По суті, ми можемо вказати, які модулі та які змінні в модулях буде скинуто. Найпростіший спосіб використовувати це — встановити рівень 0 і назву модуля як верхнього модуля (зазвичай це верхній модуль тестового стенду).
$дампвари(0, alu_tb);
Якщо для рівня встановлено значення 0 і вказано лише ім’я модуля, він створює дамп УСІХ змінних цього модуля та всіх змінних у ВСІХ модулях нижчого рівня, створених цим верхнім модулем. Якщо будь-який модуль не створено цим верхнім модулем, його змінна не буде охоплена. Ще одна річ, декларація $звалищеfile має стояти перед $dumpvars або будь-якими іншими системними завданнями, які вказують dump. Ці смітники files має бути оголошено перед введенням стимулів, інакше жодне значення не буде збережено в цьому дампі files.
Завжди блокувати
На відміну від початкових операторів, завжди блок виконується повторно, хоча виконання починається в момент часу t = 0. Для прикладуampНаприклад, тактовий сигнал необхідний для роботи послідовних схем, таких як тригери. Його необхідно подавати постійно. Отже, ми можемо написати код для роботи годинника в тестовому стенді як (див. рядок 52 на малюнку 5):
завжди
#10 clk = ~clk;
кінцевий модуль
Наведений вище оператор виконується через 10 нс, починаючи з t = 0. Значення clk буде інвертовано через 10 нс від попереднього значення. Таким чином, генерується тактовий сигнал тривалістю імпульсу 20 нс. Отже, цей оператор генерує сигнал частотою 50 МГц. Важливо відзначити, що ініціалізація сигналу виконується перед блоком завжди. Якщо ми не виконуємо частину ініціалізації, сигнал clk буде x від t – 0, а через 10 нс він буде інвертований до іншого x.
Тестовий стенд для самоперевірки
Тестовий стенд із самоперевіркою містить інструкцію для перевірки поточного стану.
- $дисплей системні завдання в основному використовуються для відображення повідомлень налагодження для відстеження потоку моделювання
початковий початок
А = 0; b = 0; c = 0; #10; // застосувати введення, почекати
if( y ! == 1) почати
$display(“000 не вдалося”); // перевірити
c = 1; #10 ; // застосувати введення, почекати
кінець
інакше якщо ( y ! == 0) почати
$display(“001 не вдалося”) // перевірка
b = 1; c = 0; #10 ; кінець
інакше якщо (y!==0)
$display (« 010 не вдалося»); // перевірити
кінець
кінцевий модуль
$дисплей використовується для відображення значень змінних, рядків або виразів. З наведеного вище прample, коли будь-який із циклів if-else задовольняється, журнал симулятора відображатиме відповідний $дисплей заява. За замовчуванням у кінці рядків є новий рядок.
$дисплей (“час = %t, A = %b, B = %b, C = % b”, $час, A, B, C);
Символи, згадані в лапках, будуть надруковані без змін. Буква разом із % позначає формат рядка. Ми використовуємо %b для представлення двійкових даних. Ми можемо використовувати %d, %h, %o для представлення десяткової, шістнадцяткової та вісімкової систем відповідно. %g використовується для вираження дійсних чисел. Їх буде замінено значеннями поза лапками у зазначеному порядку. наприкладample, наведений вище оператор буде відображено в журналі моделювання як: час = 20, A = 0, B =1, C = 0
Таблиця 1. Формати таблиць Verilog
Аргумент | опис |
%h, %H | Відображення в шістнадцятковому форматі |
%d, %D | Відображення в десятковій формі |
%b, %B | Відображення в двійковому форматі |
%m, %M | Відображення ієрархічного імені |
%s, %S | Відображати як рядок |
%t, %T | Відображення у форматі часу |
%f, %F | Відображати «реальний» у десятковому форматі |
%e, %E | Відображення «реального» в експоненціальному форматі |
$дисплей в основному друкує дані або змінні такими, якими вони є на той момент, як printf у C. Ми повинні згадати $дисплей для будь-якого тексту, який ми маємо view в журналі моделювання.
- $час
$час це системне завдання, яке повертає поточний час симуляції.
- $монітор
$монітор контролюватиме дані або змінну, для якої він написаний, і щоразу, коли змінна змінюватиметься, друкуватиме
змінене значення. Він досягає подібного ефекту виклику $display після кожного отримання будь-якого з його аргументів
оновлено. $монітор схоже на завдання, яке створюється для виконання у фоновому режимі головного потоку, який відстежує та
відображає зміни значень своїх змінних аргументів. $монітор має той самий синтаксис, що й $дисплей.
$монітор(“ час = %t, A = %b, B = %b, C = % b”, $час, A, B, C);
На малюнку 7 можна помітити, що додано нові рядки коду для самооцінки тестового стенду. Розміщення $дисплей і $монітор оператори в різних розділах тестового стенда дадуть різні результати (див. Малюнок 8). $час згаданий у цих операторах друкує час, для якого друкується значення. У той же час одиниця, скажімо, 170000 XNUMX, ми можемо побачити, яка різниця між значеннями для A і B через $дисплей і $монітор заяви.
Програмне забезпечення GTKWave
GTKWave — це повнофункціональна хвиля GTK+ viewer для Unix, Win32 і Mac OSX, який читає LXT, LXT2, VZT, FST і GHW files, а також стандартні VCD/EVCD files і дозволяє їх viewінж. Його офіційно webсайт знаходиться на http://gtkwave.sourceforge.net/ . Рекомендується GTKWave viewer від інструменту моделювання Icarus Verilog.
Після того, як користувач успішно створив тестовий стенд для перевірки функціональності дизайну, користувач тепер може використовувати програмне забезпечення GTKWave для view хвилі.
Щоб запустити програмне забезпечення GTKWave, щоб view для сигналів, користувач повинен натиснути кнопку Simulate Testbench у верхній частині панелі інструментів або в головному меню Tools→ Simulation→ Simulate Testbench. Якщо немає синтаксичних помилок, то, залежно від дизайну, GTKWave має бути запущено автоматично або результати стимулів у тестовому стенді відображатимуться у розділі вікна Logger.
Програма GTKWave відкриває дамп формату .vcdfile автоматично. У вікні GTKWave не відображається сигнал, коли воно відкривається. Це дає користувачеві можливість вибрати, які сигнали йому потрібні view і спостерігати. Щоб вибрати сигнал, користувач повинен відобразити, користувачеві потрібно клацнути назву свого модуля/примірника в лівій частині вікна під вкладкою SST. Натиснувши + на кожному екземплярі, ви зможете побачити сигнали, пов’язані з цим екземпляром, у нижньому розділі. Потім ви можете перетягнути потрібний сигнал або двічі клацнути його, щоб відобразити його у вікні Сигнали. Ви також можете вибрати всі (CTRL + A) і вставити їх у вікно сигналів (див. Малюнок 9).
Сигнали тепер додано до вікна сигналів, але його ще потрібно змоделювати. Додавши потрібні сигнали у вікно сигналів, натисніть щоб підігнати сигнали до поточної ширини вікна, а потім перезавантажити сигнали з перезавантаження
на панелі інструментів. Тепер ви можете бачити сигнали з відповідними значеннями.
Значення сигналу
За замовчуванням значення сигналів є у шістнадцятковому форматі, а всі хвилі пофарбовані в зелений колір (якщо вони працюють правильно).
Користувач може змінити властивості цих сигналів, клацнувши сигнал правою кнопкою миші та вибравши Формат даних або Формат кольору. Користувач також може вставити порожній сигнал, щоб створити розділи між групами сигналів. Коли ви отримаєте бажаний оптичний результат, ви можете зберегти свої конфігурації, перейшовши File → Написати Зберегти File.
Панель інструментів GTKWave
Панель інструментів (див. Малюнок 10) дозволяє користувачеві виконувати основні функції для сигналу. Давайте обговоримо кожен параметр на панелі інструментів зліва направо.
- Параметри меню: За цим варіантом ми можемо view усі різноманітні функції програмного забезпечення, які можна використовувати для використання програмного забезпечення. Подробиці цього пункту меню описано в Розділі 8 цього посібника користувача.
- Вирізати сліди: Використовується для видалення/вирізання сигналу вибору з вікна сигналу
- Копіювати сліди: Використовується для копіювання вибраного сигналу з вікна сигналу
- Вставити сліди: скопійований/вирізаний слід можна вставити в інше місце у вікні сигналу
- Zoom Fit: використовується для підгонки сигналів відповідно до розміру вікна, яке користувач вибирає для відображення
- Збільшити: використовується для збільшення вікна сигналу
- Зменшити: використовується для зменшення вікна сигналу
- Скасувати масштаб: використовується для скасування збільшення/зменшення вікна сигналу
- Збільшити, щоб почати: це збільшить вікно сигналу, відображаючи час початку сигналів.
- Збільшити до кінця: це збільшить масштаб вікна сигналу, що відображає час закінчення сигналів
- Знайти попереднє ребро: Це зсуває маркер ліворуч, вказуючи на попередній край
- Знайти наступне ребро: Це зсуває маркер праворуч, вказуючи на наступний край
- Прокручуйте нижню/верхню зв'язку: за допомогою цього ми можемо встановити часовий проміжок, протягом якого користувач хоче відображати. наприкладample, ми можемо встановити часовий проміжок від 0 секунд до 500 нс, він відображатиме сигнали лише цієї тривалості.
- Перезавантажити: Перезавантаження натискається щоразу, коли відбувається зміна відображуваного сигналу. Він перезавантажить і відобразить сигнал відповідно до нових параметрів. наприкладampнаприклад, після зміни часових рамок сигналу нам потрібно перезавантажити сигнал, щоб відобразити сигнал у новій встановленій часовій рамці.
Параметри меню
З лівого верхнього кута програмного забезпечення GTKWave користувач може отримати доступ до параметрів меню, натиснувши три вертикальні лінії (див. Малюнок 11). У розділі меню користувач може знайти наступні параметри:
File
The File підменю містить різноманітні елементи, пов’язані з доступом files, імпорт-експорт VCD files, друк і читання/запис files і вихід.
Редагувати
Підменю «Редагувати» використовується для виконання різноманітних службових функцій, таких як зміна представлення даних значень у підвікні хвилі. За допомогою параметрів у підменю «Редагувати» користувач може змінювати формат даних сигналів, переставляти їх, зміщувати, обрізати, виділяти, групувати сигнали, коментувати сигнали, змінювати колір сигналів тощо.
Пошук
Підменю «Пошук» використовується для пошуку назв мереж і значень. Це допомагає виконувати функції на різних рівнях ієрархії сигналів і екземплярів у VCD file.
час
Підменю часу містить набір функцій, які виконуються кнопками навігації та панелі стану.
Він дає змогу виконувати такі прості, пов’язані з часом функції, як масштабування, перехід до певної точки часу, зміщення сигналу в певному напрямку тощо.
Маркер
Підменю маркера використовується для виконання різноманітних маніпуляцій з маркером, а також керування прокручуванням поза екраном.
Він дає змогу додавати численні маркери у вікно сигналу. Дозволено максимум 26 маркерів імен, і час для всіх має бути різним.
a. Щоб додати маркери у вікно сигналу
Клацніть лівою кнопкою миші в потрібній точці, де ви хочете розмістити маркер, і натисніть ALT + N. Це розмістить іменований маркер (A, B, C тощо) у потрібній точці. Користувач може продовжувати робити це для 26 різних часових місць.
Щоб порівняти значення часу в усіх маркерах місць, скористайтеся Меню → Маркери → Показати дані маркера зміни.
Це відкриє вікно зі значенням часу для кожного маркера. Користувач може вручну записати значення часу на кожному розміщеному маркері та відняти їх, щоб обчислити різницю в часі між 2 маркерами.
b. Щоб видалити маркер у вікні сигналу
Користувач може перейти до Меню → Маркери → Зібрати іменований маркер. Це видалить останній маркер, розміщений у вікні сигналу. Користувач може видалити всі іменовані маркери, перейшовши до Меню → Маркери → Зібрати всі іменовані маркери (Малюнок 12).
На малюнку 13 ми можемо побачити, як змінилися кольори сигналу. Ви також можете побачити порожній сигнал, доданий у вікно сигналу з коментарем – порожній сигнал.
Також зверніть увагу на наявність 6 іменованих маркерів (A – E) і обчислення значення часу між цими маркерами в ps.
View
The View Підменю використовується для керування різними атрибутами, пов’язаними з графічним відображенням елементів стану, а також значень у підвікні сигналу. У цьому меню ви можете перетворити вікно сигналу на чорно-біле або кольорове. The View підменю також дає змогу змінювати вимірювання часу в діапазоні від секунд (секунд) до фікосекунд (фс). Користувач може знайти цю опцію View → Масштабувати до вимірювання часу → fs.
Довідка
Підменю довідки містить параметри для активації онлайн-довідки, а також відображення інформації про версію програми.
Висновок
Цей документ було створено, щоб допомогти користувачеві успішно змоделювати їхню конструкцію та перевірити функціональність шляхом виправлення складання необхідного випробувального стенду та використання Icarus Verilog разом із GTKWave для відображення сигналів і спостереження за результатами.
Історія версій
Ревізія | Дата | опис |
1.00 | 20 травня 2024 р | Початковий випуск. |
R19US0011EU0100 Ред.1.0
20 травня 2024 р
© 2024 Renesas Electronics
Документи / Ресурси
![]() |
Моделювання програмного забезпечення RENESAS ForgeFPGA [pdfПосібник користувача REN_r19us0011eu0100, програмне моделювання ForgeFPGA, програмне забезпечення ForgeFPGA, ForgeFPGA, моделювання ForgeFPGA, програмне моделювання, моделювання, програмне забезпечення |