Mikroarkitektur
Niveauer af abstrakte maskiner Spørgsmål... Hvordan realiseres IJVM maskinen (lev. 2), eller hvordan ser en IJVM-CPU ud? Opbygning (mikroarkitekturen Mic-1) Anvendelse (mikroprogrammet IJVM)
Maskinniveau Vores fokus er på IJVM maskinen
IJVM instruktioner Afvikles i en fetch-decode-execute cyklen af CPU'en
Fetch-decode-execute 1. Fetch the next instruction from memory into the instruction register. 2. Change the program counter to point to the following instruction. 3. Determine the type of the instruction just fetched. 4. If the instruction uses a word in memory, determine where it is. 5. Fetch the word, if needed, into a CPU register. 6. Execute the instruction. 7. Go to step 1 to begin executing the following instruction. Se SCO side 54
Mikroarkitektur: Mic-1
Mikroarkitektur: Mic-1 CPU registre kontrolenhed fetch- decode- Execute af IJVM instruktioner beregningsenhed
Registre: MAR: Memory Address Register. MDR: Memory Data Register. PC: Program Counter MBR: Memory Byte/Buffer Register SP: Stack Pointer LV: Local Variable Frame CPP: Constant Pool Pointer TOS: Top Of Stack OPC: Old Program Counter H: Help register
Kontrol af beregningsenheden Shifter kontrol: SLL8 (shift left logical 8) SRA1 (shift right arithmetic 1)
Timing af beregningsenheden
Eksempel: PC=PC+1 1 1 110101 00
Eksempel: PC=PC+1 1 1 110101 00
Eksempel: PC=PC+1 1 1 110101 00
Eksempel: PC=PC+1 1 1 110101 00
Eksempel: PC=PC+1 1 1 110101 00
Lager tilgang Stack Constant Pool Method Area 4.294.967.296 bytes (32 bit) / 1.073.741.824 words (30 bit) PC/MBR bruges til at tilgå Method Area ved brug af byte adresser. MAR/MDR bruges til at tilgå Stack og Constant Pool ved brug af word adresser. Timing: hvis PC (MAR) sættes i cycle k indeholder MBR (MDR) indholdet af lagercellen i starten af cycle k+2.
Timing ved lager tilgang MDR/MBR kan læses Cykel k Cykel k+1 Cykel k+2 MAR/PC sættes Bus/lager opererer PC/MBR bruges til at tilgå Method Area ved brug af byte adresser. MAR/MDR bruges til at tilgå Stack og Constant Pool ved brug af word adresser. Timing: hvis PC (MAR) sættes i cycle k indeholder MBR (MDR) indholdet af lagercellen i starten af cycle k+2.
Timing ved lager tilgang Mulighed for back-to-back reads jvf. SCO 240 MDR/MBR kan læses Cykel k Cykel k+1 Cykel k+2 MAR/PC sættes Bus/lager opererer PC/MBR bruges til at tilgå Method Area ved brug af byte adresser. MAR/MDR bruges til at tilgå Stack og Constant Pool ved brug af word adresser. Timing: hvis PC (MAR) sættes i cycle k indeholder MBR (MDR) indholdet af lagercellen i starten af cycle k+2.
Tolkning af MAR adresse MAR indeholde word-adressen [0, 1.073.741.824] på det maskinord der skal indlæses. Dette skal oversættes til en byte-adresse i et 4 Gb lager... Dette gøres ved at gange med 4, dvs. skifte to plads til venstre
Udlæsning af MBR til B-bus MBR (en byte) kan udlæses til B-bus, som 1) unsigned, hvis fx argument til iload 2) signed, hvis fx argument til bipush unsigned: w 7 w 6 w 5 w 4 w 3 w 2 w 1 w 0 00... 00w 7 w 6 w 5 w 4 w 3 w 2 w 1 w 0 signed: w 7 w 6 w 5 w 4 w 3 w 2 w 1 w 0 w 7 w 7... w 7 w 7 w 7 w 6 w 5 w 4 w 3 w 2 w 1 w 0 Sign extension
Mikroarkitektur: Mic-1 CPU registre kontrolenhed fetch- decode- Execute af IJVM instruktioner beregningsenhed
Mikroinstruktions format 8 1
Mikroinstruktion: PC=PC+1 1 1 110101 00
Mikroinstruktion: PC=PC+1 1 1????????? 000 00110101 000000100 000 0001 110101 00
Der afvikles een mikroinstruktion per clock-cycle, timing er vigtig...
Der afvikles een mikroinstruktion per clock-cycle, timing er vigtig... T = 0
Der afvikles een mikroinstruktion per clock-cycle, timing er vigtig... T = [0, w]
Der afvikles een mikroinstruktion per clock-cycle, timing er vigtig... T = [ w, w+ x]
Der afvikles een mikroinstruktion per clock-cycle, timing er vigtig... T = [ w+ x, w+ x+ y]
Der afvikles een mikroinstruktion per clock-cycle, timing er vigtig... T = [ w+ x+ y, w+ x+ y+ z]
Der afvikles een mikroinstruktion per clock-cycle, timing er vigtig... T = end of cycle
Der afvikles een mikroinstruktion per clock-cycle, timing er vigtig... T = end of cycle Hvorfor 1-bit flip-flops?
Bestemmelse af næste mikroinstruktion N Z JAMN JAMZ Addr MBR JMPC resultat fra ALU er Negativt resultat fra ALU er 0 (Zero) angiver om N/Z skal bruges ved beregning af næste mikroinstruktion 9 bit fra aktuel mikroinstruktion 8 bit fra MBR register angiver om MBR skal bruges ved beregning af næste mikroinstruktion
Bestemmelse af næste mikroinstruktion N Z JAMN JAMZ Addr MBR JMPC resultat fra ALU er Negativt resultat fra ALU er 0 (Zero) angiver om N/Z skal bruges ved beregning af næste mikroinstruktion 9 bit fra aktuel mikroinstruktion 8 bit fra MBR register angiver om MBR skal bruges ved beregning af næste mikroinstruktion w 8 w 7 w 6 w 5 w 4 w 3 w 2 w 1 w 0 or N or Z? w 7 w 6 w 5 w 4 w 3 w 2 w 1 w 0 or u 7 u 6 u 5 u 4 u 3 u 2 u 1 u 0 fra Addr hvis JAMN=1 hvis JAMZ=1 fra MBR hvis JMPC=1
Eksempel: JAMZ=1 Et betinget hop på Z (indikeret ved JAMZ=1) kan kun hoppe til adresse x (ved Z=0) eller adresse x+256 (Z=1). I eksempelt ovenfor er x = 0x92.
Ordreafkodning.method main // int main.args 3 // (int a, int b).define a = 1.define b = 2 iload a iload b isub ireturn main index: 0 method area: 10 bytes 00 03 00 00 15 01 15 02 64 ac constant pool: 1 words 00000000 goto(mbr), Addr=000000000, JMPN=0, JMPZ=0, JMPC=1
Ordreafkodning Første mikroinstruktion for iload Første mikroinstruktion for isub 0x15 0x64.method main // int main.args 3 // (int a, int b).define a = 1.define b = 2 iload a iload b isub ireturn main index: 0 method area: 10 bytes 00 03 00 00 15 01 15 02 64 ac constant pool: 1 words 00000000 Hvis 0x15 er indlæst i MBR (via læsning fra adresse PC i lageret), så vil goto(mbr) hoppen til celle 0x15 i mikrolageret... goto(mbr), Addr=000000000, JMPN=0, JMPZ=0, JMPC=1
Mikroarkitektur: Mic-1 CPU registre kontrolenhed fetch- decode- Execute af IJVM instruktioner beregningsenhed
Mikroprogrammering
Mikroprogrammering Skal have et mikroprogram, dvs. et indhold af mikrolageret der realiserer IJVMs instruktionssæt Fetch-Decode-Execute...
Fetch-decode-execute 1. Fetch the next instruction from memory into the instruction register. 2. Change the program counter to point to the following instruction. 3. Determine the type of the instruction just fetched. 4. If the instruction uses a word in memory, determine where it is. 5. Fetch the word, if needed, into a CPU register. 6. Execute the instruction. 7. Go to step 1 to begin executing the following instruction. Se SCO side 54
Fetch Stack Constant Pool Method Area 4.294.967.296 bytes (32 bit) / 1.073.741.824 words (30 bit) PC/MBR bruges til at tilgå Method Area ved brug af byte adresser. MAR/MDR bruges til at tilgå Stack og Constant Pool ved brug af word adresser. Timing: hvis PC (MAR) sættes i cycle k indeholder MBR (MDR) indholdet af lagercellen i starten af cycle k+2.
Fetch MDR/MBR kan læses Cykel k Cykel k+1 Cykel k+2 MAR/PC sættes Bus/lager opererer PC/MBR bruges til at tilgå Method Area ved brug af byte adresser. MAR/MDR bruges til at tilgå Stack og Constant Pool ved brug af word adresser. Timing: hvis PC (MAR) sættes i cycle k indeholder MBR (MDR) indholdet af lagercellen i starten af cycle k+2.
Decode.method main // int main.args 3 // (int a, int b).define a = 1.define b = 2 iload a iload b isub ireturn main index: 0 method area: 10 bytes 00 03 00 00 15 01 15 02 64 ac constant pool: 1 words 00000000 goto(mbr), Addr=000000000, JMPN=0, JMPZ=0, JMPC=1
Decode Første mikroinstruktion for iload Første mikroinstruktion for isub 0x15 0x64.method main // int main.args 3 // (int a, int b).define a = 1.define b = 2 iload a iload b isub ireturn main index: 0 method area: 10 bytes 00 03 00 00 15 01 15 02 64 ac constant pool: 1 words 00000000 Hvis 0x15 er indlæst i MBR (via læsning fra adresse PC i lageret), så vil goto(mbr) hoppen til celle 0x15 i mikrolageret... goto(mbr), Addr=000000000, JMPN=0, JMPZ=0, JMPC=1
Execute Sekvens af mikroinstruktioner der implementerer Meaning...
Symbolsk mikroprogrammering (Absolut) Mikroprogram 000: 0048148005 001: 0058148005 002: 0018118400 003: 00203d8404 004: 00283d8404 005: 00303c0804 006: 0038370805 007: 0040148005 008: 00013f0004 009: 000a3f0004 00a: 00603f0805 00b: 00603f0404 00c: 0038000000 00d: 0000000000 100: 0800000000 101: 0050148004 1ff: 0000000000 Behov for et symbolsk mikroprogrammeringssprog med tilhørende mikroassembler Micro Assembly Language (MAL) Mikroassembler: mic1-asm
Symbolsk mikroprogrammering Behov for at specificere: ALU input registre, ALU og skifter operationer, output registre. Lager operationer (rd,wr,fetch). Ubetingede hop: ifm. næste mikroinstruktion og JMPC bit. Betingede hop: JAMN og JAMZ bits
ALU og skifter operationer i MAL Skifter operationer: 1 bit aritmetisk højreskift: >> 1 8 bit logisk venstre skift: << 8
Lager operationer Læsning/skrivning af ord (words) i stakområdet: Specificeres ved brug af rd og wr. Ord der læses/skrives udpeges af MAR. Læsning af ord i Constant Pool: Specificeres ved brug af rd. Ord der læses/skrives udpeges af MAR. Læsning af byte i Method Area: Specificeres ved brug af fetch. Byte der læses udpeges af PC.
Hop instruktioner Ubetingede hop: goto L På indholdet af MBR (JMPC=1): goto MBR Betingede hop: På N (JAMN = 1) ALU output negativt: if N goto L1; else goto L2 På Z (JAMZ = 1) ALU output 0 (Zero): if Z goto L1; else goto L2
Mikroassembler Oversætte symbolsk mikrokode til absolut mikrokode Problem: beregne absolutte adresser for labels under hensyntagen til: Mikroinstruktioner hvis placering er absolut (ordreafkodning). Betingede hop på N og Z. Resultat af oversættelse (512 x 36 bit) lægges ind i kontrollageret.
IJVM mikroprogrammet SCO figur 4.17
IJVM mikroprogrammet Fetch Decode Execute SCO figur 4.17
Invariant ved main1 PC udpeger den byte i Method Area, som indeholder instruktionskoden for den IJVM instruktion der skal afvikles MBR indeholder instruktionskoden for den IJVM instruktion, der skal afvikles, MBR=m[PC] SP udpeger det øverste ord på stakken LV udpeger det første ord i det aktuelle stakafsnit CPP udpeger det første ord i Constant Pool TOS indeholder det øverste ord på stakken, TOS=m[SP]
Eksempel: iadd Method Area: 0x60 0x10 0x2a 0x64 PC Opkode for næste instruktion Invariant: MBR=0x60, TOS=m[SP] Ønsker: SP b a SP a+b PC=PC+1 MBR=0x10 SP=SP-1 TOS=a+b
Eksempel: bipush Method Area: 0x60 0x10 0x2a 0x64 PC Opkode for næste instruktion Invariant: MBR=0x10, TOS=m[SP] Ønsker: SP a+b SP 0x2a a+b PC=PC+2 MBR=0x64 SP=SP+1 TOS=0x2a
Mic-1 værktøjer Beskrevet i Mic-1 Tools Manual MAL Mikroassembler Oversætte MAL programmer til absolut mikrokode: $ mic1-asm ijvm.mal ijvm.mic1 Mic-1 Simulator Afvikle IJVM programmer i bytekode format: $ mic1 ijvm.mic1 min.bc 53 174 IJVM instruktioner fortolkes nu af mikroprogrammet.
IJVM mikroprogrammet Tilgængelig i filen ijvm.mal main: PC = PC + 1; fetch; goto (MBR) nop = 0x00: goto main iadd = 0x60: MAR = SP = SP - 1; rd H = TOS MDR = TOS = MDR + H; wr; goto main
Oversættelse til absolut mikrokode $ mic1-asm ijvm.mal ijvm.mic1 entry: 003 000: 0010000000 goto 0x002; 001: 0208350201 PC = PC + 1; goto 0x041; 002: 0004350211 PC = PC + 1; fetch; goto (MBR); 003: 0228000000 goto 0x045; 004: 0028148007 H = TOS; goto 0x005; 005: 00103c2140 MDR = TOS = H + MDR; wr; goto 0x002; 006: 0038148007 H = TOS; goto 0x007; 007: 00103f2140 MDR = TOS = MDR - H; wr; goto 0x002; 008: 0048148007 H = TOS; goto 0x009; 009: 00100c2140 MDR = TOS = H and MDR; wr; goto 0x002;
Eksempel IJVM program.method main.args 3.define a = 1.define b = 2 bipush 88 iload a iload b invokevirtual min ireturn $ ijvm-asm min.j min.bc main index: 0 method area: 40 bytes 00 03 00 00 10 58 15 01 15 02 b6 00 01 ac 00 03 00 01 15 01 15 02 64 9b 00 0a 15 02 36 03 a7 00 07 15 01 36 03 15 03 ac constant pool: 2 words 00000000 0000000e
Mic-1 simulator $ mic1 ijvm.mic1 min.bc 53 174 Mic1 Trace of ijvm.mic1 with min.bc stack = 0, 1, 174, 53, 15 bipush 88 [10 58] stack = 88, 0, 1, 174, 53, 15 iload 1 [15 01] stack = 53, 88, 0, 1, 174, 53, 15 iload 2 [15 02] stack = 174, 53, 88, 0, 1, 174, 53, 15 invokevirtual 1 [b6 00 01] stack = 12, 13, 0, 174, 53, 21, 0, 1 iload 1 [15 01] stack = 53, 12, 13, 0, 174, 53, 21, 0 iload 2 [15 02] stack = 174, 53, 12, 13, 0, 174, 53, 21 isub [64] stack = -121, 12, 13, 0, 174, 53, 21, 0 iflt 10 [9b 00 0a] stack = 12, 13, 0, 174, 53, 21, 0, 1 return value: 53
Mic-1 simulator %>mic1 b istore ijvm.mic1 min.bc 53 174 Mic1 Trace of ijvm.mic1 with min.bc stack = 0, 1, 174, 53, 15 bipush 88 [10 58] stack = 88, 0, 1, 174, 53, 15 iload 1 [15 01] stack = 53, 88, 0, 1, 174, 53, 15 iload 1 [15 01] stack = 53, 12, 13, 0, 174, 53, 21, 0 istore 3 [36 03] MAR=23 MDR=53 PC=35 MBR=54 MBRU=54 SP=23 LV=17 CPP=10 TOS=53 OPC=23 H=17 0x002: PC = PC + 1; fetch; goto (MBR); MAR=23 MDR=53 PC=36 MBR=54 MBRU=54 SP=23 LV=17 CPP=10 TOS=53 OPC=23 H=17 0x036: H = LV; goto 0x01d; MAR=23 MDR=53 PC=36 MBR=3 MBRU=3 SP=23 LV=17 CPP=10 TOS=53 OPC=23 H=17 iload 3 [15 03] stack = 53, 12, 13, 53, 174, 53, 21, 0
Mikroarkitektur: Mic-1 CPU registre kontrolenhed fetch- decode- Execute af IJVM instruktioner beregningsenhed