620 likes | 783 Views
Construção de Modelos de Processadores Usando Uma Linguagem de Descrição de Arquiteturas. Sandro Rigo, Rodolfo Azevedo, Guido Araujo, Paulo Centoducatte Computer Systems Laboratory http://www.lsc.ic.unicamp.br IC-UNICAMP. Roteiro. Introdução O que é uma ADL Características de ArchC
E N D
Construção de Modelos de Processadores Usando Uma Linguagem de Descrição de Arquiteturas Sandro Rigo, Rodolfo Azevedo, Guido Araujo, Paulo Centoducatte Computer Systems Laboratoryhttp://www.lsc.ic.unicamp.br IC-UNICAMP
Roteiro • Introdução • O que é uma ADL • Características de ArchC • O Modelo SUB-MIPS em ArchC • Descrição do ISA • Descrição da Estrutura • Ferramentas de ArchC • Demonstração
Introdução • Projeto de Sistemas Dedicados • 90% dos processadores programáveis são dedicados • Requisitos/Restrições • Projeto em Nível de Sistema • Sistemas terão mais de 1 Bi. de transistores • Modelos Flexíveis de Simulação • Especialização de ISA • Geração de Ferramentas de Software • Hardware/Software Codesign
Linguagens de descrição de arquitetura • Modelagem da arquitetura em diversos níveis de abstração • Comportamental • Precisão de ciclos • Geração automática de ferramentas de produção de software • Verificação do modelo a cada nível de abstração • Exploração do espaço de projeto
SystemC • É uma Hardware Description Language (HDL) • Extensão de C++ • Modelagem em vários níveis de abstração • Open-source (www.systemc.org) • Não é ideal para redirecionamento automático de ferramentas
ArchC • Informação de ISA e estrutura • Gera simuladores em SystemC e C++ • Gera montadores baseado no GNU Binutils • Modela hierarquia de memória • Interface de depuração • Emulação de chamadas de SO • Integração com IPs SystemC
Descrição ArchC Descrição dos Recursos (AC_ARCH) . Registradores . Memória . Estrutura de Pipeline Descrição do ISA (AC_ISA) Descrição do formato, tipo e codificação/decodifição das instruções Descrição do comportamento das instruções (C++/SystemC) Elementos da linguagem ArchC
P C S r c M A d d u x A L U A d d 4 r e s u l t S h i f t l e f t 2 R e g i s t e r s A L U o p e r a t i o n 3 R e a d M e m W r i t e A L U S r c R e a d r e g i s t e r 1 P C R e a d a d d r e s s R e a d M e m t o R e g d a t a 1 Z e r o r e g i s t e r 2 I n s t r u c t i o n A L U A L U R e a d W r i t e R e a d A d d r e s s r e s u l t M d a t a r e g i s t e r d a t a 2 M u I n s t r u c t i o n u x W r i t e m e m o r y D a t a x d a t a m e m o r y W r i t e R e g W r i t e d a t a 3 2 1 6 S i g n M e m R e a d e x t e n d Modelagem Funcional Detalhes estruturais abstraídos → monociclo
Modelagem Funcional Recursos da Arquitetura (AC_ARCH) AC_ARCH(submips){ ac_mem MEM:64K; ac_regbank RB:32; ac_wordsize 32; ARCH_CTOR(submips) { ac_isa(“submips_isa.ac"); set_endian(“big”); }; };
Definição do ISA • Descrição dos formatos das instruções • ac_format • Declaração das instruções • ac_instr • Descrição da sintaxe assembly, codificação e decodificação • ac_asm_map • set_asm • set_decoder
Formatos de Instrução 31 26 25 21 20 16 15 11 10 6 5 0 op rs rt rd shamt funct R-Type (Register) 6 bits 5 bits 5 bits 5 bits 5 bits 6 bits ac_format Type_R = "%op:6 %rs:5 %rt:5 %rd:5 %shamt:5 %funct:6 "; 31 26 25 21 20 16 15 0 op rs rt immediate I-Type (Immediate) 6 bits 5 bits 5 bits 16 bits ac_format Type_I = "%op:6 %rs:5 %rt:5 %imm:16:s";
Declaração de Instruções AC_ISA(submips){ ac_format Type_R = "%op:6 %rs:5 %rt:5 %rd:5 0x00:5 %func:6"; ac_format Type_I = "%op:6 %rs:5 %rt:5 %imm:16"; ac_instr<Type_R>add, mul; ac_instr<Type_I>lw, bne, addi; ISA_CTOR(submips) { add.set_asm("add %reg, %reg, %reg“, rd,rs,rt); add.set_decoder(op=0x00, func=0x20); lw.set_asm("lw %reg, %imm(%reg)“,rt,imm,rs); lw.set_decoder(op=0x23); ... }; }; Declaração de instruções Seqüência de decodificação
Descrição do Comportamento Acesso a dispositivo de armazenamento Acesso a campo de instrução void ac_behavior( add ){ RB[rd] = RB[rs] + RB[rt]; }
Hierarquia de Comportamentos • Existem operações que são executadas por todas as instruções de um mesmo tipo, ou ainda por todas as instruções do ISA. • Exemplo típico: incremento do PC. • Objetivo: • Fatorar essas operações de maneira que sejam codificadas apenas uma vez, e executadas por todas as instruções das quais fariam parte.
Execução Hierarquia de Comportamentos Executado para todas as instruções Executado todas as instruções do tipo J Instrução (Genérico) Type_R Type_I Type_J j lw, sw, addi add, sub, mul
void ac_behavior( add ){ RB[rd] = RB[rs] + RB[rt]; } Descrevendo Comportamentos void ac_behavior( instruction ){ ac_pc = ac_pc + 4; }
Exemplo 1 SUB-MIPS executando o programa Fatorial
Programa Fatorial main: add $4,$0,4 # n = 4 add $2,$0,1 # f = 1 $L1: mul $2,$2,$4 # f = f * n add $4,$4,-1 # n = n - 1 bne $4,$0,$L1 # if (n != 0) goto $L1 add $0,$0,0
Especialização do ISA SUB-MIPS executando o programa produto interno
Especialização de ISA • Identificar pontos críticos na execução de uma aplicação • Verificar se a implementação em hardware de alguma tarefa pode acelerar a execução • Exemplo: Cálculo de produto e soma. • Conhecido como MAC • Muito presente em programas de processamento de sinais (DSP)
Programa Produto Interno # Atualiza apontadores para valores # (32 bits, 4bytes) add $4, $4, 4 # x++; add $5, $5, 4 # y++; # Subtrai contador de repeticao add $3, $3, -1 # N = N-1; # Se contador nao for 0, repete bne $3, $0, $L1 # Marcador de fim: quando chegar aqui acabou a repeticao add $0, $0, 0 # Dados usados no programa .data a: .word 2, 3, 4 b: .word 5, 6, 7 n: .word 3 main: # Inicializa apontadores para valores la $4, a # x = a la $5, b # y = b # Inicializa variaveis auxiliares add $6, $0, 0 # acc = 0; add $7, $0, 0 # mul = 0; add $8, $0, 0 # val1 = 0; add $9, $0, 0 # val2 = 0; # Carrega contador de repeticao lw $3, n # N = n; # Repete n vezes $L1: # Carrega os valores de cada vetor lw $8, ($4) # val1 = *x; lw $9, ($5) # val2 = *y; # Multiplica e acumula mul $7, $8, $9 # mul = val1 * val2; add $6, $6, $7 # acc = acc + mul;
Programa Produto Interno Modificado # Atualiza apontadores para # valores (32 bits, 4bytes) add $4, $4, 4 # x++; add $5, $5, 4 # y++; # Subtrai contador de repeticao add $3, $3, -1 # N = N-1; # Se contador nao for 0, repete bne $3, $0, $L1 # Marcador de fim: quando chegar aqui acabou a repeticao add $0, $0, 0 # Dados usados no programa .data a: .word 2, 3, 4 b: .word 5, 6, 7 n: .word 3 main: # Inicializa apontadores para valores la $4, a # x = a la $5, b # y = b # Inicializa variaveis auxiliares add $6, $0, 0 # acc = 0; add $7, $0, 0 # mul = 0; add $8, $0, 0 # val1 = 0; add $9, $0, 0 # val2 = 0; # Carrega contador de repeticao lw $3, n # N = n; # Repete n vezes $L1: # Carrega os valores de cada vetor lw $8, ($4) # val1 = *x; lw $9, ($5) # val2 = *y; # Multiplica e acumula mac $6, $8, $9 #acc = acc + val1*val2;
Declaração de Instruções AC_ISA(submips){ ac_format Type_R = "%op:6 %rs:5 %rt:5 %rd:5 0x00:5 %func:6"; ac_format Type_I = "%op:6 %rs:5 %rt:5 %imm:16"; ac_instr<Type_R>add, mul, mac; ac_instr<Type_I>lw, bne, addi; ISA_CTOR(submips) { add.set_asm("add %reg, %reg, %reg“, rd,rs,rt); add.set_decoder(op=0x00, func=0x20); mac.set_asm("mac %reg, %reg, %reg", rd, rs, rt); mac.set_decoder(op=0x00, func=0x30); ... }; }; Inclusão da instrução MAC Inclusão da instrução MAC
Descrevendo Comportamentos ... //!Instruction mul behavior method. void ac_behavior( mul ) { RB[rd] = RB[rs] * RB[rt]; }; //!Instruction mac behavior method. void ac_behavior( mac ) { RB[rd] += RB[rs] * RB[rt]; }; ... Inclusão da instrução MAC
Ajuste Simulação de Hierarquia de Memória Configuração da Hierarquia de Memória Aplicação Processador (SUB-MIPS) Arquitetura do Sistema Desempenho da Cache Memória
Declaração de Hierarquia de Memória AC_ARCH(submips){ ac_mem MEM:64K; ac_icache IC("dm", 32, 4, "wb", "wal"); ac_dcache DM("2w", 64, 2,"lru", "wt", "war"); ac_regbank RB:32; ac_wordsize 32; ARCH_CTOR(submips) { ac_isa(“submips_isa.ac"); set_endian(“big”); IC.bindsTo( MEM ); DM.bindsTo( MEM ); }; };
I D / E X . M e m R e a d H a z a r d d e t e c t i o n u n i t I D / E X e W B t i E X / M E M r W D M I / F C o n t r o l u M W B I M E M / W B x 0 E X M W B I F / I D e t i r W M n C o P u i t c x u r t s R e g i s t e r s n D a t a I I n s t r u c t i o n A L U P C m e m o r y M m e m o r y u x M u x I F / I D . R e g i s t e r R s I F / I D . R e g i s t e r R t R t I F / I D . R e g i s t e r R t M E X / M E M . R e g i s t e r R d u I F / I D . R e g i s t e r R d R d x I D / E X . R e g i s t e r R t R s F o r w a r d i n g M E M / W B . R e g i s t e r R d u n i t R t Modelagem com Precisão de Ciclos
Recursos da Arquitetura (AC_ARCH) AC_ARCH(submips){ ac_mem MEM:64K; ac_regbank RB:32; ac_pipe PIPE = {IF,ID,EX,MEM,WB}; ac_format Fmt_EX_MEM = "%alures:32 %wdata:32 %rdest:5 %regwrite:1 %memread:1 %memwrite:1"; ac_reg<Fmt_EX_MEM> EX_MEM; ... ac_wordsize 32; ARCH_CTOR(submips) { ac_isa(“submips_isa.ac"); set_endian("big"); }; };
Descrição do Comportamento void ac_behavior( insnX ) { switch( stage ) { case IF: break; case ID: break; case EX: break; case MEM: break; case WB: break; } As ações devem ser descritas para cada estágio do pipeline Esboço de todo comportamento para a estrutura de pipeline definida
Exemplo de Comportamento void ac_behavior( Type_R, int stage ){ switch(stage){ case IF: case ID: /* Checking forwarding for the rs register */ if ( (EX_MEM.regwrite == 1) && (EX_MEM.rdest != 0) && (EX_MEM.rdest == ID_EX.rs) ) operand1 = EX_MEM.alures.read(); else if( (MEM_WB.regwrite == 1) && (MEM_WB.rdest != 0) && (MEM_WB.rdest == ID_EX.rs) ) operand1 = MEM_WB.wbdata.read(); else operand1 = RB.read(rs); ... default: break; } }
Infra-estrutura de geração de ferramentas Descrição do Modelo (ArchC) Pré-processador (acpp) Representação Intermediária (Memória) Gerador Gerador Gerador Gerador Backend de Montador Simulador de Linkeditor Compilador (acasm) (acsim, accsim) Ferramentas Geradoras
Simulação Interpretada • Busca, Decodificação e execução dinâmicas • Flexível • Simuladores gerados são escritos em SystemC
Simulação Compilada • Melhorias • Decodificação estática • Cálculos estáticos especializados a uma aplicação • Desempenho melhora em duas ordens de magnitude • Redirecionamento • Architecture Description Languages (ADL) • Otimizações usando mais informações sobre a arquitetura
Experimentos (Compiled-simulator) MIPS MIPS
Geração de Montadores (acasm) • Utiliza a estrutura de redirecionamento do pacote GNU/Binutils • Os arquivos gerados são mesclados na árvore de diretórios original Binutils • Características • Arquivo objeto ELF relocável • Possui todas as características do núcleo do montador gas: diretivas de montagem, rótulos, geração de listagens, ... • Código gerado pode ser utilizado pelos simuladores ArchC
Geração de Montadores (acasm) Representação Intermediária ArchC Arquivos GNU Binutils Gerador de Montador (independentes de máquina) (acasm) Arquivos GNU Binutils Processo de (dependentes de máquina) compilação Montador Executável
Interface Gnu GDB • O GDB permite um controle da execução (breakpoints) e do valor de variáveis (leitura e escrita) • A comunicação entre o simulador e o GDB é feita por meio de um socket • É preciso implementar serviços de leitura e escrita de registradores e de memória no simulador
Interface Gnu GDB ac_word submips::reg_read( int reg ) { /* general purpose registers */ if ( ( reg >= 0 ) && ( reg < 32 ) ) return RB.read( reg ); /* pc */ else if ( reg == 37 ) return ac_pc; return 0; } ...
System Call Library Simulador S.O. da máquina host Aplicação Ferramentas em ArchC • Emulação de Sistema Operacional • Chamada de sitema: open, close, fstat, etc; • Linux + Newlib