Multiplicador Booth para o FemtoJava Vagner Santos da Rosa
Tópicos Algoritmo de Booth Modificado Hardware do Booth Modificado Requisitos para o FemtoJava Projeto desenvolvido Conclusões
Algoritmo de Booth Modificado Algoritmo de booth original projetado para multiplicações de inteiros em complemento de 2 Booth modificado: Capaz de operar 2 ou mais bits do multiplicador por vez Ótimo compromisso entre desempenho e complexidade do hardware
Algoritmo de Booth Modificado Funcionamento (base 4) Multiplicador é dividido em grupos de 3 bits O MSB de um grupo é compartilhado com o LSB de outro A partir de uma tabela de recodificação, podemos ter: Soma/Subtrai MD Soma/Subtrai 2*MD Não faz operação aritmética Operações sem sinal podem ser obtidas através do acréscimo de um codificador adicional no MSB do multiplicador
Algoritmo de Booth Modificado Exemplo 1 Multiplicador = 1010 (1010 sem sinal) Grupo Operação 000 - 001 +MD 010 011 +2MD 100 -2MD 101 -MD 110 111 1: 1 * -2MD 2: 4 * -MD 3: 16 * MD ------------ P = 10 * MD 0010100 1: -2MD 2: -MD 3: +MD
Algoritmo de Booth Modificado Exemplo 2 Multiplicador = 1010 (-610 com sinal) Grupo Operação 000 - 001 +MD 010 011 +2MD 100 -2MD 101 -MD 110 111 1: 1 * -2MD 2: 4 * -MD ------------ P = -6 * MD 10100 1: -2MD 2: -MD
Hardware do Booth Modificado Visão top-level Multiplicador (MD) Multiplicando (MR) MD{-1,0,1} P{0,1} Operando1 MD{1,2,3} P{2,3} Operando2 P{14,15} MD{13,14,15} Operando8 P[31..16] Produto (32 bits)
Hardware do Booth Modificado Operandos Produto Parcial Do Estágio Anterior MR{2n-1, 2n, 2n+1} Codificador Booth Multiplexador (Inverte/desloca/zera MR) 3 16 MD Somador MR Produto Parcial Para o Próximo Estágio P{2n, 2n+1}
Hardware do Booth Modificado Codificador Booth MRn-1 PassaMDn MRn MRn+1 DeslocaMDn InverteMDn
Hardware do Booth Modificado Multiplexer InverteMDn PassaMDn Para Mux a Esq. Do Mux a Dir. DeslocaMDn
Hardware do Booth Modificado Somador A16 B16 A2 B2 A1 B1 A0 B0 Var (inv) Cout S16 S2 S1 S0 Somador Ripple Carry
Requisitos para o FemtoJava Multiplicação com e sem sinal Possível através de pequenas adaptações na lógica do multiplicador e colocação de um sinal de controle Multiplicação de 8 ou 16 bits Versão de 16 bits: implementada Versao de 8 bits (com multiplicador de 16 bits): possível através da extensão do sinal do multiplicando e do multiplicador
Projeto desenvolvido Implementação em VHDL de um multiplicador booth para números com e sem sinal Operandos de 17 bits Lógica de tratamento de sinal Extender os operandos para 17 bits (com ou sem sinal) para o multiplicador poder tratar indistintamente números com e sem sinal Teste de funcionamento
Projeto desenvolvido Para números com sinal (complemento de 2) Faz a extensão de sinal dos operandos durante a conversão de 16 para 17 bits Ignora os 2 bits mais significativos do produto Para números sem sinal Zera o bit mais significativo dos operandos
Projeto desenvolvido Recodificação do multiplicando: two_b <= b(15 downto 0) & '0'; -- 2*MD b_bar <= not b; -- -MD two_b_bar <= b_bar(15 downto 0) & '1'; -- -2*MD bb <= b when a="001" or a="010" else two_b when a="011" else two_b_bar when a="100" else b_bar when a="101" or a="110" else x"0000" & '0';
Projeto desenvolvido Somas parciais soma: for i in 0 to 16 generate -- 17 somadores su: entity WORK.fadd port map( sum_in(i), -- Produto parcial anterior bb(i), -- Multiplicando recodificado ctemp(i), -- carry (FA anterior) psum(i), -- Produto parcial atual ctemp(i+1)); -- carry (proximo FA) end generate;
Projeto desenvolvido Geração do produto a0: entity WORK.badd port map(mul0, be, zer, s(0), p( 1 downto 0)); a1: entity WORK.badd port map(a(3 downto 1), be, s(0), s(1), p( 3 downto 2)); (...) a8: entity WORK.badd port map(“00” & msb_mr, be,s(7),s(8), p(17 downto 16)); p(31 downto 18) <= s(8)(13 downto 0);
Projeto desenvolvido Seleção de operação com ou sem sinal topbit <= b(15) when sign = '1' else '0'; -- calcula extensao do multiplicando msb_mr <= a(15) when sign = '0' else '0'; -- calcula extensao do multiplicador be <= topbit & b ; -- multiplicando de 17 bits
Projeto desenvolvido Simulações Verificação de funcionamento Vetores de teste que examinam possíveis falhas na implementação Não exaustivo Medição do atraso Atraso analítico caminho mais longo no datapath Pode ser um falso caminho Atraso máximo experimental: Atraso mais realista Pode não ser o maior atraso absoluto
Projeto desenvolvido Simulações Multiplicação com sinal Multiplicando (b) positivo Multiplicador (a) positivo e negativo
Projeto desenvolvido Simulações Multiplicação com sinal Multiplicando (b) negativo Multiplicador (a) positivo e negativo
Multiplicação com sinal Projeto desenvolvido Simulações Multiplicação com sinal Teste dos limites
Multiplicação com sinal Projeto desenvolvido Simulações Multiplicação com sinal Teste dos limites
Multiplicação sem sinal Projeto desenvolvido Simulações Multiplicação sem sinal
Multiplicação sem sinal Projeto desenvolvido Simulações Multiplicação sem sinal
Multiplicação sem sinal Projeto desenvolvido Simulações Multiplicação sem sinal Teste dos limites
Multiplicação sem sinal Projeto desenvolvido Simulações Multiplicação sem sinal Teste dos limites
Projeto desenvolvido Maior atraso Calculado pelo Quartus II: 68ns Medido: ~50ns Não foram testadas todas as combinações de multiplicando e multiplicador
Projeto desenvolvido Inserção no FemtoJava Substituição arquivo mul.vhd Criação de uma instrução de multiplicação com sinal Criação de lógica de controle de sinal
Conclusões Arquitetura relativamente regular, mas com características que tiveram que ser observadas para a obtenção do resultado correto Para suportar operações de 16 bits com e sem sinal, um multiplicador de 17 bits teve que ser implementado Pipelines podem ser facilmente inseridos, se necessário