Icarus Verilog – это компилятор, который преобразует файлы v, sv в промежуточные дампыVVP – симулятор полученных дампов, выдает по итогу результат в виде сигналовGtkwave – графический просмотрщик полученных сигналовVerilator – транслятор Verilog кода в C++ кодmakefile и tb.v. В первом файле записываются правила сборки, чтобы не писать каждый раз руками одно и то же, а во втором тестовый код. Начну пока что рассказ с tb.v:timescale 10ns / 1ns. В ней указывается метрика. Первое значение 10ns – это условное обозначение единицы этой метрики, то есть, если мы где-то в файле указываем #1, то это будет считаться продолжительностью 10 нс. Второй же параметр означает минимальный синтезируемый отрезок времени, то есть, всего лишь 1 нс. Это точно также как если бы 1 миллиметр относился к 1 см, в отношении 1/10.initial ... end объявляются некоторые заранее известные значения, при этом, растянутые во времени. При самом начальном этапе, устанавливаются стартовые значения $dumpfile и $dumpvars, которые указывают компилятору, в какие файлы требуется выгружать результат, и откуда.reset_n = 1. Спустя #2000 единиц времени, а именно 20 микросекунд, симуляция проекта завершается с помощью директивы $finish.make, выбирается правило сборки ica, которое запускает компиляцию iverilog.-g2005-sv задает поддержку возможности System Verilog;-DICARUS=1 передает объявление ICARUS, равное 1, для того, чтобы программы на верилоге могли проверить, с какого окружения запускаются;-o tb.qqq параметр указывает, куда будет экспортированы результатыtb.v является исходным файломvvp, который переводит транслированное значение tb.qqq в другое представление, например, в tb.vcd (это зависит только от того, есть ли $dumpfile). Файл tb.qqq удаляется за ненадобностью.gtkwave tb.vcd, либо воспользоваться make vcd командой. Откроется пустое окно, где потребуется выбрать слева модуль (в данном случае это tb), и добавить сигналы на схему.
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 00 | 00NOP | 01LXI B,** | 02STAX B | 03INX B | 04INR B | 05DCR B | 06MVI B,* | 07RLC | 08 | 09DAD B | 0ALDAX B | 0BDCX B | 0CINR C | 0DDCR C | 0EMVI C,* | 0FRRC |
| 10 | 10 | 11LXI D,** | 12STAX D | 13INX D | 14INR D | 15DCR D | 16MVI D,* | 17RAL | 18 | 19DAD D | 1ALDAX D | 1BDCX D | 1CINR E | 1DDCR E | 1EMVI E,* | 1FRAR |
| 20 | 20 | 21LXI H,** | 22SHLD ** | 23INX H | 24INR H | 25DCR H | 26MVI H,* | 27DAA | 28 | 29DAD H | 2ALHLD ** | 2BDCX H | 2CINR L | 2DDCR L | 2EMVI L,* | 2FCMA |
| 30 | 30 | 31LXI SP,** | 32STA ** | 33INX SP | 34INR M | 35DCR M | 36MVI M,* | 37STC | 38 | 39DAD SP | 3ALDA ** | 3BDCX SP | 3CINR A | 3DDCR A | 3EMVI A,* | 3FCMC |
| 40 | 40MOV B,B | 41MOV B,C | 42MOV B,D | 43MOV B,E | 44MOV B,H | 45MOV B,L | 46MOV B,M | 47MOV B,A | 48MOV C,B | 49MOV C,C | 4AMOV C,D | 4BMOV C,E | 4CMOV C,H | 4DMOV C,L | 4EMOV C,M | 4FMOV C,A |
| 50 | 50MOV D,B | 51MOV D,C | 52MOV D,D | 53MOV D,E | 54MOV D,H | 55MOV D,L | 56MOV D,M | 57MOV D,A | 58MOV E,B | 59MOV E,C | 5AMOV E,D | 5BMOV E,E | 5CMOV E,H | 5DMOV E,L | 5EMOV E,M | 5FMOV E,A |
| 60 | 60MOV H,B | 61MOV H,C | 62MOV H,D | 63MOV H,E | 64MOV H,H | 65MOV H,L | 66MOV H,M | 67MOV H,A | 68MOV L,B | 69MOV L,C | 6AMOV L,D | 6BMOV L,E | 6CMOV L,H | 6DMOV L,L | 6EMOV L,M | 6FMOV L,A |
| 70 | 70MOV M,B | 71MOV M,C | 72MOV M,D | 73MOV M,E | 74MOV M,H | 75MOV M,L | 76HALT | 77MOV M,A | 78MOV A,B | 79MOV A,C | 7AMOV A,D | 7BMOV A,E | 7CMOV A,H | 7DMOV A,L | 7EMOV A,M | 7FMOV A,A |
| 80 | 80ADD B | 81ADD C | 82ADD D | 83ADD E | 84ADD H | 85ADD L | 86ADD M | 87ADD A | 88ADC B | 89ADC C | 8AADC D | 8BADC E | 8CADC H | 8DADC L | 8EADC M | 8FADC A |
| 90 | 90SUB B | 91SUB C | 92SUB D | 93SUB E | 94SUB H | 95SUB L | 96SUB M | 97SUB A | 98SBB B | 99SBB C | 9ASBB D | 9BSBB E | 9CSBB H | 9DSBB L | 9ESBB M | 9FSBB A |
| A0 | A0ANA B | A1ANA C | A2ANA D | A3ANA E | A4ANA H | A5ANA L | A6ANA M | A7ANA A | A8XRA B | A9XRA C | AAXRA D | ABXRA E | ACXRA H | ADXRA L | AEXRA M | AFXRA A |
| B0 | B0ORA B | B1ORA C | B2ORA D | B3ORA E | B4ORA H | B5ORA L | B6ORA M | B7ORA A | B8CMP B | B9CMP C | BACMP D | BBCMP E | BCCMP H | BDCMP L | BECMP M | BFCMP A |
| C0 | C0RNZ | C1POP B | C2JNZ ** | C3JMP ** | C4CNZ ** | C5PUSH B | C6ADI * | C7RST 0 | C8RZ | C9RET | CAJZ ** | CB | CCCZ ** | CDCALL ** | CEACI * | CFRST 1 |
| D0 | D0RNC | D1POP D | D2JNC ** | D3OUT N | D4CNC ** | D5PUSH D | D6SUI * | D7RST 2 | D8RC | D9 | DAJC ** | DBIN N | DCCC ** | DD | DESBI * | DFRST 3 |
| E0 | E0RPO | E1POP H | E2JPO ** | E3XTHL | E4CPO ** | E5PUSH H | E6ANI * | E7RST 4 | E8RPE | E9PCHL | EAJPE ** | EBXCHG | ECCPE ** | ED | EEXRI * | EFRST 5 |
| F0 | F0RP | F1POP PSW | F2JP ** | F3DI | F4CP ** | F5PUSH PSW | F6ORI * | F7RST 6 | F8RM | F9SPHL | FAJM ** | FBEI | FCCM ** | FD | FECPI * | FFRST 7 |
NOP – нет операции; 4TLXI – загрузка 16-битного непосредственного значения в регистры BC, DE, HL или SP; 10TSTAX – сохранение регистра А в память по адресу либо BC, либо DE; 7TINX, DCX – увеличить или уменьшить на единицу 16-битный регистр, флаги при этом не меняются; 5TINR, DCR – увеличить или уменьшить на единицу 8-битный регистр с изменением флагов; 5/10TMVI – поместить в регистр или в память (M) по адресу HL непосредственный операнд; 7/10TDAD – сложить HL и 16-битный регистр, результат записать в HL; 10TLDAX – наоборот, из памяти по адресу BC или DE записывается в регистр A; 7TRLC – сдвиг A налево с заемом CF; 4TRRC – сдвиг A направо с заемом CF; 4TRAL – вращение A налево; 4TRAR – вращение A направо; 4TSHLD – загрузка HL в память (16 битный адрес); 16TDAA – десятичная коррекция после сложения; 4TLDHL – загрузка из памяти (16 битный адрес) в регистр HL; 16TCMA – инверсия битов в регистре A; 4TSTA – сохранить A в памяти (16 бит); 13TSTC – установка флага CF=1; 4TLDA – загрузка A из 16-битной памяти; 13TCMC – инверсия флага CF; 4TMOV – скопировать регистр или память, в другой регистр или память; 5/7THLT – остановка процессора; 4TADD – сложить аккумулятор с операндом (регистр или память); 4/7TADC – сложить аккумулятор с операндом (регистр или память) с заемом CF; 4/7TSUB – вычесть аккумулятор с операндом (регистр или память); 4/7TSBB – вычесть аккумулятор с операндом (регистр или память) с заемом CF; 4/7TANA – побитовое AND аккумулятора с операндом (регистр или память); 4/7TXRA – побитовое XOR аккумулятора с операндом (регистр или память); 4/7TORA – побитовое OR аккумулятора с операндом (регистр или память); 4/7TCMP – вычесть из аккумулятора, но результат не сохранять, только меняются флаги; 4/7TPUSH – втолкнуть в стек BC,DE,HL или AF регистр; 11TPOP – вытолкнуть из стека и записать в BC,DE,HL или AF регистр; 11TRNZ, RZ, RNC, RC, RPO, JPE, RP, RM – выполнить возврат из процедуры при достижении условия; 5/11TJNZ, JZ, JNC, JC, JPO, JPE, JP, JM – переход по 16 битному адресу, при достижении условия, иначе пропуск; 10TCNZ, CZ, CNC, CC, CPO, CPE, CP, CM – вызов процедуры по 16 битному адресу, при достижении условия, иначе пропуск; 11/17TJMP – безусловный переход по 16 битному адресу; 10TCALL – вызов подпрограммы; 17TRET – выход из процедуры; 10TRST – вызов обработчика прерывания; 11TOUT – запись в порт аккумулятора; 10TIN – чтение из порта в аккумулятор; 10TADI – сложить аккумулятор с непосредственным операндом; 7TACI – сложить аккумулятор с непосредственным операндом и заемом флага CF; 7TSUI – вычесть из аккумулятора с непосредственный операнд; 7TSBI – вычесть из аккумулятора с непосредственный операнд с заемом флага CF; 7TANI – побитовое AND аккумулятора с непосредственным операндом; 7TXRI – побитовое XOR аккумулятора с непосредственным операндом; 7TORI – побитовое OR аккумулятора с непосредственным операндом; 7TCPI – вычесть аккумулятор и непосредственным операнд, но результат не сохранять; 7TXTHL – обменять вершину стека с HL; 18TPCHL – перейти к адресу в HL; 5TXCHG – обмен DE и HL; 4TDI – запрет прерываний; 4TEI – разрешение прерываний; 4TSPHL – записать HL в SP; 5T