Симулација на софтвер RENESAS ForgeFPGA

Симулација на софтвер RENESAS ForgeFPGA

Важни информации

Симулацијата е техника на примена на различни влезни стимулации на дизајнот во различни времиња за да се провери дали RTL кодот се однесува на планираниот начин. Се користи за да се потврди робусноста на дизајнот. Симулацијата му овозможува на корисникот да view временскиот дијаграм на поврзаните сигнали за да се разбере како дизајн опис во дизајнот file се однесува.

Тест бенчовите се парчиња код што се користат за симулација. Едноставна клупа за тестирање ќе го инстанцира Unit Under Test (UUT) и ќе го придвижи влезот. Софтверот Go Configure користи Icarus Verilog (iVerilog) и GTKWave за да ги набљудува симулациските бранови форми со стимулацијата обезбедена во тест-клупата.

Овој документ ги опишува чекорите што треба да се преземат при инсталирање на Icarus на вашиот систем и како да се изврши успешна симулација.

Инсталирање на Icarus Verilog

a. Инсталирајте ја најновата верзија на Icarus Verilog (IVerilog) од https://bleyer.org/icarus/
b. Погрижете се да додадете IVerilog на PATH и оставете го да инсталира GTKWave (види слика 1)
Инсталирање на Icarus Verilog

c. Отворете го софтверот Go Configure и изберете го делот: SLG47910 (Rev BB) за да ја отворите работилницата Forge (видете Слика 2).
Инсталирање на Icarus Verilog

d. Кликнете на уредувачот FPGA во средината на лентата со алатки на врвот или, исто така, корисникот може да кликне двапати на структурата FPGA Core во средината на прозорецот.
Инсталирање на Icarus Verilog

e. Се отвора нов прозорец наречен Forge Workshop. Во лентата со алатки на менито на врвот, кликнете на Опции → Поставки. Во полето за дијалог Поставки, одете во Алатки во картичката Кориснички поставки. Отштиклирајте го „Користете го полето за системско опкружување“ и за Icarus Verilog и за GTKWave. Додајте ја патеката до Iverilog и GTKWave зачувани во вашиот систем во дадениот простор (види Слика 4).
Инсталирање на Icarus Verilog

Сите сте подготвени да симулирате тест-клупа и горенаведените чекори гарантираат дека GTKWave се стартува автоматски кога се симулира тест-бенч на софтверот Go Configure.

Тест клупа

Најважниот чекор за успешно имплементирање на кој било систем е да се потврди дизајнот и неговата функционалност. Потврдувањето на сложен систем по имплементацијата на хардверот не е мудар избор. Тоа е неефикасно во однос на пари, време и ресурси. Оттука, во случајот на FPGA, се користи тест бенч за тестирање на изворниот код на Verilog.

Да претпоставиме дека имаме влез кој е од 11 бита и сакаме да го тестираме уредот за сите можни влезни комбинации на вредности, т.е. (211). Бидејќи ова е многу голем број комбинации, невозможно е да се тестира рачно. Во такви случаи, тест-клупите се многу корисни бидејќи можете автоматски да го тестирате дизајнот за сите можни вредности и оттука, да ја потврдите веродостојноста на дизајнот за тестирање. Verilog Testbenches се користат за симулирање и анализа на дизајни без потреба од физички хардверски уред.

Дизајнот што се тестира, скратено како DUT, е синтетизиран модул на функционалноста што сакаме да ја тестираме. Со други зборови, дизајнот на колото би сакале да го тестираме. Можеме да го опишеме нашиот DUT користејќи еден од трите стилови на моделирање во Verilog - Gate-level, Dataflow или Behavioral.

Тестната маса не може да се синтетизира, па затоа се користи само за симулациски цели. Ова му овозможува на корисникот да користи целосен опсег на конструкции на Verilog, на пр., клучни зборови како што се „за“, „$display“ и „$monitor“ итн. за пишување тест клупи. Едноставна клупа за тестирање ќе ги инстанцира Unit Under Test (UUT) или Device Under Test (DUT) и влезовите на уредот.

Разбирање на тест-бенч

Разбирање на тест-бенч

Дефиниција на временска рамка во Testbench

При симулирање, софтверот треба да знае како е дефинирано времето. Единицата за одложување се одредува со помош на директивата за временска скала, која ја одредува временската единица и прецизноста за модулите што ја следат. Временската скала помага да се одреди што значи #1 во однос на времето. # се користи за дефинирање на доцнењето што треба да се воведе во системот во согласност со временската единица наведена во временската скала. Значи, #1 значи 1 ns доцнење ако временската_единица е во ns.

Синтакса:
`временска рамка / /

време_единица е износот на времето што го претставува доцнењето од #1. Основата time_precision претставува колку децимални точки на прецизност да се користат во однос на временските единици. (Види линија 23 на Слика 5)

Можеме да ги користиме конструкциите за временска скала за да користиме различни временски единици во ист дизајн. Корисникот треба да запомни дека спецификациите за одложување не се синтетизираат и не можат да се претворат во хардверска логика. Функциите за одложување се целосно за симулациски цели. $време и $реално време системските функции го враќаат тековното време и стандардниот формат за известување може да се смени со друга системска задача $timeformat .

Exampле: 

`временска скала 10 us/100 s
`временска скала 1s/1ps
# 10 ресетирање = 1; // го одложува сигналот за 10 ns
#0.49 $display( „T = %0t во време #0.49“, $реално време) ;

Наведеното доцнење е #0.49 што е помалку од половина единица време. Сепак, прецизноста на времето е наведена да биде 1ps и оттука симулаторот не може да биде помал од 1ns, што го прави да ја заокружи дадената изјава за одложување и да даде 0ns. Значи, оваа изјава не дава никакво одложување.

Дневник за симулација: 

Т = 1 во време #0.49

Декларација за модул

Декларацијата на модулот во која било тест бенч е за разлика од главниот код на Verilog. Во тест бенч, модулот е деклариран без никакви терминални порти заедно со него. (Види линија 25 на Слика 5)

Синтакса: 

модул ;

Декларацијата на модулот е проследена со дефинирање на влезните и излезните сигнали дефинирани претходно во главниот дизајн file.
Ние користиме два типа сигнали за возење и следење на сигналите за време на симулацијата. Типот на податоци reg ќе ја задржи вредноста додека не му се додели нова вредност. На овој податочен тип може да му се додели вредност само во секогаш или во почетниот блок.
Типот на податоци на жицата е како оној на физичка врска. Ќе ја задржи вредноста што е управувана од порта, изјава за доделување или reg. Овој тип на податоци не може да се користи во почетен или секогаш блок. Секој параметар и декларација на цели броеви се исто така направени во овој дел.

Exampле:
Рег a,b; // влезот во HDL кодот е дефиниран како reg во тестбенч
Жица y; // излезниот сигнал во HDL е дефиниран како жица во тест-бенч

DUT Instantiation

Целта на тест-бенч е да потврди дали нашиот 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 модулот

Го инстанциравме DUT-модулот ALU на тест-модулот. Името на примерот (d0) е избор на корисникот. Сигналите со точка „.” пред нив се имињата на сигналите во ALU модулот, додека жицата или регот на кој се поврзуваат во тест клупата се до сигналот во заграда (). Се препорачува секоја конекција на портот да се шифрира во посебна линија, така што секоја порака за грешка при компилацијата правилно ќе укаже на бројот на линијата каде што настанала грешката. Бидејќи овие врски се направени по име, редоследот по кој се појавуваат е ирелевантен.

Исто така, може да се направи DUT инстанција за модулите каде што модулот за тестирање има различни имиња на сигнали. Правилното мапирање на сигналите е она што е важно при инстантирање.

Exampле: 

ALU d0 (.a(A), // сигналот „a“ во ALU треба да се поврзе со „A“ во ALU_tb модулот
.clk(clock), // сигналот „clk“ во ALU треба да се поврзе со „clock“ ALU_tb модулот
.излез(ИЗЛЕЗ)) ; // сигналот „out“ во ALU треба да се поврзе со „OUT“ во ALU_tb модулот

Секогаш и почетен блок во тест-клупа

Постојат два секвенцијални блока во Verilog, почетни и секогаш. Токму во овие блокови го применуваме стимулот.

Почетен блок

Почетниот блок кој се извршува само еднаш и завршува кога ќе се изврши последната линија од блокот. Стимулот е запишан во почетниот блок. (Види линија 54-72 на Слика 5)

Синтакса:
..
почетен почеток
$ депонијаfile();
$dumpvars();
..(внеси стимул)
крај

почетниот блок го започнува своето извршување на почетокот на симулацијата во времето t = 0. Почнувајќи од првата линија помеѓу почетокот и крајот, секоја линија се извршува од врвот до дното додека не се постигне доцнење. Кога ќе се достигне доцнењето, извршувањето на овој блок чека додека не помине времето на одложување (10-временски единици) и потоа повторно започнува извршување.
Корисникот може да дефинира стимули користејќи јамки (за, додека, ако-друго), како и во овој почетен блок наместо рачно да ги внесува сите комбинации.
Почетен блок

 

Exampле:
Почетен почеток
A = 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. Промените се евидентираат во а file наречен VCD file што значи депонија за промена на вредноста. VCD (value change dump) ги складира сите информации за промените на вредноста. Не можеме да имаме повеќе од еден $dumpfile изјави во Verilog симулација.

На $дампвари се користи за да се специфицира кои променливи треба да се фрлат (во file споменати од $dumpfile). Наједноставниот начин да се користи е без никаков аргумент. Општата синтакса на $dumpvars е

$дампвари ( <, >);

Во основа можеме да одредиме кои модули и кои променливи во модулите ќе бидат исфрлени. Наједноставниот начин да го искористите ова е да го поставите нивото на 0 и името на модулот како врвен модул (обично модул на горниот тестбенч).

$дампвари(0, alu_tb);

Кога нивото е поставено на 0, а само името на модулот е наведено, тој ги исфрла СИТЕ променливи на тој модул и сите променливи во СИТЕ модули од пониско ниво инстанцирани од овој врвен модул. Ако некој модул не е инстанциран од овој врвен модул, тогаш неговата променлива нема да биде покриена. Уште една работа, декларацијата од $депонијаfile мора да дојде пред $dumpvars или која било друга системска задача што го одредува dump. Овие депонија files мора да се декларира пред влезните стимули на друго место, ниедна вредност нема да биде зачувана во овие депонии files.

Секогаш блокирај

Спротивно на првичните изјави, блокот секогаш се извршува постојано, иако извршувањето започнува во времето t = 0. На пр.ampТака, сигналот на часовникот е суштински за работа на секвенцијални кола како што се Flip-flops. Потребно е постојано да се снабдува. Оттука, можеме да го напишеме кодот за работа на часовникот во тест бенч како (види линија 52 на Слика 5):

секогаш
#10 clk = ~clk;
крајниот модул

Горенаведената изјава се извршува по 10 ns почнувајќи од t = 0. Вредноста на clk ќе се преврти по 10 ns од претходната вредност. Така, генерирајќи такт-сигнал од 20 ns ширина на импулсот. Затоа, оваа изјава генерира сигнал со фреквенција 50 MHz. Важно е да се напомене дека иницијализацијата на сигналот се врши пред блокот секогаш. Ако не го направиме делот за иницијализација, clk сигналот ќе биде x од t – 0, а по 10 ns, ќе се преврти во друг x.

Самопроверка за тестирање

Тестната маса за самопроверка вклучува изјава за проверка на моменталната состојба.

  • $приказ системската задача главно се користи за прикажување на пораки за отстранување грешки за следење на текот на симулацијата

почетен почеток
A = 0; b = 0; c = 0; # 10; // примени внесување, почекајте
ако( y ! == 1) започне
$display( „000 неуспешни“); //проверете
c = 1; #10; //примени внесување, почекај
крај
друго ако ( y ! == 0) започне
$display („001 не успеа“) // проверете
b = 1; c = 0; #10; крај
друго ако(y!==0)
$display („ 010 не успеа“); //проверете
крај
крајниот модул

$приказ се користи за прикажување вредности на променливи, низи или изрази. Од горенаведеното прampле, секогаш кога некој од циклусот if-else е задоволен, дневникот на симулаторот ќе го прикаже соодветниот $приказ изјава. Стандардно има нова линија на крајот од низите.

$приказ („време = %t , A = %b, B = %b, C = % b“, $време, А, Б, Ц);

Ликовите споменати во наводниците ќе бидат испечатени како што се. Буквата заедно со % го означува форматот на низата. Ние користиме %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“, $време, А, Б, Ц);
Самопроверка за тестирање

Од Слика 7 можете да забележите дека се додадени нови линии на кодови за самоевалуација на тест-клупата. Поставувањето на $приказ и $монитор изјавите во различни делови од тест-клупата ќе дадат различни резултати (види Слика 8). $време споменати во овие изјави го печатат времето за кое се печати вредноста. Во исто време единица да речеме 170000, можеме да видиме како има разлика во вредноста за А и Б поради $приказ и $монитор изјави.
Самопроверка за тестирање

Софтвер GTKWave

GTKWave е целосно опремен GTK+ бран viewer за Unix, Win32 и Mac OSX кој чита LXT, LXT2, VZT, FST и GHW files како и стандардните VCD/EVCD fileи им овозможува на нивните 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).
Софтвер GTKWave

Сигналите сега се додадени во сигналниот прозорец, но допрва треба да се симулира. Откако ќе ги додадете саканите сигнали во прозорецот за сигнал, кликнете наСимбол за да ги собере сигналите на моменталната ширина на прозорецот и потоа повторно да ги вчита сигналите од повторното вчитувањеСимбол симбол присутен на лентата со алатки. Сега можете да ги видите сигналите со нивните соодветни вредности.

Вредности на сигналот

Стандардно, вредностите на сигналите се во хексадецимален формат и сите бранови се обоени со зелена боја (ако се работи правилно).

Корисникот може да ги промени својствата на овие сигнали со десен клик на сигналот и избирање Формат на податоци или Формат на боја. Корисникот исто така може да вметне празен сигнал за да направи секции помеѓу група сигнали. Кога ќе го имате посакуваниот оптички резултат, можете да ги зачувате вашите конфигурации со одење File → Напиши Зачувај File.

Лента со алатки GTKWave

Лентата со алатки (види Слика 10) му овозможува на корисникот да ги извршува основните функции за сигналот. Дозволете ни да разговараме за секоја опција на лентата со алатки од лево кон десно.
Лента со алатки GTKWave

  1. Опции на менито: Под оваа опција можеме view сите различни карактеристики на софтверот што може да се користат за играње со софтверот. Деталите под оваа опција од менито се опфатени во Дел 8 од ова упатство за корисникот.
  2. Исечете траги: Се користи за бришење/сечење на сигналот за избор од прозорецот за сигнал
  3. Копирај траги: Се користи за копирање на избраниот сигнал од прозорецот за сигнал
  4. Вметни траги: Копираната/отсечената трага може да се залепи на друга локација во сигналниот прозорец
  5. Zoom Fit: Се користи за прилагодување на сигналите според големината на прозорецот што корисникот избира да го прикаже
  6. Зумирајте: Се користи за зумирање на прозорецот за сигнал
  7. Одзумирај: Се користи за одзумирање на прозорецот за сигнал
  8. Зум Врати: се користи за поништување на зумирањето/одмалувањето на сигналниот прозорец
  9. Зумирајте за да започнете: ова ќе го зумира прозорецот на сигналот, прикажувајќи го времето на започнување на сигналите.
  10. Зумирајте до крај: ова ќе го зумира прозорецот за сигнал кој го прикажува времето на завршување на сигналите
  11. Најдете го претходниот раб: Ова го поместува маркерот на левата страна што го покажува претходниот раб
  12. Најдете го следниот раб: Ова го поместува маркерот надесно што го покажува следниот раб
  13. Скролувајте долна/горна врска: користејќи го ова можеме да ја поставиме временската рамка во која корисникот сака да се прикаже. За прampможе да ја поставиме временската рамка од 0 сек до 500 ns, таа ќе ги прикаже сигналите само за тоа времетраење.
  14. Вчитај повторно: Повторното вчитување се притиска секогаш кога има промена на прикажаниот сигнал. Ќе се вчита повторно и ќе го прикаже сигналот според новите параметри. За прample, по промената на временската рамка на сигналот, треба повторно да го вчитаме сигналот за да го прикаже сигналот во новата поставена временска рамка.

Опции на менито

Од горниот лев агол на софтверот GTKWave, корисникот може да пристапи до опциите на менито со кликнување на трите вертикални линии (види Слика 11). Корисникот може да ги најде следниве опции под опциите на менито:
Опции на менито

File

На File подменито содржи различни ставки поврзани со пристапот files, увоз-извоз на VCD files, печатење и читање/пишување fileи излегување.

Уреди

Подменито Уреди се користи за извршување на различни корисни функции како што е промена на приказот на податоци на вредностите во потпрозорецот на бранови. Користејќи ги опциите во подменито Уреди, корисникот може да го менува форматот на податоци на сигналите, да ги преуреди, да ги преместува, да ги скрати, да ги истакнува, да групира сигнали, да коментира сигнали, да ја менува бојата на сигналите итн.

Барај

Подменито Search се користи за пребарување на имиња и вредности на нето. Помага да се извршуваат функции на различни хиерархиски нивоа на сигналите и инстанците во VCD file.

Време

Подменито време содржи супермножество од функциите што ги извршуваат копчињата Навигација и Панел за статус.
Овозможува едноставни функции поврзани со времето како зумирање, преместување во одредена временска точка, поместување на сигналот во одредена насока итн.

Маркер

Подменито за маркер се користи за извршување на различни манипулации на маркерот, како и за контрола на лизгање надвор од екранот.
Овозможува функционалност за додавање бројни маркери на сигналниот прозорец. Дозволени се најмногу 26 маркери за имиња и времето за сите мора да биде различно.

a. За да додадете Маркери во прозорецот за сигнал
Лево кликнете на потребната точка каде што сакате да се постави Маркерот и притиснете ALT + N. Ова ќе постави именуван маркер (A,B,C, итн.) на бараната точка. Корисникот може да продолжи да го прави ова за 26 различни временски локации.
За да ја споредите вредноста на времето на сите маркери за места, Мени → Маркери → Прикажи Промени податоци за маркерот.
Ова ќе отвори прозорец со временската вредност на секој маркер. Корисникот може рачно да ја забележи временската вредност на секој поставен маркер и да ги одземе за да ја пресмета временската разлика помеѓу 2 маркери.
b. За да го отстраните Маркерот во прозорецот за сигнал

Корисникот може да оди во Мени → Маркери → Собери именуван маркер. Ова ќе го отстрани презимениот маркер поставен во прозорецот за сигнал. Корисникот може да ги отстрани сите именувани маркери со одење во Мени → Маркери → Собери ги сите именувани маркери (Слика 12).
Опции на менито

На Слика 13, можеме да видиме како се сменети боите на сигналот. Можете да набљудувате празен сигнал додаден на прозорецот за сигнал, исто така, со коментар - Празен сигнал.
Забележете го и присуството на 6 именувани маркери (A – E) и пресметката на временската вредност помеѓу овие маркери во ps.
Опции на менито

View

На View подменито се користи за контрола на различни атрибути кои се занимаваат со графичко прикажување на статусните ставки, како и вредностите во подпрозорецот на сигналот. Од ова мени, можете да го конвертирате сигналниот прозорец во Црно-бело или исто така во боја. На View подменито исто така ви овозможува да го промените времето Dimension во опсег од секунди (сек) до фикосекунди (fs). Корисникот може да ја најде оваа опција View → Скала до временска димензија → fs.

Помош

Подменито за помош содржи опции за овозможување помош преку Интернет, како и прикажување информации за верзијата на програмата.

Заклучок

Овој документ е создаден за да му помогне на корисникот успешно да го симулира својот дизајн и да ја потврди функционалноста со корекција на нацртот на потребната тест клупа и користење на Icarus Verilog заедно со GTKWave за прикажување на брановите форми и набљудување на резултатите.

Историја на ревизии

Ревизија Датум Опис
1.00 20 мај 2024 година Почетно ослободување.

R19US0011EU0100 Rev.1.0
20 мај 2024 година
© 2024 Ренесас Електроникс
Лого

Документи / ресурси

Симулација на софтвер RENESAS ForgeFPGA [pdf] Упатство за корисникот
REN_r19us0011eu0100, ForgeFPGA софтверска симулација, ForgeFPGA софтвер, ForgeFPGA, ForgeFPGA симулација, софтверска симулација, симулација, софтвер

Референци

Оставете коментар

Вашата адреса за е-пошта нема да биде објавена. Задолжителните полиња се означени *