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?
Alternativa de Circuito
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;
Circuito Resultante
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;
Original vs Modificado
Compartilhamento de Recursos
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?
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
Qual é melhor?
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;
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
Download

Desempenho - Facom-UFMS