AVR core - folytatás - II. Regiszterek

Az I/O portos dolgok "rendbetetele" utan gondoltam megnezem mi a helyzet a regiszterekkel. Merthogy ez a sajat implementacio reszben a Navre projekten alapult, ami ezt az egesz "register file" temakort relative egyszeruen letudta. Konkretan ott a regiszterek egy sima `reg [7:0] GPR [0:31]` jellegu tombben vannak es a execute-writeback ciklusban mindenfele gombaramkor kikanalazza ebbol azt ami kell - azaz 1, 2, neha 3 regiszter erteket - es visszairja azt ami kell, szinen 1, 2, neha 3 regisztert. Ez igy oke is lenne, megy is, de ket hatranya van: egyreszt, az FPGA-kban a multiplexerek, noplane a 32:1 multiplexerek dragak (lassuak is es zabaljak is a LUT-okat). Masreszt meg mar a legegyszerubb FPGA-kban is van valamifele embedded block RAM es milyen jo lenne ezeket is felhasznalni a CPU-n belul is. Mondvan hogy egy AVR-ben is azert 256 bit megy el csak a GPR-ekre - a 32:1 multiplexerekrol meg mar ne is beszeljunk.
 

Akkor tegyuk ezt rendbe egy kicsit. Az elso felismeres az az hogy a klasszik 8-bites AVR az legyen inkabb egy 16-bites architektura ugy hogy a legtobb muveletet azt inkabb korlatozottan, egyszerre csak 8 biten hajtjuk vegre[1]. Igy akkor elso lepeskent legyen a "register file" a fenti helyett inkabb egy

reg [15:0] GPR [0:15];

jellegu tomb, illetve az egyes source regisztereket a korabbi

.... [4:0] Rd;
.... [4:0] Rr;
wire [7:0] GPR_Rd = GPR[Rd];
wire [7:0] GPR_Rr = GPR[Rr];

helyett

wire [7:0] GPR_Rd = Rd[0] ? GPR[Rd[4:1]][15:8] : GPR[Rd[4:1]][7:0];
wire [7:0] GPR_Rr = Rr[0] ? GPR[Rr[4:1]][15:8] : GPR[Rr[4:1]][7:0];

modon erjuk el. Ugyanaz, de megis mas. A 16-bites muveleteknel (indexeles, ADIW/SBIW es MOVW) meg kozvetlenul GPR[RR] ill. GPR[RD] modon erhetoek el az ertekek, ahol RR ill RD az nem feltetlen 0..15 kozott van hanem lehet hogy csak 12..15 (ADIW) illetve 13, 14, 15 (indexeles). A writeback agban pedig a 16-bites visszairasok (index leptetesek, ADIW/SBIW, MOVW, MUL tarolasok) igy sima GPR[RW] <= ... beirasok lesznek, mig a 8-bites esetben also/felso byte-ra valik szet:

        if ( Rw[0] )
                GPR[Rw[4:1]][15:8] <= R;
        else
                GPR[Rw[4:1]][7:0] <= R;

Mar csak ezzel a kis par soros atirassal/cserevel/trukkel a timing analysis szerint a maximalis orajel-frekvencia a korabbi ~32-33MHz-rol mar majdnem ~40Mhz korulire ment fel es az LC-k szama is szamottevoen csokkent (a teljes SoC ~2930-as igenye lement ~2710-re). Tanulsag 1: lenyegeben mar az hogy a 16-bites regisztereket csak mint "szomszedos regiszterek" es csak "aligned" modon lehet elerni az mar ennyit segit. Tanulsag 2: a critical path meg mindig a pipeline stage 2 (execute-writeback) lepeseben van. 

Node hogyan tovabb az EBR-ek iranya fele. EBR(ek)bol osszerakott, 2 read + 1 write portos szinkron memoriamodulokat akkor tudunk hasznalni barmire is, ha a) egy ciklusban maximum ket CPU-regisztert szedunk ki ebbol, b) egy ciklusban maximum egy CPU-regisztert irunk vissza es c) az irasi es olvasasi ciklusok orajele elott ismerjuk hogy melyik ez a ket kiolvasando regiszter. Az a) es b) feltetel az mar a gombaramkorben is hellyel-kozzel adott volt, csak arra kell figyelni hogy az LD rxx, [Z+] jellegu vayg LPM rxx, [Z+] jellegu, egyebkent ket vagy tobb orajeles utasitasok kulonbozo orajel-ciklusokban irjak vissza az inkrementalt/dekrementalt indexet illetve az rxx ertekeit. 

Barhogyis, ha a fenti feltetelek teljesulnek akkor a szintezis soran "illene" eszrevenni azt hogy az egesz regiszter-kupac letrehozhato egy (vagyis, a dual read port miatt ketto) EBR-bol. Elso kozelitesben a Yosys (0.23) ezt a c) feltetelt nem vette eszre magatol, azonban a stage 1 (decode) agban nehany joliranyzott wire [4:0] illetve az if else if else if ... else agak egyszerusitese utan egyszercsak... egyszercsak eszrevette. Azaz nem volt szukseg konkretan egy EBR-nek megfelelo module letrehozasa, eleg volt csak a fenti harom feltetelre figyelni, plusz egy kis rasegites. Lenyeg a lenyeg, hogy ekkor a korabbi ~2710-rol lesett ~2030-ra a SoC LC igenye, ehelyett megjelent a ket EBR (ICESTORM_RAM) a Device utilisation listaban, valamint a maximalis orajel felment ~40MHz-rol ~55MHz-re. Azt mondjuk erdemes megnezni hogy a 2710 -> 2030-as csokkenesbol ugye 256-ot elvitt a 32x8 (vagyis 16x16) bitnyi regiszter maga, a maradek ~420 pedig ez a sok 32:1 vagyis 16:1 ill azt koveto 2:1 multiplexer (illetve a beirashoz szukseges enable-t meghajto demultiplexer logika). Ez ugy nagyjabol realis is, 16:1 multplexereket 4-to-1 LUT-okbol nagyjabol ennyire lehet osszesuriteni, ugyhogy tulajdonkeppen ez igy jo. Tehat, tanulsag 3: erdekes lenne megnezni hogy mas logic synthesis tool (pl Vivado) mikor kezdi el eszrevenni azt hogy EBR-ekbol osszehozhato a register file, esetleg megnezni egy ujabb Yosys verziot, hatha az mar korabban kiszurja... meg ilyesmi. Meg ugye az hogy egyatalan nem kell kezzel megcsinalni a register file-t mind egy onallo module, hanem nyugodtan lehet hasznalni a synthesis tool-t arra hogy eszrevegye a... most mondanank hogy nyilvanvalot, de azert annyira megsem nyilvanvalot. Kis rasegites nem art.

Vegkonkluzio: meg mindig nincs, folyt. kov. Mindenesetre az I/O portok rendbetetele elotti ~28MHz-s maximalis orajel az gyakorlatilag mar eme ket dolog hatasara megketszerezodott. Ami vegsosoron nem baj.

[1] Kicsit ahhoz hasonlatosan mintha a 8086 eseteben az AX/CX/DX/BX regiszterekre csak nehany muvelet (pl konstans-osszadas/kivonas, indexeles) lenne elerheto, minden masra (bit-logikara, elagazasokra, altalanos aritmetikara, memoria irast-olvasasra) meg csak az  AL/CL/... regiszterek lennenek hasznalhatoak. 
 

Hozzászólások

... Mit / minek kellett volna ahhoz tanulnom (felsőoktatásban), hogy ezt értsem? :) Villamosmérnöknek?

(Off-topic.) Progterv-mat-on végeztem 2002-ben; gyerekkoromtól (mondjuk) 2010-11-ig kifejezetten idegenkedtem a hardverközeli programozástól. Ez 2010-11 után megváltozott; egyre inkább kénytelen voltam a hardverhez közel húzódni -- ami jól ment, viszont időnként volt olyan pont egy-egy (tipikusan levlistás) beszélgetésben, ahol az áramköri ismeretek [*] hiánya miatt nem tudtam a többieket követni. ([*] Itt nem fizikai, elektromosságtani ismeretekre gondolok, hanem konkrét, mindennapi, gyakorlati áramköri dolgokra.) Mostanra a terület kifejezetten érdekel, és igyekeznék komolyan beletanulni, de (1) munka mellett elektrotechnikai iskolába nem tudok beülni, (2) az "internetről összecsipegetett morzsák" nem az én műfajom (a chatgpt-t meg hasonló hülyeségeket meg ne is említsük). Én a hierarchikusan és koncepcionálisan felépített tananyag híve vagyok; a csipegetés is tud működni, de szerintem csak akkor, ha azt valaki munkaidőben, folyamatosan (és pénzért) végzi. Innen a (költői) kérdés: vajon mit lett volna hasznos a progterv-mat helyett választanom 97-98-ban, ahhoz, hogy most ne gimis szinten (alatt...) álljak az áramkörökhöz. Átfogalmazva: melyik az az egy (esetleg kettő) könyv, amiből a "PCB design"-t alapszinten meg lehet tanulni. Kerti szaletlit megtanultam építeni a youtube-ról, de ennél a témánál a youtube nem tűnik hatékonynak. (Elkezdtem nézni egy sorozatot, de az elméleti alapozás annyira pongyola volt, hogy feladtam.)

Elektronikahoz ugy altalaban jo bevezeto a Tietze-Schenk :) Ez nem PCB design, hanem ugy altalaban elektronika. PCB design-hez... hat, jo kerdes. En egyoldalas nyak + filctoll + vasklorid + kezi furo kombinacioval kezdtem, aztan lett finomodas (lezernyomtato + transzpausz + kvarclampa + sosav-peroxid + kemiai onozo), majd utana mar rendes gyartatas (Protel, gEDA/gschem/pcb, KiCad). Ezalatt szepen meg lehet tanulni sokmindent... de hogy ezt milyen konyv "valtja ki", azt nem tudom :/ 

Persze, csomóponti törvény, hurok törvény, Ohm-törvény, induktivitás, kapacitás, elosztott paraméterű hálózatok, súlyfüggvény, átmeneti függvény és hasonló csacskaságok teljesen feleslegesek. Ó, ha én ezt tudtam volna, elovasom azt a két, elavult, fényes lapokból álló, talán a '70-es években íródott nem túl vastag könyvet, megnézem, mi az a komplementer fém-oxid félvezető meg a térvezérlésű tranzisztor, három hét alatt letudom az egészet, s nem bajlódtam volna az egyetemmel öt évig. :)

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Ördögöd van! Tényleg még a szorzótábla sincs benne ezekben a könyvekben. Ennyi ésszel tudhatnád, hogy már az Ohm-törvény is régi, tehát elavult. ;)

Pedig értő olvasás mellet az egyik kollégának ennyi irodalom elegendő volt egy 16/24 bites, 300 tokból álló bipoláris videoprocesszor megtervezéséhez. Meglehet, van aki ezt egyetemen tanulja. Igaz, a gázszerelő mester is óvva intett: Ne szereljen gázt! (Mert egy tisztességes szerelő 9 (!!) évig tanul, amíg készülékhez nyúlhat. - Többen kiröhögtük. :-((()

Sajnos az említett irodalom tényleg nem tartalmazza az általános iskolai valamint a gimnáziumi anyagot, azt máshol kell keresned. Annyi előnye van, hogy gyakorló mérnökök által összeállított tippeket-trükköket és gyakorlati adatokat/méréseket is leírtak bennük (lásd:előszó)

Pl. az elosztott paraméterű hálózatok tananyag nincs benne, viszont az átviteli vonalak - a dróttól kezdve -hullámimpedanciája igen.

Csak két mai példát ragadok ki:

A PCI express Lane működésének megértéséhez minden információ ott van. Ugyanúgy az USB 2.0 kábel maximális hosszának megítéléséhez is alkalmasak a szellemes munkaegyenesen szerkesztett visszaverődési ábrák. 

Szerintem a villany az villany, bárhányat is írunk a naptárba. ;)

youtube?:

Phil's lab

Fesz lab

Leos bag of trick (<-- ezt nagyon, ez aranybanya), foleg ez:

https://www.youtube.com/watch?v=vq968AFgPhg

 

bigclivedotcom (ez csak annyira, hogy egy aramkort madartavlatbol hogyan kell ertelmezni)

 

a nyavogos ausztral fundamental paylistjet

electrarc240 (uj favorit)

louis rossmannak van egy tok jo tranzisztor debugging videoja, azt most nem talalom, de van egy ilyen sorozata:

https://www.youtube.com/playlist?list=PLkVbIsAWN2ltOWmriIdOc5CtiZqUTH7GT

Cranktown city. Ez eszméletlen jo csatorna, minimalis elektronikai tudassal olyat tesz le az asztalra, hogy ihaj. (fuggoleges plazmavago asztal ill. annak a munkadarab rogzitese, amikor saját elektromagneses tekercset gyart)

 

Matthias Wandel motormagyarazos videoi. Szerintem a legjobbak a temaban. (dc motor, univerzalis motor, ac motor, stb)

 

tim hunkin videoibol van elektronikai. Minden masodperce arany.

 

En nem vetnen el a youtubeot....

Jah igen, es a chatgpt-t se vetnem el. Alap koncepciokat jól elmagyaraz, kerj internetes referenciat, es a konkret valaszt ellenőrizd le.

 

Amugy en is elkezdtem olvasni az art of electronicsot, de kicsit szaraz, meg egyszerubb egy-egy youtube video, mint olvasasra csendes kornyezetet teremteni.

Saying a programming language is good because it works on all platforms is like saying anal sex is good because it works on all genders....

Veriloghoz, meg ugy altalaban HDL-hez meg nagyjabol harom iranybol lehet szerintem igy kozelitgetni, akar oktatasban, akar autodidakta modon. Oke, nekem inkabb ezutobbiban van tobb tapasztalatom. Vagyis, tanulni nem tanultam ezeket csak igy tanitgattam. Valamennyire. 

  • Konyvek, leirasok: ez az Introduction to Logic Synthesis using Verilog HDL peldaul nagyon jo kis bevezeto. A NandLand-on is vannak jo leirasok, neha ugy egy-egy temara-reszteruletre rakeresve innen dob fel dolgokat. Kesobbiekben meg lehet celtudatosabban hardverek (MCU-k, CPU core-ok,  periferiak, offload digitalis logikak) datasheet-jeit tanulmanyoz(gat)ni, es azalapjan ilyesmi konkluziokat tehetunk hogy "ah, ezert ilyen furcsa a regiszterkeszlete a barminek mert ezt igy a legegyszerubb megcsinalni valamifele HDL-ben ugy hogy hatekony is legyen".
  • Gyakorolgatni, szimulalgatni, megjeleniteni: iverilog + gtkwave Van benne futtatas is (vvp), amit onalloan is tudunk hasznalni. Pl komplexebb SoC-ok meg hasonlo cuccmanyok hosszutavu viselkedest, ugy hogy pl csak arra vagy kivancsi hogy mit ir ki a konzolra. Ezt nyilvan egeszen kinszenvedes lenne gtkwave-ban vegignezni, de pici szkripteles a *.vcd kimenteken es mar jo is.
  • Hardverre pedig egy olyasmi celszeru amin egy USB madzagon van flash programozo is es egy debug UART is (legalabb). Ezt az ICE40HX8K-B-EVN boardot szeretem pont emiatt. Kicsit felment az ara mostanaban, de egyebkent nagyon jo. Es mindez nyilt forrasu cuccokkal (yosys + nextpnr + icestorm) programozhato illetve nyilt eszkozokkel tudsz ra fejleszteni.

Szoval kb ezek lehetnek jok kiindulasnak. Vagyis, ezek jok lehetnek kiindulasnak. Mostanaban igy fejlesztgetes cimszo alatt ezt a harom megkozelitest kb egy-egy-egy aranyban hasznalom.

Ebben az "észrevegye" dologban a Quartus is megéri a pénzét...

Igen... ezert neznem majd meg en is ezt Vivado meg ICEcube2 alatt, meg ujabb yosys-okkal. Mondjuk hogy a Vivado meg a wor/wand-ot nem tudja, az is megeri a penzet. Oke hogy lassabb, korulmenyesebb es obfuszkaltabb, de meg nem is tud dolgokat. Szoval nem lepne meg ha ezt nem tudna eszrevenni.