Верилог

С Википедије, слободне енциклопедије

Верилог, стандардизован као ИЕЕЕ 1364, је језик за опис хардвера који се користи за моделовање електронских система. Најчешће се користи у дизајну и верификацији дигиталних кола на нивоу преноса апстракције. Такође се користи у верификацији аналогних кола и кола са мешовитим сигналима као и у дизајну генетичких кола.[1]

Увод[уреди | уреди извор]

Језици за опис хардвера као што је Верилог су слични софтверским програмским језицима, јер укључују начине описивања ширења времена и јачине сигнала (осетљивост). Постоје два типа оператора доделе; блокирајуће (=) и неблокирајуће (<=). Неблокирајућа додела омогућава дизајнерима да опишу ажурирање стања машине без потребе за декларацијом и коришћењем варијабли са привременим складиштењем. Пошто су ови концепти део Верилогове семантике језика, дизајнери могу брзо написати описе великих кола у релативно компактном и концизном облику. У време Верилоговог настајања (1984), Верилог је представио огромну побољшану продуктивност за дизајнере кола који су већ користили графички шематски софтвер за снимање и посебно написане софтверске програме за документовање и симулацију електронских кола.

Дизајнери Верилога су желели језик са синтаксом сличном програмском језику C, који је већ био широко распрострањен и коришћен у развоју инжењерског софтвера. Као Ц, Верилог је осетљив на велика и мала слова и има основни препроцисер (иако мање софистициран од ANSII C / C ++). Кључне речи контролног тока (ако/онда, за, док, случај, итд.) су еквивалентне, а предност његовог оператора је компатибилност са језиком C. Синтаксичке разлике укључују: захтевање ширине битова за декларације променљивих, раздвајање процедуралних блокова (Верилог користи почетак/крај уместо заграда {}), и многе друге мање разлике. Верилог захтева да се променљивој додели одређена величина. У Ц се ове величине претпостављају на основу "типа" варијабле (на пример, цели тип може бити 8 бита).

Историја[уреди | уреди извор]

Почетак[уреди | уреди извор]

Верилог је био један од првих популарних језика за опис хардвера. Израдили су га Прабу Гоел, Фил Морби и Чи-Леј Хуанг и Даглас Вармке у периоду између краја 1983. и почетка 1984[2]. Чи-Леј Хуанг је раније радио на опису хардвера LALSD, језику који је развио професор С. И. Х. Су, за свој докторски рад[3]. Стартни наслов за овај рад је био "Аутоматски интегрисани дизајн система" (који је касније преименован у Аутоматизација дизајна проласка (капије) 1985) као језик хардвера за моделирање који је купио Каденс Дизајн Системи 1990. године. Првобитно, Верилог је имао само намеру да описује и дозволи симулацију, аутоматизовану синтезу подскупова језика на физички реализоване структуре (капије итд.) Развијен је након што је језик постигао широку употребу.

Назив "Верилог" је настао комбинацијом речи "верификација" и "логика".[4]

Верилог-95[уреди | уреди извор]

Са такође растућим успехом VHDL у то време, Каденс је одлучио направити језик који би био доступан за отворену стандардизацију. Каденс је пренео Верилог у јавни домен под називом Интернационалан Слободан Верилог (ИСВ) (сада позната као организација Accellera). Верилог је касније био изложен на ИЕЕЕ и постао ИЕЕЕ Стандард 1364-1995, обично назван Верилог-95.

У исто време Каденс је покренуо стварање Верилог-А како би поставио стандарде за својим аналогним симулатором Спектра. Верилог-А никада није био намењен да буде самостални језик, он је подскуп Верилог-АМС који обухвата Верилог-95.

Верилог 2001.[уреди | уреди извор]

Додаци за Верилог-95 су враћени на ИЕЕЕ како би се покрили недостаци које су корисници пронашли у оригиналном Верилог стандарду. Ове екстензије су постале ИЕЕЕ Стандард 1364-2001 познат као Верилог-2001.

Верилог-2001 је значајна надоградња Верилог-95. Прво, додаје експлицитну подршку за означене мреже и променљиве. Претходно су аутори кода морали да изврше означене операције користећи неуобичајене манипулације на нивоу битова. Конструкција генерисање/крајгенерисања (слична ВХДЛовој конструкцији) омогућава Верилогу-2001 да контролише инстанцу кроз нормалне оператере одлучивања (case/if/else). Користећи ову конструкцију, Верилог-2001 може инстанцирати низ инстанци, уз контролу повезивања појединих инстанци. Фајл I/O је побољшан са неколико нових системских задатака. И на крају, уведено је неколико додатака за синтаксу како би се побољшала читљивост кодова (нпр. увек, @ *, именовани параметар преклапања, C-стил функција / задатак / декларација заглавља модула).

Верилог-2001 је Верилог верзија коју подржава већина комерцијалних ЕДА софтверских пакета.

Верилог 2005.[уреди | уреди извор]

Да не би дошло до забуне са СистемВерилог, Верилог 2005 (IEEE Standard 1364-2005) се састоји од mалих измена и неколико додатних опција за језике.

Посебан део Верилог стандарда, Верилог-АМС, покушава интегрисати аналогно и мешовито моделирање са традиционалним Верилог моделирањем.

Концепт модула[уреди | уреди извор]

Модул у Верилог-у представља основну јединицу дизајна и типично представља хардверску компоненту коју зелимо да направимо. Сваки модул може имати улазе и излазе који представљају сигнале који респективно, улазе и излазе из компоненте коју дизајнирамо (улазе и излазе другачије зовемо портови). Мањи модули се могу инстанцирати у оквиру већих модула (као што се једноставнија логичка кола користе у изградњи сложенијих). Такође, у Верилог-у постоје и модули за које није циљ да се синтетизују, већ се користе искључиво за тестирање других модула. Ови модули најчешће немају портове, а синтакса Верилога која се у њима користи је обично знатно слободнија, јер не морамо да водимо рачуна о томе да ли се нешто може или не може синтетизовати у стварном хардверу. Синтакса креирања модула је следећа:

module <име_модула>(<листа_портова>);
<декларације_портова>;

// код

endmodule // крај модула

У истом фајлу Верилога се обично може дефинисати већи број модула, мада је често добра пракса да се за сваки модул креира посебан фајл са кодом који се зове исто као и модул (са екстензијом .v).

Портови модула се наводе својим идентификаторима који су раздвојени зарезима. Након заглавља следе декларације портова. За сваки порт треба дефинисати да ли је улазни, излазни, или улазно-излазни. На пример:

module moj_modul(x,y,z);
input [3:0] x;
output y;
inout z;

Семантика Верилог-а[уреди | уреди извор]


Извршавање Верилог симулатора је недетерминистичко, а састоји се од већег броја процеса који се извршавају паралелно, у произвољном редоследу. Под процесом подразумевамо следеће:

  • на нивоу гејтова: сваки гејт (not, and, or...) је процес.
  • на нивоу протока података: свака аssign наредба континуиране доделе је процес
  • на нивоу моделовања понасања: initial и always су процеси

За сваки процес везујемо два типа догађаја: догађаји евалуације процеса (evaluation event) и догађаји ажурирања вредности сигнала који се у том процесу израчунавају (update event). Догађај евалуације подразумева израчунавање које се обавља у том процесу. Нпр. код гејтова то значи израчунавање одговарајуће логичке функције, код assign наредбе израчунавање леве стране. Код initial и always процеса, догађај евалуације подразумева покретање наредбе која се налази у оквиру процеса (од типа наредбе зависи како ће се она тачно извршавати). Догађај ажурирања подразумева промену вредности неког сигнала. Нпр. код гејтова се након израчунавања логичке функције одговарајући излазни сигнал гејта поставља на добијену вредност. Код assign наредбе се сигнал на левој страни доделе поставља на израчунату вредност. У случају initial и always процеса, догађаји ажурирања настају као резултат процедуралних додела.

Догађаји ажурирања креирају нове догађаје евалуације: сви процеси који су осетљиви на промену неког сигнала се поново израчунавају. Нпр. гејтови су осетљиви на сваку промену улазних сигнала, assign наредбе су осетљиве на сваку промену неког од сигнала који се појављује у изразу на левој страни. Догађаји евалуације за initial и always процесе се креирају одмах по покретању симулатора. За initial процесе ће то бити и једина евалуација у току рада симулатора, док ће код always процеса након завршетка те прве евалуације одмах бити креиран нови догађај евалуације за тај процес.

Догађаји евалуације креирају догађаје ажурирања ако и само ако се евалуацијом израчуна нека вредност која је различита од текуће вредности сигнала коме се та вредност додељује. Нпр. ако на улазу and() кола имамо 0 и 1, и ако се други улаз у неком тренутку промени у 0, то ће изазвати догађај евалуације (израчунава се нова вредност), али неће доћи до креирања догађаја ажурирања (јер је израчуната вредност остала непромењена).

Једини начин да се распоређивање неког догађаја одложи за неку од следећих временских јединица је да се дефинише кашњење:

  • на нивоу гејтова: спецификацијом кашњења се одлаже догађај ажурирања након евалуације за неку од следећих временских јединица (тиме се добија ефекат кашњења пропагације израчунате вредности кроз гејт).
  • за assign наредбу: спецификацијом кашњења се одлаже догађај ажурирања након евалуације за неку од следећих временских јединица (тиме се добија ефекат кашњења израчунавања код комбинаторног кола које израчунава дати израз).
  • за наредбе у initial и always процесима: кашњење може одложити целу наредбу или само неки њен део. На пример:
initial #10 // одлаже се цела begin-end наредба за 10 временских јединица
begin
 x <= y;
 y <= x;
end
initial begin
 x <= y;
 #10 y <= x; // одлаже се само друга наредба доделе
end

У другом примеру се у 0-тој временској јединици распоређује догађај евалуације за initial процес, али се након извршавања прве наредбе доделе зауставља даља евалуација и креира се нови догађај који подразумева евалуацију остатка наредбе и који се распоређује са кашњењем од 10 временских јединица.

Код сложених begin-end наредби, чак и када нема никаквог кашњења, може догодити да симулатор својевољно прекине евалуацију након неке од наредби и да остатак сложене наредбе распореди за каснију евалуацију у истој временској јединици (у виду догађаја евалуације остатка наредбе). Овим се симулира паралелно извршавање више процеса.

У случају initial и always процеса, поред кашњења могуће је такође наводити и @() и wait() конструкције за контролу извршавања које одлажу евалуацију наредбе (или дела наредбе) до испуњења одређених услова. Када се дати услов испуни, догађај евалуације наредбе (или остатка наредбе) се распоређује за обраду у тој истој временској јединици. На пример:

initial // евалуација прве наредбе доделе се обавља у 0-тој једници
begin
 x <= y;
 @(posedge z) y <= x; // евалуација друге наредбе доделе се одлазе
 	              // до првог преласка сигнала z са 0 на 1
end

Верилог симулатор догађаје поставља у редове, при чему има неколико различитих редова који се разматрају:

Ред активних догађаја Qа[уреди | уреди извор]

Овде се налазе догађаји који су распоређени за обраду у текућој временској јединици. Они се обрађују у произвољном поретку (с тим што се наредбе из истог begin-end блока морају евалуирати у поретку који је наведен у том блоку; слично, догађаји ажурирања који потичу из истог begin-end блока морају се обрадити у поретку у коме су наведени).

Ред неактивних догађаја Qи[уреди | уреди извор]

Овде се налазе догађаји који су распоређени у текућој временској јединици са кашњењем #0. Овај језички механизам се ретко користи приликом тестирања, како би се натерао симулатор да неке активне догађаје ипак распореди онако како корисник жели. Ово нарушава природни недетерминизам који постоји у хардверу који се дизајнира, па зато овакве конструкције треба избегавати.

Ред неблокирајућих додела Qн[уреди | уреди извор]

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

Ред мониторских догађаја Qм[уреди | уреди извор]

Овај ред садржи $monitor догађаје који се креирају у свакој временској јединици за сваки од монитора који постоје у колу. Обрада ових догађаја подразумева испис одговарајуће поруке на излазу на основу вредности сигнала који се прате (само ако је бар један од сигнала промењен у тој временској јединици).

Ред будућих догађаја Qф[уреди | уреди извор]

Овај ред садржи догађаје који су распоређени за извршавање у некој од следећих временских јединица. Ови догађаји биће пребачени у активни ред чим се испуне одговарајући услови (нпр. наступи одговарајућа временска јединица у случају да је задато кашњење, или се испуни одговарајући услов у случају @() и wait() конструкција). Међу овим догађајима постоје и догађаји ажурирања настали из неблокирајућих додела који су одложени кашњењем унутар наредбе доделе, нпр:

x <= 10# y; // догађај евалуације се извршава одмах, а догађај
            // ажурирања се одлаже за 10 временских јединица и
 // додаје у ред будућих догађаја

Овакви догађаји ће приликом активације бити распоређени у ред неблокирајућих додела, а не у активни ред.

Алгоритам распоређивања је дат следећим псеудокодом:

while(неки од редова није празан)
{
  if( празан)
  {
    if( није празан)
     пребаци све догађаје из  у 
    else if( није празан)
     пребаци све догађаје из  у 
    else if( није празан)
     пребаци све догађаје из  у 
    else
     {
       увећај бројач временских јединица;
       активирај све догађаје из  који су распоређени за ту
       временску јединицу;
     }

  }
  else
  {
    Е = произвољан догађај узет из 
    if(Е је догађај ажурирања)
    {
      ажурирамо одговарајући сигнал;
      додајемо догађаје евалуације за све процесе (или наредбе) који су
      осетљиви на ту промену у ред активних догађаја;
    }
    else // догађај евалуације
    {
      изврши евалуацију процеса (или наредбе)
      додај догађаје ажурирања у активни ред (или ред неблокирајућих
      додела, у случају наредбе неблокирајуће доделе)
    }
  }
}

Симулатори софтвера[уреди | уреди извор]

За информације о Верилог симулаторима, погледајте такође Листа ХДЛ симулатора.

Слични језици[уреди | уреди извор]

  • ВХДЛ
  • СистемЦ
  • СистемВерилог
  • ОпенВера
  • е (језик за верификацију)

Референце[уреди | уреди извор]

  1. ^ Nielsen AA, Der BS, Shin J, Vaidyanathan P, Paralanov V, Strychalski EA, Ross D, Densmore D, Voigt CA (2016). „Genetic circuit design automation”. Science. 352 (6281): aac7341. PMID 27034378. doi:10.1126/science.aac7341. 
  2. ^ „Verilog's inventor nabs EDA's Kaufman award”. EE Times. 7. 11. 2005. 
  3. ^ Huang, Chi-Lai; Su, S.Y.H. „Approaches for Computer-Aided Logic System Design Using Hardware Description Language”. Proceedings of International Computer Symposium 1980, Taipei, Taiwan, December 1980. стр. 772—79O. OCLC 696254754. 
  4. ^ „Oral History of Philip Raymond "Phil" Moorby” (PDF). Computer History Museum. 22. 4. 2013. стр. 23—25. Архивирано из оригинала (PDF) 27. 12. 2014. г. Приступљено 31. 1. 2018. 
Notes

Спољашње везе[уреди | уреди извор]

Туторијали и извори[уреди | уреди извор]

  • Tips About Using Verilog — Бесплатни Верилог програми за напредније кориснике
  • канал, Развојни (26. 4. 2015). FPGA Course. YouTube. 
  • Sandstrom, Johan (октобар 1995). „Comparing Verilog to VHDL Syntactically and Semantically”. Integrated System Design. EE Times.  — Sandstrom упоређује ВХДЛ конструкције са Верилог конструкцијама.
  • Asic-World – Бесплатни туторијали са много примера.
  • Verilog Tutorial — Бесплатне презентације за вежбу Верилога (ппт)
  • Verilog Tutorial — Бесплатне презентације за вежбу Верилога (пдф)
  • AllHDL – Тuторијал за Верилог.
  • Verilog Tutorial Верилог РТЛ туторијал са детаљним дигиталним дизајн концептима и примерима.
  • Misc EDA Utilities – Бесплатни Верилог парсери и помоћни алати нпр verilog2vhdl, vhdl2verilog, verilog2systemc, verilog2ipxact, testbench генератори и разни други
  • Playground, EDA (11. 11. 2013). Verilog Tutorials. YouTube.  — Верилог туторијали који се фокусирају на практична искуства кодирања и дебаговања
  • EDA Playground — Бесплатни веб претраживач заснован на Верилог ИДЕ
  • Verilog Programs — Верилог програми
  • Verilog ukratko - Верилог примери са теоријом

Стандарди[уреди | уреди извор]

  • IEEE Std 1364-2005 – Официјелни стандард за Верилог 2005 (није бесплатан).
  • IEEE P1364 – Радна група за Верилог (неактивна).
  • Verilog syntax – Опис синтаксе у Backus-Naur форми. Пред IEEE-1364 стандард.
  • Verilog 2001 syntax – Снажно повезана синтакса БНФа за Верилог 2001 (генерисана од EBNF алата).
  • Free Verilog Utilities – RTL и Netlist парсери, Testbench генератори, verilog2vhdl, vhdl2verilog, verilog2systemc, flattener, претраживач зависности и сортирања.

Језички додаци[уреди | уреди извор]

  • Verilog AUTOs — Систем мета-коментара отвореног кода који поједностављује одржавање Верилог кода.