Y86: Datapath Sequencial Arquitectura de Computadores Lic. em Engenharia Informática Luís Paulo Santos
Y86: Datapath Sequencial Conteúdos Resultados de Aprendizagem 9 Organização do Processador 9.1 Datapath sequencial C1 R9.1 Analisar e descrever organizações sequenciais de processadores elementares C1 AC Y86: Datapath sequencial 2
Circuitos Lógicos 0 1 0 Tensão Funcionam com valores discretos extraídos de um sinal contínuo Circuitos binários: Tempo Cadasinaltem o valor 0 ou1 AC Y86: Datapath sequencial 3
Circuitos Lógicos Existem 2 grandes tipos de componentes ou circuitos: Circuitos combinatórios Reagem continuamente a mudanças nos valores das entradas (com um atraso de propagação) Circuitos sequenciais Capazes de memorizar informação As suas saídas só se alteram quando um sinal de temporização (relógio ou clock) o autoriza AC Y86: Datapath sequencial 4
a b Circuitos Combinatórios: Gates And Or Not out a b out a out out = a && b out = a b out =!a As saídas são funções Booleanas das entradas Respondem continuamente a mudanças nas entradas Com algumatraso Rising Delay Falling Delay a && b b Voltage a Time AC Y86: Datapath sequencial 5
Circuitos Combinatórios Rede Acíclica Entradas Saídas Rede Acíclica de Componentes Lógicos Respondem continuamente a mudanças nas entradas As saídas transformam-se (após um atraso)em funções Booleanas das entradas AC Y86: Datapath sequencial 6
Circuitos combinatórios: multiplexer s b 31 a 31 out 31 s b 30 out 30 a 30 B A MUX Out b 0 a 0 out 0 Selecciona palavra de entrada AouBdependendodo sinal de controlo s AC Y86: Datapath sequencial 7
Circuitos combinatórios: ALU s1 s0 Y X A B A L U OF ZF CF Se s1,s0 == 00 (0) então X + Y Se s1,s0 == 01 (1) então X - Y Se s1,s0 == 10 (2) então X & Y Se s1,s0 == 11 (3) então X Y Lógica Combinatória Responde continuamente às entradas Sinais de controlo(s1,s0) seleccionam função a computar Correspondemàs4 instruçõeslógico-aritméticasdo Y86 Também calcula os códigos de condição AC Y86: Datapath sequencial 8
Circuitos Sequenciais: Registos Estrutura Armazenam dados i 7 i 6 i 5 i 4 i 3 D C D C D C D C D C Q+ Q+ Q+ Q+ Q+ o 7 o 6 o 5 o 4 o 3 As saídassóvariamquandoo valor do sinaldo clock sobede 0 para1 i 2 i 1 i 0 D C D C D C Q+ Q+ Q+ o 2 o 1 o 0 1 0 Clock Fim do ciclo: Actualizar registo Fim do ciclo: Actualizar registo Fim do ciclo: Actualizar registo AC Y86: Datapath sequencial 9
Circuitos Sequenciais: Banco de Registos vala valw srca A dstw Portas de leitura valb Register file W valm Portas de escrita srcb B dstm Clock Armazena múltiplas palavras de dados (múltiplos registos) Endereços especificam quais os registos a ler e/ou escrever Endereços nos sinais srca, srcb, dstw, dstm Mantem os valores dos registos: %eax, %ebx, %esp, etc. O ID do registoserve comoendereço ID 8 implicaquenãoé feitaleituraouescrita Múltiplas Portas Pode ler(srca, srcb) e/ou escrever(dstw,dstm) múltiplos registos num ciclo AC Y86: Datapath sequencial 10
Estado Y86: Organização Sequencial Program counter () Códigos de Condição(CC) Banco de Registos Memória Data: para escrita/leitura de dados Instruction: para leitura de instruções Fluxo de Instruções Lerinstruçãono endereçodado pelo Processar nos vários estágios Escrita: Actualizar registos genéricos Escrevernamemóriade dados Actualizar Write back Memory Execute Decode Fetch icode, ifun ra, rb valc Instruction memory new vale, valm Addr, Data Bch CC alua, alub srca, srcb dsta, dstb valm Data memory vale ALU vala, valb valp increment A B M Register file E AC Y86: Datapath sequencial 11
Y86: Organização Sequencial Busca(Fetch) Ler instruções da memória icode:ifun ; ra:rb ; valc ; valp Descodificação(Decode) Ler registos: vala:valb DeterminaID de regs. a alterar: srca ; srcb ; dste ; dstm Execução(Execute) Calcular valor ou endereço/ CC vale / CC (Bch ) Memória(Memory) Lerouescreverdados valm Actualização(Write Back) Escrita nos registos genéricos Actualização Write back Memory Execute Decode Fetch icode, ifun ra, rb valc Instruction memory new vale, valm Addr, Data Bch CC alua, alub valm Data memory AC Y86: Datapath sequencial 12 srca, srcb dsta, dstb valp vale ALU vala, valb increment A B M Register file E
Y86: Organização Sequencial Write back new vale, valm valm Atenção à temporização: 1. Busca(início do ciclo) 2. Descodificação 3. Execução 4. Leitura da Memória 5. Escritas TODAS as escritas ocorrem SIMULTANEAMENTE no FIM do CICLO EscritanosCC Escrita na memória Escrita nos regs. genéricos Escritano 4 3 2 1 Memory Execute Decode Fetch icode, ifun ra, rb valc Instruction memory Addr, Data Bch CC alua, alub srca, srcb dsta, dstb Data memory valp vale ALU vala, valb increment A B M Register file E AC Y86: Datapath sequencial 13
Instrução Y86: operações lógico-aritméticas OPl ra, rb 6 fn ra rb Fetch Decode Ler2 bytes icode:ifun ; ra:rb Calcular próximo valp = + 2 Ler registos vala = R[rA] valb = R[rB] Execute Realizar operação vale = vala OP valb Códigos de condição cc = f(vale) Memory Nada a fazer Write back Actualizar registo R[rB] = vale Update Incrementar = valp AC Y86: Datapath sequencial 14
Instrução Y86: operações lógico-aritméticas Fetch OPl ra, rb icode:ifun M 1 [] ra:rb M 1 [+1] Ler byte de instrução Ler byte dos registos Decode Execute Memory Write back update valp +2 vala R[rA] valb R[rB] vale valb OP vala Set CC R[rB] vale valp Calcular próximo Ler operando A Ler operando B Realizar operação na ALU Códigos de condição Escrever resultado Actualizar Formularexecuçãode instruçõescomoumasequênciade passos simples Usara mesmaforma geralparatodasas instruções AC Y86: Datapath sequencial 15
Instrução Y86: irmovl irmovl V, rb 3 0 8 rb V Fetch Decode Ler6 bytes icode:ifun ; ra:rb ; valc Calcular próximo valp = + 6 Nada a fazer Execute Passar constante vale = valc Memory Nada a fazer Write back Escrever registo R[rB] = vale Update Incrementar = valp AC Y86: Datapath sequencial 16
Instrução Y86: irmovl Fetch Decode Execute Memory Write back update irmovl V, rb icode:ifun M 1 [] ra:rb M 1 [+1] valc M 4 [+2] valp +6 vale valc R[rB] vale valp Ler byte de instrução Ler byte de registos Ler deslocamento Calcular próximo Passar constante Escrever resultado Actualizar AC Y86: Datapath sequencial 17
Instrução Y86: rmmovl rmmovl ra, D(rB) 4 0 ra rb D Fetch Decode Ler6 bytes icode:ifun ; ra:rb ; valc Calcular próximo valp = + 6 Ler registos vala = R[rA] valb = R[rB] Execute Calcular endereço vale = valb + valc Memory Escrever na memória M 4 [vale] = vala Write back Nada a fazer Update Incrementar = valp AC Y86: Datapath sequencial 18
Instrução Y86: rmmovl Fetch Decode Execute Memory Write back update rmmovl ra, D(rB) icode:ifun M 1 [] ra:rb M 1 [+1] valc M 4 [+2] valp +6 vala R[rA] valb R[rB] vale valb + valc M 4 [vale] vala valp Ler byte de instrução Ler byte de registos Ler deslocamento Calcular próximo Ler operando A Ler operando B Calcular endereço Escrever na memória Actualizar AC Y86: Datapath sequencial 19
Instrução Y86: popl popl ra b 0 ra 8 Fetch Decode Ler2 bytes icode:ifun ; ra:rb Calcular próximo valp = + 2 Ler registos vala = R[%esp] valb = R[%esp] Execute Calcular próximo topo da pilha vale = valb + 4 Memory Lerda memória valm = M 4 [vala] Write back Escrever no registo R[rA] = valm R[%esp] = vale Update Incrementar = valp AC Y86: Datapath sequencial 20
Instrução Y86: popl Fetch Decode Execute Memory Write back update popl ra icode:ifun M 1 [] ra:rb M 1 [+1] valp +2 vala R[%esp] valb R[%esp] vale valb + 4 valm M 4 [vala] R[%esp] vale R[rA] valm valp Ler byte de instrução Ler byte de registo Calcular próximo Ler stack pointer Ler stack pointer Incrementar stack pointer Ler topo da pilha Actualizar stack pointer Escrever resultado Actualizar Usar ALU para incrementar stack pointer Actualizar dois registos: ra e %esp AC Y86: Datapath sequencial 21
Instrução Y86: Jump jxx Dest 7 fn Dest continua: XX XX Não tomado Dest: XX XX Tomado Fetch Ler5 bytes icode:ifun ; valc Calcular próximo valp = + 5 Decode Nada a fazer Execute Saltar?? Bch = f(ifun, CC) Memory Nada a fazer Write back Nada a fazer Update Novo valor dependede Bch = (Bch? valc : valp) AC Y86: Datapath sequencial 22
Instrução Y86: Jump Fetch Decode Execute Memory Write back update jxx Dest icode:ifun M 1 [] valc M 4 [+1] valp +5 Bch f(ifun, CC) (Bch? valc : valp) Ler byte de instrução Ler destino do salto (se tomado) Calcular próximo (se ñ tomado) Saltar? Actualizar Calcular ambos os endereços Escolherdestinobaseadono tipode saltoe noscódigosde condição AC Y86: Datapath sequencial 23
Instrução Y86: call call Dest return: 8 0 Dest XX XX target: XX XX Fetch Ler5 bytes Decode icode:ifun ; valc Calcular próximo (end. de retorno) valp = + 5 Le registo valb = R[%esp] Execute Calcularnovo topoda pilha vale = valb - 4 Memory Push do end. de retorno Write back M 4 [vale] = valp Actualizar topo da pilha R[%esp] = vale Update = valc AC Y86: Datapath sequencial 24
Instrução Y86: call Fetch Decode Execute Memory Write back update call Dest icode:ifun M 1 [] valc M 4 [+1] valp +5 valb R[%esp] vale valb - 4 M 4 [vale] valp R[%esp] vale valc Ler byte de instrução Ler destino do salto Calcular endereço de retorno Ler addr do topo da pilha Novo topo da pilha Guardar endereço de retorno Actualizar topo da pilha Actualizar AC Y86: Datapath sequencial 25
Instrução Y86: ret ret 9 0 return: XX XX Fetch Decode Ler1 byte icode:ifun Calcularpróximo valp = + 1 Ler registo vala = R[%esp] valb = R[%esp] Execute Calcularnovo topoda pilha vale = valb + 4 Memory Lerend. de retorno Write back valm = M 4 [vala] Actualizar topo da pilha R[%esp] = vale Update = valm AC Y86: Datapath sequencial 26
Instrução Y86: ret ret icode:ifun M 1 [] Ler byte de instrução Fetch Decode Execute Memory Write back update valp +1 vala R[%esp] valb R[%esp] vale valb + 4 valm M 4 [valea R[%esp] vale valm Calcular próximo Ler addr do topo da pilha Novo topo da pilha Ler endereço de retorno Actualizar topo da pilha Actualizar AC Y86: Datapath sequencial 27
Y86: Valores calculados Fetch icode Instruction code ifun Instruction function ra Instr. Register A rb Instr. Register B valc Instruction constant valp Incremented Decode vala Register value A valb Register value B Execute vale ALU result Bch Branch flag Memory valm Value from memory AC Y86: Datapath sequencial 28
Y86: SEQ new New Ovais brancas: sinais internos valm data out Caixas azuis: lógica sequencial escrita controlada pelo clock Memory Mem. control read write Data memory Addr Data Caixas cinzentas: multiplexers Caixas laranja: Cálculo ALU e incrementar Execute Bch CC ALU A vale ALU ALU B ALU fun. Caixas castanhas: controlo vala valb Traço grosso: 32 bits Traço fino: 4 bits Decode icode ifun ra rb valc valp A B M Register file E Write back Tracejado: 1 bit Fetch Instruction memory increment AC Y86: Datapath sequencial 29
Y86: Fetch icode ifun ra rb valc valp Blocos : Registo Memória Instruções: Ler6 bytes ( to +5) Split: Dividirbyte emicodee ifun Align: ObterrA, rb e valc Instr valid Split Byte 0 Instruction memory Align Bytes 1-5 Need valc Need regids increment Lógica de Controlo (sinais obtidos a partir de icode) Instr. Valid: esta instução é válida? Need regids: esta instrução tem os campos ra:rb? Need valc: esta instrução tem um valor imediato? AC Y86: Datapath sequencial 30
Y86: Decode vala valb valm vale Banco de Registos LerportasA, B EscreverportasE, M EndereçossãoosIDs do registosou 8(não aceder) A B M Register file E dste dstm srca srcb dste dstm srca srcb icode ra rb Lógica de Controlo srca, srcb: registosa ler dsta, dstb: registos a escrever AC Y86: Datapath sequencial 31
Y86: Execute Unidades ALU Implementa 4 funções Gera códigos de condição Bch vale CC Registocom 3 bits bcond bcond Calcularse o saltoé tomado(bch) CC ALU ALU fun. Lógica de Controlo Set CC: AlterarCC? ALU A: EntradaA paraalu ALU B: EntradaB paraalu ALU fun: Quala funçãoa calcular? Set CC ALU A ALU B icode ifun valc vala valb AC Y86: Datapath sequencial 32
Y86: Memory Memória Lerouescreverumapalavra Lógica de Controlo Mem.read: leitura? Mem.write: escrita? Mem.addr: Selecciona addr Mem.data: Selecciona dados icode Mem. read Mem. write read write valm data out Data memory data in Mem Mem addr data vale vala valp AC Y86: Datapath sequencial 33
Y86: Novo Selecciona próximo valor do update OPl; XXmovl; popl ; valp New update jxx Dest Bch? valc : valp icode Bch valc valm valp update update call Dest valc ret valm AC Y86: Datapath sequencial 34
Implementação Y86: SEQ resumo Cada instrução expressa como uma sequência de passos elementares Mesma sequência geral para todos os tipos de instruções Identificar blocos combinatórios e sequenciais básicos Ligar e controlar com a lógica de controlo AC Y86: Datapath sequencial 35
Y86: SEQ Limitações Em cada ciclo do relógio os sinais têm que se propagar desde o, memória de instruções, banco de registos, ALU e memória até aos registos de novo: O período do relógio tem que ser suficientemente longo para permitir esta propagação O período do relógio é constante, logo tem que ser tão grande quanto necessário para a instrução mais lenta O relógio é, portanto, muito lento Cada unidade de hardware só está activa (é utilizada) durante uma fracção pequena do período do relógio Logo, desperdício das verdadeiras capacidades do equipamento AC Y86: Datapath sequencial 36
Y86: SEQ+ Memory Mem. control read write valm data out Data memory Estágio reordenado: passaa acontecer ao princípio Bch vale Addr Data Estágio Selecciona para a instrução actual Baseadonosresultadosda última instrução Estes sãoguardadosnum registo e consistem em: picode; pbch; pvalm ; pvalc ; pvalp nãoestáguardadoem nenhum registo Execute Decode Fetch CC icode ifun ra ALU A rb Instruction memory ALU valc ALU B valp vala increment ALU fun. valb A B M Register file Write back E picode pbch pvalm pvalc pvalp AC Y86: Datapath sequencial 37