Arquitetura de Computadores Trabalhos Práticos
Trabalhos Práticos 1. Bloco de memória em Verilog 2. Y86 1 instrução 5 ciclos 3. Y86 pipeline 4. Y86 dual core com cache 5. Trabalho no CUDA 3 pontos 7 pontos 10 pontos 15 pontos 15 pontos 2
Bloco de memória em Verilog module MEM1k (CLK,ADDR,DATA,RD,WR,CS); input [9:0] ADDR; inout [31:0] DATA; input CLK,RD,WR,CS; wire [9:0] AI = ADDR; wire [9:0] AO = ADDR; wire [31:0] DI = DATA; assign DATA = (CS & WR)?DO:32 bz; endmodule 3
Bloco de memória em Verilog Terminar implementação do bloco anterior CS = 1 se for realizar leitura ou escrita na memória RD = 1 se leitura da memória WR = 1 se escrita na memória Assumir que RD e WR nunca serão ativos ao mesmo tempo Leitura é assíncrona Escrita é síncrona no negedge do clock CLK Implementar bloco de memória MEM1M, com 1MByte ou 256k palavras de 32 bits utilizando blocos MEM1k 4
Processor Y86 CLK RESET INT Y86 DATA[31:0] ADDR[31:0] RD WR WAIT 5
Processor Y86 CLK : clock RESET : pino de reset. Quando o reset ocorrer, PC é atualizado para o valor 0x00000000 INT : pino de interrupção (será utilizado nos próximos trabalhos) DATA : pino de dados ADDR : pino de endereços RD : leitura de memória WR : escrita de memória WAIT : pino de espera (será utilizado nos próximos trabalhos) 6
Processor Y86 %eax %ecx %edx %ebx Program registers %esi %edi %esp %ebp Condition codes OF ZF SF PC Memory Registradores Mesmo que IA32 Condition Codes Flags de um bit que são modificadas por operações de ALU» OF: Overflow ZF: Zero SF:Negative Program Counter Indica endereço da próxima instrução Memória Endereçamento por byte, em little endian 7
Instruções do Y86 Formato 1 6 byte Tamanho da instrução pode ser determinado no primeiro byte Codificação mais simples que IA32 8
Codificação dos Registradores Identificação de 4 bits %eax %ecx %edx %ebx 0 1 2 3 %esi %edi %esp %ebp 6 7 4 5 Mesma codificação do IA32 Código 8 significa nenhum registrador 9
Exemplo de Instrução ADDL Assembly Codificação addl ra, rb 6 0 ra rb rb < ra + rb Y86 somente permite operações de ALU em registradores Ativa condition codes e.g., addl %eax,%esi Codificação: 60 06 Dois bytes Primeiro byte determina operação Segundo byte determina fonte e destino de dados 10
Instruções ALU (OP1) Add Código Operação Inc addl ra, rb 6 0 ra rb incl rb 6 4 8 rb Subtract (ra from rb) subl ra, rb 6 1 ra rb Dec decl rb 6 5 8 rb And andl ra, rb 6 2 ra rb Not notl rb 6 6 8 rb Exclusive Or xorl ra, rb 6 3 ra rb Or orl ra, rb 6 7 ra rb 11
Instruções Move rrmovl ra, rb 2 0 ra rb Register > Register irmovl V, rb 3 0 8 rb V Immediate > Register rmmovl ra, D(rB) 4 0 ra rb D Register > Memory mrmovl D(rB), ra 5 0 ra rb D Memory > Register Similares a movl do IA32 Formato de memória mais simples Nome da instrução determina tipo de dado 12
Exemplos de Instrução Move IA32 Y86 Codificação movl $0xabcd, %edx irmovl $0xabcd, %edx 30 82 cd ab 00 00 movl %esp, %ebx rrmovl %esp, %ebx 20 43 movl 12(%ebp),%ecx movl %esi,0x41c(%esp) mrmovl 12(%ebp),%ecx rmmovl %esi,0x41c(%esp) 50 15 f4 ff ff ff 40 64 1c 04 00 00 movl $0xabcd, (%eax) movl %eax, 12(%eax,%edx) movl (%ebp,%eax,4),%ecx 13
Instrução de Jump Jump Unconditionally jmp Dest 7 0 Dest Jump When Less or Equal jle Dest 7 1 Dest Jump When Less jl Dest 7 2 Dest Jump When Equal je Dest 7 3 Dest Jump When Not Equal jne Dest 7 4 Dest Jump When Greater or Equal jxx Codificação dos tipos de jump são diferenciadas pelo function code Utiliza condition codes Idênticas ao IA32 Codificam endereço completo Ao contrário de endereçamento relativo ao PC do IA32 jge Dest 7 5 Dest Jump When Greater jg Dest 7 6 Dest 14
Pilha de Programa do Y86 Fim Região da memória que armazena dados do programa Utilizada no Y86 (e IA32) como suporte a chamada de procedimentos Aumenta endereços Topo %esp Topo da pilha indicado por %esp Endereço do topo da pilha Pilha cresce na direção de endereços menores Uma instrução de push decrementa a pilha inicialmente Uma instrução de pop incrementa o apontador da pilha 15
Operações de Pilha pushl ra a 0 ra 8 Decrementa %esp by 4 Armazena a palavra de ra na memória apontada por %esp Similar ao IA32 popl ra b 0 ra 8 Lê palavra apontada por %esp Salva em ra Incrementa %esp por 4 Similar ao IA32 16
Chamada e Retorno de Subrotina Call e Return call Dest 8 0 Dest Push endereço da próxima instrução na pilha Inicia execução a partir de Dest Similar ao IA32 ret 9 0 Pop endereço da pilha Utiliza como endereço da próxima instrução a ser executada Similar ao IA32 17
Outras Instruções nop 0 0 Não faz nada halt 1 0 Pára execução de instruções IA32 possui instrução similar, mas ela não pode ser executada em modo de usuário No simulador, ela é utilizada para parar a simulação 18
Conjunto de Instruções Byte 0 1 2 3 4 5 nop 0 0 halt 1 0 rrmovl ra, rb 2 0 ra rb irmovl V, rb 3 0 8 rb V rmmovl ra, D(rB) 4 0 ra rb D mrmovl D(rB), ra 5 0 ra rb D OP1 ra, rb 6 fn ra rb jxx Dest 7 fn Dest call Dest 8 0 Dest ret 9 0 pushl ra A 0 ra 8 popl ra 19 B 0 ra 8 jmp 7 0 jle 7 1 jl 7 2 je 7 3 jne 7 4 jge 7 5 jg 7 6
Instruções ALU (OP1) Add Código Operação Inc addl ra, rb 6 0 ra rb incl rb 6 4 8 rb Subtract (ra from rb) subl ra, rb 6 1 ra rb Dec decl rb 6 5 8 rb And andl ra, rb 6 2 ra rb Not notl rb 6 6 8 rb Exclusive Or xorl ra, rb 6 3 ra rb Or orl ra, rb 6 7 ra rb 20
Execução SEQ Estado Fluxo Program Counter (PC) Condition code register (CC) Banco de registradores Memória Espaço único para dados e programa Leia instrução especificada pelo PC Processe estágios Atualize PC PC Write back Memory Execute Decode icode, ifun ra, rb valc newpc vale, valm Addr, Data Bch CC alua, alub srca, srcb dsta, dstb valm Data memory valp vale ALU vala, valb A B Register M file E Fetch Instruction memory PC increment PC 21
Estágios Fetch Decode Execute Memory Lê instrução da memória Lê registradores e decodifica instrução Calcule valor ou endereço Lê ou escreve na memória Write Back/PC Atualiza registradores e PC PC Write back Memory Execute Decode icode, ifun ra, rb valc newpc vale, valm Addr, Data Bch CC alua, alub srca, srcb dsta, dstb valm Data memory valp vale ALU vala, valb A B Register M file E Fetch Instruction memory PC increment PC 22
Decodificação Opcional Opcional 5 0 ra rb D icode ifun ra rb valc Formato Byte de instrução Byte de registrador Byte de constante icode:ifun ra:rb valc 23
Executando Operação ALU OPl ra, rb 6 fn ra rb Fetch Decode Execute Lê dois bytes Lê operandos Executa operação Memory Não faz nada Write back/pc Atualiza registrador destino Atualiza PC por PC + 2 Atualiza CC 24
Cálculo nos Estágios OPl ra, rb Fetch Decode Execute Memory Write back icode:ifun M 1 [PC] ra:rb M 1 [PC+1] valp PC+2 vala R[rA] valb R[rB] vale valb OP vala Set CC R[rB] vale PC valp Lê byte de instrução Lê byte de registradores Calcula próximo PC Lê operando A Lê operando B Realiza operação de ALU Atualiza registrador de CC Escreve resultado Atualiza PC 25
Executando rmmovl rmmovl ra, D(rB) 4 0 ra rb D Fetch Decode Lê 6 bytes Lê registradores e decodifica instrução Memory Escreve na memória Write back Não faz nada Atualiza PC por PC + 6 Execute Calcula endereço efetivo 26
Cálculo nos Estágios: rmmovl rmmovl ra, D(rB) Fetch Decode Execute Memory Write back icode:ifun M 1 [PC] ra:rb M 1 [PC+1] valc M 4 [PC+2] valp PC+6 vala R[rA] valb R[rB] vale valb + valc M 4 [vale] vala PC valp Lê byte de instrução Lê byte de registradores Lê deslocamento D Cálcula próximo PC Lê operando A Lê operando B Calcula endereço efetivo Escreve valor na memória Atualiza PC Utiliza ALU para calcular endereço 27
Executando popl popl ra b 0 ra 8 Fetch Decode Execute Lê dois bytes Lê registrador esp Incrementa esp por 4 Memory Lê da posição de memória apontada pelo valor anterior de esp Write back Atualiza esp Escreve resultado em ra Atualiza PC por PC + 2 28
Cálculo nos Estágios: popl popl ra Fetch Decode Execute Memory Write back icode:ifun M 1 [PC] ra:rb M 1 [PC+1] valp PC+2 vala R[%esp] valb R [%esp] vale valb + 4 valm M 4 [vala] R[%esp] vale R[rA] valm PC vaip Lê byte de instrução Lê byte de registradores Calcula próximo PC Lê apontador de pilha Lê apontador de pilha Incrementa apontador de pilha Lê da posição anterior de esp Atualiza apontador de pilha Escreve resultado Utiliza ALU para incrementar esp Precisa atualizar dois registradores 29 ra esp
Executando Jumps jxx Dest 7 fn Dest fall thru: XX XX Not taken target: XX XX Taken Fetch Decode Execute Lê 5 bytes Incrementa PC por 5 Não lê nenhum registrador e decodifica instrução Determina se branch vai ser tomado ou não Memory Não faz nada Write back Não faz nada Atualiza PC para Dest se branch for tomado ou para PC + 5 se branch não for tomado 30
Cálculo nos Estágios: Jumps Fetch Decode jxx Dest icode:ifun M 1 [PC] valc M 4 [PC+1] valp PC+5 Lê byte de instruções Lê endereço de destino Endereço se branch não for tomado Execute Memory Write back Bch Cond(CC,ifun) PC Bch? valc : valp Branch é tomado? Atualiza PC Calcula os dois endereços Escolhe endereço baseado no CC 31
Executando call call Dest 8 0 Dest return: XX XX target: XX XX Fetch Decode Execute Lê 5 bytes Incrementa PC por 5 Lê apontador da pilha Decrementa apontador da pilha (esp) por 4 Memory Escreva novo PC para o topo da pilha Write back Atualiza apontador da pilha Seta PC para Dest 32
Cálculo nos Estágios: call call Dest Fetch Decode Execute Memory Write back icode:ifun M 1 [PC] valc M 4 [PC+1] valp PC+5 valb R[%esp] vale valb + 4 M 4 [vale] valp R[%esp] vale PC valc Lê byte de instruções Lê endereço destino Calcula ponto de retorno Lê apontador da pilha Decrementa apontador da pilha Escreve ponto de retorno na pilha Atualiza apontador da pilha Set PC to destination Usa ALU para decrementar o apontador de pilha Armazena na pilha PC atualizado 33
Executando ret ret 9 0 return: XX XX Fetch Decode Execute Lê 1 byte Lê apontador da pilha Incrementa apontador da pilha por 4 Memory Lê endereço de retorno do topo da pilha Write back Atualiza apontador da pilha Atualiza PC com o endereço de retorno 34
Cálculo nos Estágios: ret ret icode:ifun M 1 [PC] Lê byte de instruções Fetch Decode Execute Memory Write back vala R[%esp] valb R[%esp] vale valb + 4 valm M 4 [vala] R[%esp] vale PC valm Lê apontador da pilha Lê apontador da pilha Incrementa apontador da pilha Lê endereço de retorno do topo da pilha Atualiza apontador da pilha Atualiza PC com o endereço de retorno Utiliza ALU para incrementar topo da pilha Lê endereço de retorno do topo da pilha 35
Y86 SEQ : O que entregar? Cálculo dos estágios para todas os grupos de instruções Determinação do que será guardado ao fim de cada estágio guardado serão registradores internos 36
Esqueleto do Código module Y86(ADDR, DATA, RD, WR, RESET, CLK); input RESET,CLK; inout [31:0] DATA; output [31:0] ADDR; output RD,WR; reg [4:0] PIPE; always @(posedge CLK or posedge RESET) if (RESET) PIPE[4:0] <= 5 b10000; else PIP[4:0] <= {PIPE[0],PIPE[4:1]}; wire FETCH, DECODE, EXECUTE, MEMORY, WRITEBACK; assign {FETCH, DECODE, EXECUTE, MEMORY, WRITEBACK} = PIPE[4:0]; reg [31:0] PC, valpc; always @(posedge CLK or posedge RESET) if (RESET) PC[31:0] <= 32 h00000000; else if (WRITEBACK) PC[31:0] <= valpc[31:0]; else PC[31:0] <= PC[31:0]; endmodule 37
Assemblando Y86 unix> yas [ V] eg.ys Gera arquivo de código objeto eg.yo Resultado parece arquivo disassemblado V gera arquivo que pode ser carregado em Verilog 0x000: 308400010000 irmovl Stack,%esp # Set up stack 0x006: 2045 rrmovl %esp,%ebp # Set up frame 0x008: 308218000000 irmovl List,%edx 0x00e: a028 pushl %edx # Push argument 0x010: 8028000000 call len2 # Call Function 0x015: 10 halt # Halt 0x018:.align 4 0x018: List: # List of elements 0x018: b3130000.long 5043 0x01c: ed170000.long 6125 0x020: e31c0000.long 7395 0x024: 00000000.long 0 38
Outros Trabalhos Y86 pipe Y86 dual core com cache CUDA A ser determinado posteriormente 39