PopaLepo

AC

May 24th, 2020
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.15 KB | None | 0 0
  1. pt fiecare instructiune contorul de program se incrementeaza pe 4 (o instructiune este pe 4 octeti) si memoria se adreseaza pe octet
  2. toate fazele de executie pentru o instructiune (IF, ID, EX, MEM, WB) se petrec pe o singura perioada de ceas. (pt mips ciclu unic)
  3.  
  4. instr de tip R :
  5.  
  6. op $rd, $rs, $rt
  7. RF[rd] <- RF[rs] op RF[rt]
  8.  
  9. (31-26) opcode (25-21) rs (20-16) rt (15-11) rd (10-6) sa (5-0) funct
  10. opcode este tot timpul 0 pentru R.
  11.  
  12. exemple la funct :
  13. 100000 = add
  14. 100010 = sub
  15. 100101 = or
  16. 100100 = and
  17. (coduri standard, petterson)
  18.  
  19. resurse necesare pt faze de executie :
  20. IF -> PC, Memoria de instructiuni, sumator.
  21. ID -> Bloc de registri, Unitatea de control
  22. EX -> ALU
  23. MEM -> No op (nu se face nicio operatie pt instructiunile de tip R)
  24. WB -> Bloc de registri
  25.  
  26. instr de tip I :
  27.  
  28. ori $rt, $rs, imm
  29. RF[rt] <- RF[rs] + S_Ext(imm)
  30.  
  31. (31-26) opcode (25-21) rs (21-16) rt (15-0) imm
  32.  
  33. resurse necesare pt faze de executie :
  34. IF -> PC, Memoria de instructiuni, sumator
  35. ID -> Bloc de registri, Unitatea de control, unitate de extensie
  36. EX -> ALU
  37. MEM -> No op
  38. WB -> Bloc de registri
  39.  
  40. lw $rt, offset($rs)
  41. opcode 100011
  42. incarca un cuvant de 32 de biti din memoria de date intr-un registru.
  43. apare in plus blocul de memorie.
  44.  
  45. RF[rt] <- M[RF[rs] + S_Ext(imm)]
  46.  
  47. sw $rt, offset($rs)
  48. opcode 101001
  49.  
  50. M[RF[rs] + S_Ext(imm)] <- RF[rt]
  51.  
  52. pe partea de scriere a rezultatului (nu avem nevoie) (daca ne gandim la sw am spune ca rezultatul este scrierea in memorie) dar ca terminologie la mips se considera accesul din baza de memorie ca fiind scrierea efectiva.
  53.  
  54. beq $rt, $rs, imm
  55. opcode 000100
  56. compara doi registri, apoi face salt conditionat la PC.
  57. if(RF[rs] == RF[rt]) then PC <- PC + 4 + S_Ext(imm) << 2 (inmultirea cu 4 este datorata reprezentarii instructiunilor pe 4 octeti)
  58. resurse necesare : sumator aditional pentru al doilea plus din instructiune + S_Ext(imm) si un circuit de deplasare, un mux.
  59. MEM, WB -> no operation
  60.  
  61. j target_addr
  62. salt neconditionat la o adresa psuedoabsoluta (in zona de 256MB unde e programul)
  63.  
  64. (31-26) J (25-0) target_addr
  65. PC <- PC + 4 [31:28] & target_addr & 00
  66.  
  67. ID, MEM, WB -> no operation
  68. EX -> circuit de deplasare
  69. lw si sw trebuie sa furnizeze memoriei pe o perioada de ceas adresa efectiva a datelor pe care le doreste (fie unde vrea sa scrie fie de unde vrea sa citesca) dar pe aceiasi perioada citim din memorie combinational instructiunea (apare conflict ca nu poti pe durata unei perioada de ceas sa furnizezi 2 valori difertie pe campul de adresa de la memorie) din cauza asta avem 1 memorie separata de instructiuni si una de date.
  70.  
  71. blocul de registri (ra1 si ra2) (read data 1 -> rs) (read data 2 -> rt)
  72. in partea de scriere avem camp de adrese (in ce registru vrem sa scriem)
  73. si datele pe care vrem sa le scriem in registrul respectiv
  74. pentru ca nu vrem sa scriem in toate instructiunile (avem un semnal de validare a scrierii) (RegWrite)
  75. RegWrite = 0 (nu se fac scrieri)
  76.  
  77. Memorie de date e o memorie RAM, citirea se face pe iesirea read data (ce e pe campul write data se scrie in campul de adresa, cu conditia ca MemWrite = 1)
  78.  
  79. pentru toate elementele de stocare (PC, Bloc de registri, memoria de date) -> scrierea se face pe acelasi front de ceas.
  80.  
  81. etapa a citirii a instructiunii din memorie (IF)
  82. pc, sumator si rom
  83. avem la iesirea rom, codul masina al instructiunii. (partea e comuna la toate)
  84.  
  85. rezultatul de ex: instructiune de tip r (RF[rs] op RF[rt]) se va gasi la iesirea ALU)
  86. trebuie dus inapoi in blocul de registre pe campul de scriere (writeData)
  87.  
  88. rt poate fi citit fie la scriere fie la citire (I,R)
  89. intrarea a doua a alu este unitatea de extensie (cu semn sau cu zero)
  90.  
  91. rezultatul RF[rs] op Ext(imm) se va furniza la iesirea AluRes
  92.  
  93. pt LOADWORD STOREWORD
  94.  
  95. in ambele rtl-uri la lw si sw avem suma intre registrul rs si ext_imm deci intrarea b de la alu este s_ext(imm) si rf[rs] este intrarea a de la alu. rezultatul din alu va fi suma dintre cei doi operanzi. iesirea va fi adresa efectiva (iesirea alures e legata pe campul de adrese la memoria ram)
  96.  
  97. pt store word luam read data 2 si il legam la write data (aceste date trebuie sa ajunga pe intrarea memoriei ca sa scriem acolo acele date)
  98.  
  99. Multiplexorul cu register destination (regDst)
  100. Multiplexorul cu ALUSrc (sursa b de la alu)
  101. Multiplexorul de scriere inapoi (writeback) cu (memtoreg)
  102.  
  103. beq
  104. comparatia intre cei doi registri o va face alu
  105. rezultatul comparatiei va fi in steguletul de 0 (zero)
  106.  
  107. imediatul extins e legat la unitarea de deplasare care intra in sumator cu PC+4 -> se rezolva rtl
  108. se pune un mux pt ca pe then si else trebuie legate lucruri diferite. la semnalul de selectie spunem pcsrc de la sursa de selectie a lui pc.
  109.  
  110.  
  111. jump
  112.  
  113. cei 28 de biti sunt concatenati cu primii 4 biti din pc (31-28)
  114. mai trebuie un mux nou cu semnalul jump (branch si pc-ul nou construit)
  115.  
  116. analiza semnalelor de control :
  117.  
  118. regWrite, memWrite (activare a scrieri) (punem 1 -> permitem scriere sincrona)
  119. regDst (ne selecteaza ce vrem sa trimitem pe adresa de scriere din blocul de registri (rt sau rd))
  120. punem 1 => merge rd altfel trece rt (dar nu conteaza daca le punem invers)
  121. extOp (1 -> semn, 0 -> zero)
  122. ALUSrc (sursa lui alu, pe 0 trece read data 2 si daca e 1 alusrc trece extins (greu de gasit o regula)
  123. MemToReg (alege daca sa treaca memorie spre registru sau alu) (1 din memorie, 0 din alu)
  124. PCSrc, Jump (daca punem 0 trece PC+4)
  125. pcsrc depinde de 0 (doar in scenariul in care exista beq) (se pune un semnal nou de branch care e pus pe 1 stric cand avem beq) (zero e pus pe 1 cand rezultatul in alu este nul) => punem un si intre branch si zero.
  126.  
  127. ALUCTRL (se pot propune valori adhoc)
  128. 000 adunare
  129. 100 scadere
  130. 001 si
  131. 010 sau
  132.  
  133. flux de date pt instrucitune de adunare de tip r:
  134.  
  135. pornim cu iesirea de la pc (branch si jump sunt 0 sa se execute pc + 4)
  136. pc-ul merge spre adresa de la memoria rom, se selecteaza combinationala cei 32 biti din instr.
  137. regdst = 1 (avem registrul d, e instr de tip r)
  138. alusrc = 0 (nu avem imediat extins)
  139. pt adunare (aluctrl = 000)
  140. rezultatul trebuie sa ajunga inapoi la blocul de reg (in memtoreg punem 0) (nu in memorie)
  141. vrem sa scriem, deci regwrite = 1 (mereu se scrie in blocul de reg)
  142. memwrite mereu 0 pt r (nu scriem in memorie)
  143. semnalul de extensie nu conteaza (iesirea din unitatea de extensie nu produce efecte)
  144.  
  145. deci : regdst este 1 pt r (add, sub, or, and)
  146. regwrite este 1 pt majoritatea instr (fara jump, beq si sw) (la sw nu se scrie in blocul de registrii)
  147. alusrc este 1 pt instr cu imediat extins (i) (este 0 pt cele de tip r si x pt jump)
  148. extop este 1 pt lw,sw si alte instr cu extindere cu semn si 0 pt ori,andi etc (cele logice) si x pt tip r si jump.
  149. memwrite este 1 doar in sw
  150. memtoreg este 1 doar in lw
  151. branch este 1 doar in beq
  152. jump este 1 doar in j
  153.  
  154. unitatea de control mips ciclu unic :
  155.  
  156. este combinationala (ea codul de operatie si seteaza valorile corecte pt semnalele de control)
  157. are o structura ierarhica main control (master) si alu control (slave) se introduce un semnal intermediar aluop (din cauza codificarii mai speciale la instructiunile de tip r)
  158.  
  159. opcode = 0 plus funct
  160. maincontrol da comenzi lui aluctrl pt ca acesta sa seteze comanda efectiva.
  161.  
  162.  
  163. ALUOP ESTE :
  164. tip r -> 10 (foloseste funct)
  165. ori -> 11 (comanda sau)
  166. addi / lw / sw -> 00 (comanda +)
  167. beq -> 01 (comanda -)
  168. pt j -> xx
  169.  
  170. pt instr de tip r aluop are mereu 10 si dupa in functie de funct se genereaza un aluctrl
  171. pot fi unele identice, add de tip r are acelasi aluctrl ca si addi sau lw/sw
  172.  
  173. deci I(5-0) se duce in alucontrol si semnalul aluop din memoria master (main)
  174.  
  175. implementarea alu unitatii de comanda se face cu PLA (programmable logic array)
  176. pt fiecare instructiune principala adaugam cate o poarta si care ne va detecta aparitia strict ale acelei instructiuni
  177.  
  178. la tip r de ex codul de operatie este 0 (sunt negate toate)
  179.  
  180. opcode-uri :
  181. r (000000)
  182. ori (001101)
  183. addi (001000)
  184. lw (100011)
  185. sw (101011)
  186. beq (000100)
  187. j (000010)
  188.  
  189. la jump sunt negate toate in afara de a 5-a (pe acel 1 nu il negam)
  190. la un moment dat o singura poarta va fi 1 pe iesire (pt anumite instructiuni)
  191. acel 1 de la anumite porti trebuie legat la semnalele de control.
  192.  
  193. (nu e necesar un mux) regwrite de ex este activat daca cel putin una din cele 4 porti de iesire (r, addi ,ori, lw) este activata pe 1 (deci avem nevoie de o poarta sau)
  194.  
  195. calea critica = load word (cea mai defavorabila instructiune)
  196. (suntem obligati sa punem o frecventa unica, defavorabila care acopera cea mai lunga instructiune)
  197. (timpul inactiv care apare, de ex la instructiunea j, se elimina in pipeline / multiciclu)
  198.  
  199. PIPELINE
  200. PE IF
  201.  
  202. se citeste instructiunea de executat
  203. adresa pc este incrementata cu 4
  204. se scrie in pc adresa pc incrementata sau adresa de ramificare
  205.  
  206. PE ID
  207.  
  208. se citesc operanzii din blocul de registri (in jumatatea a doua a perioadei de ceas)
  209. campul imediat se extinde cu semn sau cu zero
  210. se transmit adresele care pot fi folosite ca adrese de scriere in blocul de registri
  211. pc incrementat se transmite la etajul urmator.
  212.  
  213. PE EX
  214.  
  215. se calculeaza adresa efectiva pentru instructiunile care acceseaza memoria.
  216. se transmite data de stocat pentru instructiunea sw
  217. operatii pe alu
  218. instructiuni de ramificare, test de egalitate in alu
  219. adresa de ramificare se calculeaza in sumatorul suplimentar
  220. se transmite mai departe adresa potentiala de scriere in blocul de registri.
  221.  
  222. PE MEM
  223.  
  224. se citeste din memoria de date
  225. se scrie in memoria de date
  226. se transmite mai departe adresa de scriere in blocul de registri
  227. se transmit rezultatele operatiilor ALU / adresa de ramificare
  228.  
  229. PE WB
  230.  
  231. operatii tip alu pt instr de tip R si I (rezultatul obtinut in alu se scrie inapoi in blocul de registri)
  232. deci scriere in blocul de registri, pe frontul descrescator al ciclului de ceas
  233.  
  234. IN IF SI ID SUNT IDENTICE PT TOATE, dar in restul sunt particularizate.
  235. ordinea etajelor practic if id ex mem wb (cand avem o instr care trece prin pipeline, ea va fi la un moment dat intr-un singur etaj)
  236. ar trebui sa transmitem impreuna cu datele instructiunii si valorile pt semnalele de control.
  237.  
  238. de ex regwrite trebuie plimbat prin etajele de pipeline.
  239.  
  240. hazard structural (pe aceeasi perioada de ceas, instructiuni diferte vor sa foloseasca aceeasi resursa)
  241. (nu e nicio problema in cazul mips pentru ca folosim memorii diferite de date si de instructiuni)
  242. (dar daca am folosi o singura memorie, ar trebui sa asteptam o perioada de ceas)
  243. solutia uzuala e sa folosim memorii independente pt instructiuni si date
  244. chiar daca exista o memorie ram principala, mai sunt niste memorii mai micute foarte rapide (cele cache)
  245.  
  246. hazard structural (acces simultan la blocul de registri)
  247.  
  248. add $1, .... -> se scrie in blocul de reg in instr 5
  249. inst1
  250. inst2
  251. add $2, $1 -> se citeste din blocul de reg in instr2
  252.  
  253. solutie? intarziere suplimentara sau un artificiu (sa scriem in blocul de registri pe front descrescator)
  254. asta inseamna ca in perioada 5 la mijlocul perioadei se executa scrierea, si pe a doua se citeste combinational.
  255.  
  256. dar acest artificiu ne rezolva cel mult o intarziere suplimentare
  257.  
  258.  
  259. HAZARD DE DATE (TEHNICA DE FORWARDING)
  260.  
  261. prima instructiune calculeaza $2 iar restul il preluceaza
  262.  
  263. sub $2, $1, $3
  264.  
  265. cine produce noua valoare in sub (in ALU)
  266. pe perioada 3 de ceas de fapt -20 apare in calea de date la iesirea ALU
  267. cand va fi necesar aceasta valoare sa fie folosita de instr imediat urmatoare?
  268. pe periaoda 4 la instr urmatoare
  269.  
  270. RAW HAZARD (operatie de citire dupa operatie de scriere)
  271. ca sa nu inseram instructiuni noop (putem face forwarding)
  272.  
  273. deci la iesirea alu avem de fapt valoarea actualizata si o ducem in intrarea alu a urmatoarei instructiuni -> avem legaturi noi
  274. interpunem niste multiplexoare.
  275. legam iesirile coresp de la alu din registrii intermediari de duap ex si dupa mem.
  276.  
  277. 2 mux-uri
  278. cei 32 biti asociati cu iesirea alu se leaga pe cele 2 mux-uri (pt ca putem pune pe fiecare intrare alu)
  279. in mux vine iesirea alu dupa primul registrul intermediar si iesirea din wb dupa al doilea registru intermediar si de asemenea ramane intrarea veche (rd1,rd2)
  280.  
  281. apare un forwarding unit (cum spunem ca este hazard)
  282. ne uitam la registru destinatie si daca la instructiunea urmatoare unul din cei 2 registrii sursa este registrul destinatie anterior.
  283.  
  284. in unitatea de forwarding se pot citi cele 3 adrese de registri (rs rt si rd) si trebuie sa le compare
  285. ca sa folosim rezultatul corect, in forwarding unit trebuie implementata o logica combinationala de control.
  286.  
  287. MEM HAZARD (intre instructiuni consecutive, distanta 1)
  288. WB HAZARD(intre instructiuni de distanta 2)
  289.  
  290. pt MEM HAZARD
  291.  
  292. daca instr care este in etajul mem scrie in blocul de registrii
  293. if(ex/mem.regwrite and ex/mem.register !=0)
  294. in cazul in care se scrie in registrul 0 ca oricum nu ne intereseaza scrierea ca e protejat la scriere)
  295. and ex/mem.register rd == id/ex.register rs
  296. forwardA = 10
  297.  
  298. aceiasi logica si pt multiplexorul 2 numai cca are id/ex.register rt
  299.  
  300. aceiasi logica si pt etajul wb
  301. hazardul mem daca exista, are prioritate la rezolvare.
  302.  
  303. aceiasi logica ca la hazard mem la wb numai ca avem o linie in plus
  304. ex/mem.register rd != id/ex register rs (nu avem hazard mem)
  305. mem/wb .register rd = id/ex register rs (avem wb)
  306.  
  307. exista si hazarduri care nu se pot rezolva decat prin asteptare
  308. daca vrem sa incarcam intr-un registru o valoarea din memorie si pe urma vrem s-o folosim in instr urmatoare.
  309. suntem obligati sa introducem o intarziere
  310. in hardware e o instructiune no operation
  311. ramanere intr-un etaj (pc constant intre 2 perioade de ceas sa ramana in if aceiasi instructiune)
  312.  
  313. unitate de detectare de hazard.
  314. verifica daca in etajul ex este lw.
  315. memread e 1 doar cand lw este in acel etaj
  316. daca este 1 atunci se compara (id/ex rt cu if/id rs sau id/ex rt cu id/id rt) -> stall daca sunt egali.
  317.  
  318. noop in hardware -> se seteaza pe 0 toate semnalele de control care ar activa scriere (regwrite, memwrite, branch, jump) pt ca nici nu scriem in memorie/blocul de reg si nu executa niciun salt.
  319.  
  320. in mod standard in mips noop este sll $0 $0 $0 (opcode si func sunt toate 0) (avem 32 de biti de 0)
  321.  
  322. HAZARD DE CONTROL
  323.  
  324. (instr de salt)
  325. decizia de salt are loc in etajul mem (se da comanda la mux daca sarim sau nu)
  326. instr urmatoare de dupa beq sunt transformate in noop pt ca ele au intrat deja in pipeline
  327. (nu ar trebui sa fie executate conform fluxului de program)
  328. o solutie ar fi sa reducem nr de instructiuni incerte dupa un salt conditionat.
  329. transformam urmatoare instructiune in noop sau (semnal de control care permite sa anulam continutul registrului if/id) (in felul acesta daca avem o instr beq, unitatea de hazard detection o sa dea o comanda de anulare a registrului if/id (noop)
  330.  
  331. flush (anulare)
  332. stall (asteptare)
  333.  
  334. SIMULARE COLOCVIU
  335.  
  336. SW $6, -229($0)
  337. ce valoare (in baza 10) va avea iesirea ALU ?
  338. -229 (suma dintre -229 si 0)
  339.  
  340. sub $5 $5 $6
  341. 000_101_110_101_101
  342.  
  343. paint style :
  344.  
  345. pas 2.a - conexiuni noi :
  346.  
  347. de la campul RT I(9-7) legat la write address de la rf
  348. iesirea ext imm se leaga la intrarea b din alu
  349. iesirea sumatorului pc + 1 se leaga la intrarea 0 de la mux jump
  350. iesirea alu result se leaga la write data de la rf
  351.  
  352. muxul alusrc se elimina deoarece in alu pe intrarea b intra doar imm extins (e doar instructiunea addi)
  353. sumatorul pentru branch addres nu mai este necesar (nu exista beq in varianta simplificata)
  354.  
  355. PC <- PC + I(15-13) | I(12-0) ; jump = 1 , regwrite = 0, restul x
  356. addi : RF[rt] <- RF[rs] + s_ext(imm); regwrite = 1, aluop = 00 ; extop = 1; jump = 0
  357.  
  358. se considera descrierea in vhdl a unui circuit format din 2 registre de 1 bit (flip flop d, sincron front crescator cu semnal de validare/activare a scrierii) iesirile din registre sunt legate la intrarile unui mux 2:1, iesirea muxului este legata la intrarile altor 2 registre. ambele registre functioneaza la acelasi semnal de ceas (clk) si sunt legate la acelasi semnal de activare a scrierii care vine la un monoimpuls (semnalul en). Semnalul de selectie pt mux este sw(0). Semnalele clk, en si sw(0) se presupun declarate.
  359.  
  360. -- zona semnale (2 registre de 1 bit)
  361. signal q1,q2 : std_logic;
  362. signal muxo : std_logic;
  363.  
  364. process(clk)
  365. begin
  366. if(rising_edge(clk) then
  367. if en = '1' then
  368. q1 <= muxo;
  369. q2 <= muxo;
  370. end if;
  371. end if;
  372. end process;
  373.  
  374. process (sw(0))
  375. begin
  376. if sw(0) = '0' then
  377. muxo <= q1;
  378. else
  379. muxo <= q2;
  380.  
  381. end process;
Add Comment
Please, Sign In to add comment