200 likes | 381 Views
Desempenho. MO801/MC912. Caminho Crítico. Como ficaria o circuito? Foque no sinal Critical if ((( Critical='0' and Obi='1' and Sar='1') or CpuG='0') and CpuR='0') then Des <= Adr; elsif (((Critical='0' and Obi='1' and Sar='1') or CpuG='0') and CpuR='1') then
E N D
Desempenho MO801/MC912
Caminho Crítico • Como ficaria o circuito? Foque no sinal Critical if ((( Critical='0' and Obi='1' and Sar='1') or CpuG='0') and CpuR='0') then Des <= Adr; elsif (((Critical='0' and Obi='1' and Sar='1') or CpuG='0') and CpuR='1') then Des <= Bdr; elsif (Sar='0' and ..........
Caminho Crítico • Quantos níveis lógicos?
if ((( Critical='0' and Obi='1' and Sar='1') or CpuG='0') and CpuR='0') then Des <= Adr; elsif (((Critical='0' and Obi='1' and Sar='1') or CpuG='0') and CpuR='1') then Des <= Bdr; elsif (Sar='0' and .......... if (Critical='0') then if (((Obi='1' and Sar='1') or CpuG='0') and CpuR='0') then Des <= Adr; elsif (((Obi='1' and Sar='1') or CpuG='0' and CpuR='1') then Des <= Bdr; end if; end if; Alternativa de Circuito
Outro Exemplo if (clk'event and clk ='1') then if (non_critical and critical) then out1 <= in1 else out1 <= in2 end if; end if;
Modelo Alternativo signal out_temp : std_logic if (non_critical) out_temp <= in1; else out_temp <= in2; if (clk'event and clk ='1') then if (critical) then out1 <= out_temp; else out1 <= in2; end if; end if; end if;
if (...(siz = 1)...) count <= count + 1; else if (...((siz =2)...) count <= count + 2; else if (...(siz = 3)...) count <= count + 3; else if (...(siz = 0)...) count <= count + 4; Quantos somadores serão gerados pela descrição ao lado? Compartilhamento de Recursos
Alternativa de Código • E com o código abaixo? if (...(siz = 0)...) then count <= count + 4; else if (...) then count <= count + siz;
Quantos somadores? if (select) then sum <= A + B; else sum <= C + D;
E agora? if (sel) then temp1 <= A; temp2 <= B; else temp1 <= C; temp2 <= D; end if; sum <= temp1 + temp2;
Operadores dentro de laços • Quantos somadores? vsum := sum; for i in 0 to 3 loop if (req(i)='1') then vsum <= vsum + offset(i); end if; end loop;
Quantos somadores? • Qual a solução?
E agora? vsum := sum; for i in 0 to 3 loop if (req(i)='1') then offset_1 <= offset(i); end if; end loop; vsum <= vsum + offset_1;
Qual é melhor? • Pense nas células das FPGAs
one :process (clk, a, b, c, en) begin if (clk'event and clk ='1') then if (en = '1') then q2 <= a and b and c; end if; q1 <= a and b and c; end if; end process one; part_one: process (clk, a, b, c, en) begin if (clk'event and clk ='1') then if (en = '1') then q2 <= a and b and c; end if; end if; end process part_one; part_two: process (clk, a, b, c) begin if (clk'event and clk ='1') then q1 <= a and b and c; end if; end process part_two; Qual é melhor?
Duplicação de Componentes • Serve para diminuir o fanout • As ferramentas costumam fazer automaticamente • Para fazer manualmente, em geral, é necessário duplicar o processo onde está o sinal
Tamanho de Projetos • Cada ferramenta possui um tamanho típico de projeto • Projetos gastam recursos como memória do processador, processamento • Os algoritmos nem sempre são lineares • Quebre os arquivos em pedaços menores para ficar na faixa típica • Qual é a faixa típica????
Posicionamento dos Registradores • É melhor ter os registradores nos extremos, preferencialmente nas saídas