Medição de tempos de propagação em circuitos combinacionais

De MediaWiki do Campus São José
Ir para: navegação, pesquisa

Circuito exemplo: Calculo da distância de Hamming

O circuito abaixo realiza o cálculo da distância de Hamming entre dois sinais. O hardware está descrito em VHDL de forma genérica para permitir o estudo dos diferentes tempo de propagação e área do chip ocupado pelo circuito conforme as restrições de tempo impostas. Os valores de N e M definem respectivamente o tamanho dos vetor de entrada a e b e do vetor de saída y. A distância de Hamming é fornecida através de um número binário sem sinal. Note que M = ceil(log2(N)), ou seja para N = 8 bits => M = 4 bits, pois o número 8 é representado como "1000".

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity hamming_distance is
	generic (
		N: 	natural := 25; 
		M: 	natural := 5); -- M = ceil(log2(N))
	port(
		a, b :	in  std_logic_vector (N-1 downto 0);
		y :	out std_logic_vector (M-1 downto 0));
end entity;

architecture ifsc_arch_gen of hamming_distance is
	signal diff: unsigned (N-1 downto 0);
	signal sum: unsigned (M-1 downto 0);
begin
	diff <= unsigned(a xor b);
	process (diff)
		variable tmp : integer range 0 to N;
	begin	
		tmp := 0;
		for i in diff'range loop
			tmp := tmp + to_integer(unsigned'('0' & diff(i)));
		end loop;
		sum <= to_unsigned(tmp,M);
	end process;
	y <= std_logic_vector(sum);
end architecture;

Na sequência abaixo, foi utilizado o Quartus II 32-bit Version 13.0.1 Build 232, compilando o circuito para o dispositivo FPGA da ALTERA EP1C3T100A8 da familia Cyclone. A escolha dessa família e versão do Quartus se deve ao fato de as novas versões 14.0 em diante não serem mais compatíveis com a família Cyclone básica. Em função de termos uma menor quantidade de célula, os resultados mostrados abaixo são melhor visualizados neste dispositivo do que em dispositivos maiores. Note que eventualmente ao utilizar vetores de entrada maiores, o compilador pode acusar falta de pinos para mapear todas as portas do circuito. Neste caso utilize dispositivos com maior número de de pinos.

Para realizar a verificações abaixo descritas, inicialmente crie um projeto com o código VHDL do circuito hamming_distance e realize a compilação (Processing > Start Compilation).

Área ocupada no FPGA pelo circuito

Verifique o número de Elementos lógicos utilizados pelo circuito. No caso mostrado abaixo estão sendo utilizados 68 elementos lógicos entre os 2910 disponíveis. Também são utilizados 55 dos 65 pinos de I/O disponíveis.

LogicalElements HammingDistance.png

Observe a disposição desses elementos no Chip Planner (Tools > Chip Planner). Note que como nenhuma restrição de tempo foi inserida, os elementos lógicos utilizados estão espalhado no dispositivo. Note que a intensidade da cor azul indica a taxa de ocupação.

ChipPlanner HammingDistance.png

Tempo de Propagação entre entrada e saída

Para determinar os tempos de propagação entre cada bit de entrada e os bits de saída analise o "Compilation Report" (Processing > Compilation Report > TimeQuest Timing Analyzer >Datasheet Report > Propagation Delay).

Para encontrar o caminho crítico ("Critical Path") do circuito ordene os tempos de propagação do maior para menor. No exemplo da figura abaixo o caminho crítico é entre a entrada a[24] e saída y[2], com tempo de propagação de 23,772 ns.

Tempos de Propagação


Visualização dos tempos de propagação no Chip Planner

Uma das formas de visualizar os tempos de propagação no Chip Planner é utilizando a ferramenta TimeQuest Timing Analyser (Tools > TimeQuest Timing Analyser). Inicialmente faça a atualização da Netlist (com duplo clique em Update Timing Netlist). Em seguida, na janela Tasks, selecione o Report Path (Reports > Custom Reports > Report Path...), e defina as portas de entrada (Targets > From: {a* b*}), as portas de saída (Targets > To: y*), e o número de caminhos a serem relatados (Report number of path: 20). e clique em [Report Path].

Se no lugar da interface gráfica quiser usar um comando tcl, digite o comando abaixo no Console:

report_path -from {a* b*} -to y* -npaths 20 -panel_name {Report Path}

ReportPathConfig HammingDistance.png

Na tela do Report Path, selecione os tempos que deseja visualizar (use o botão esquerdo do mouse junto com as teclas [Ctrl] e/ou [Shift]), e em seguida use o botão direito do mouse e selecione (Locate Path... > Locate in [x] Chip Planner). Na Janela Locate History, selecione um dos caminhos, e expanda os caminhos parciais [+] e selecione (View > Show Details) para visualizar os tempos de propagação parcial no Chip Planner. No caso mostrado o tempo total de propagação entre a porta a[24] e y[2] é de 23,772 ns. Note que os maiores tempos de propagação parcial ocorrem entre os pinos do PFGA e o primeiro elemento lógico, tanto na entrada (1,475 + 6,445 ns) como na saída (3,550 + 2,124 ns).

ReportPath HammingDistance.png

ATENÇÃO!! Eventualmente se forem selecionados muitos tempos de propagação, pode ocorrer o seguinte erro interno no Quartus II e finalizar o programa:

Internal Error: Sub-system: ACVQM, File: /quartus/ace/acvq/acvqm/acvqm_command_manager.cpp, Line: 1726 !assert_on_not_valid_and_adb

Se precisar verificar muitos tempos, utilize o QUARTUS II 14.0.0, o qual no entanto não tem suporte para as versões mais antigas e menores de FPGAs como o Cyclone, Cyclone II e Cyclone III.

Configurando o compilador

O compilador do Quartus II possui diversas configurações que podem ser controladas pelo usuário para melhorar o desempenho, reduzir a área, reduzir a potência.

Em [Assignments > Setting] selecione a [Category: Analysis and Synthesis Settings].

QII-AnalysisSynthesisSettings.png

Em Optimization Technique:

  • selecione [x] Speed para "procurar" reduzir o tempo de propagação e/ou aumentar a frequência máxima do sistema.
  • selecione [x] Area para "procurar" reduzir o número de elementos lógicos utilizados no sistema.
  • por default está selecionado [x] Balanced.

Outras opções estão disponíveis em [More Settings]

Em [Assignments > Setting] selecione a [Category: Fitter Settings].

QII-FitterSettings.png

Em Fitter effort

  • selecione [x] Auto Fit reduzir o esforço após atingir os requisitos de tempo.
  • selecione [x] Standard Fit para informar ao compilador para continuar buscando tempo melhores mesmo que os requisitos de tempo já estejam atingidos.
  • selecione [x] Fast Fit obter um resultado mais rápido.

Em [Seed:] use outras sementes inicias (valores inteiros positivos {1 4 8 89 ...) para determinar um ponto inicial diferente para o projeto. Mudar esse valor pode produzir um circuito melhor ou não. Normalmente esse recurso permite obter pequenas variações.

A ferramenta DSE - Design Space Explorer permite variar as configurações das sementes e também técnicas de otimização, de forma semi-automática.

Inserindo restrições de atraso máximo para o compilador

Para restringir o tempo de propagação entre entrada(s) e saída(s), é necessário acrescentar ao projeto um arquivo .sdc (Synopsys Design Constraints File). No exemplo abaixo é inserida um restrição de máximo atraso (set_max_delay) entre todas as portas de entradas para todas as portas de saída de 15 ns. Para inserir esta restrição crie um arquivo sdc1.sdc com o seguinte conteúdo:

set_max_delay -from [get_ports *] -to [get_ports *]  20

Recompile o projeto e refaça as analises indicadas acima. Note que a alocação dos elementos lógicos no PFGA irá mudar para atender a esta restrição de tempo.

Restrições de tempo não atendidas

Experimente com outras restrições de tempo, e verifique se o compilador consegue um circuito que atenda as restrições. No exemplo, usando um restrição de 15,9 ns, o compilador não conseguiu obter exito.

set_max_delay -from [get_ports *] -to [get_ports *]  15.9

Inicialmente note que ocorre uma mensagem de Critical Warning na janela Messages

Critical Warning (332148): Timing requirements not met

Ao analisar o Timing Report note que alguns valores estão em vermelho, indicando um Slack negativo. No exemplo abaixo a propagação entre as portas b[21] -> y[3]; a[15] -> y[4]; b[21] -> y[4]; a[21] -> y[4] é maior que 15,9 ns.

TimingReportFail HammingDistance.png

Uma análise adicional pode ser feita utilizando a ferramenta TimeQuest Timing Analyser (Tools > TimeQuest Timing Analyser). Na janela Tasks, selecione o Report Timing (Reports > Custom Reports > Report Timing...), e defina as portas de entrada (Targets > From: {a* b*}), as portas de saída (Targets > To: y*), e o número de caminhos a serem relatados (Report number of path: 100). e clique em [Report Timing].

Se no lugar da interface gráfica quiser usar um comando tcl, digite o comando abaixo no Console:

report_timing -from {a* b*} -to y* -setup -npaths 100 -detail full_path -panel_name {Report Timing}

ReportTimingFail HammingDistance.png

Note que a aba Waveform mostra graficamente o significado dos valores dos tempos de propagação no FPGA do nó b[21] ao nó y[4].

  • Max Delay Exception: Valor especificado no arquivo .sdc
  • Data Arrival: O tempo de propagação
  • Slack: Valor negativo mostrando que a restrição não foi atendida

Detalhamento dos tempos de propagação no Chip

A figura abaixo mostra alguns tempos de propagação do circuito "hamming_distance" com N = 8 e M = 4, e max_delay = 9 ns. Os valores selecionados na imagem maior correspondem aos tempos de propagação nos pinos de I/O e tempo de chegada ao primeiro LE e saída do ultimo LE. Os valores não selecionados são os correspondentes aos tempos de propagação do primeiro elemento lógico até o último elemento lógico, e correspondem em parte a propagação nas trilhas e em parte a propagação dentro dos elementos lógicos.

PropagationTime 1.png

Na sequencia são mostradas várias figuras que detalham os valores e as áreas correspondentes no chip.

Neste exemplo o tempo de propagação dentro do pino de entrada é de 1,135 ns.

PropagationTime in.png

Neste exemplo o tempo de propagação do pino de entrada até o primeiro elemento lógico é de 1,217 ns.

PropagationTime in LE.png

Neste exemplo o tempo de propagação do primeiro elemento lógico até o último elemento lógico é de 2,624 ns.

PropagationTime fLE uLE.png

Neste exemplo o tempo de propagação do último elemento lógico até o pino de saída é de 1,199 ns.

PropagationTime LE out.png

Neste exemplo o tempo de propagação dentro do pino de saída é de 1,622 ns.

PropagationTime out.png

Referencias externas