SIMULAÇÃO DA REDE HERMES
FERNANDO GEHM MORAES 28/março/2012
O objetivo do presente tutorial é compreender a sinalização da interface da rede, e dominar o
processo de integração de módulos de hardware à mesma.
A rede HERMES, e seu ambiente de síntese, denominado ATLAS, está disponível para download no link:
https://corfu.pucrs.br/redmine/projects/atlas/wiki.
O link https://corfu.pucrs.br/redmine/projects/atlas/wiki/Download detalha a forma de utilizar este ambiente, compreendendo síntese, geração de tráfego, simulação e avaliação de desempenho.
Configuração do ambiente de trabalho
1) Logar-me em qualquer máquina LINUX que monte o /soft64
2) Executar “source /soft64/source_gaph” para definir as variáveis de ambiente genéricas 3) Executar “module load atlas” para definir as variáveis de ambiente para a ferramenta ATLAS.
Atividade 1 – geração da rede para a simulação.
•
Executar a ferramenta atlas e criar um novo projeto, conforme Figura 1.Figura 1 - Interface gráfica principal da ferramenta ATLAS e criação de projeto.
•
Selecionar a opção “NoC Generation”, definindo-se os parâmetros da rede conforme a Figura 2: rede sem canais virtuais, controle de fluxo credit based, 3x3, flit de 16 bits, profundidade do buffer igual a 8.Figura 2 - Interface gráfica para geração da NoC.
• Clicar no botão “Generate”, criando-se a rede 3x3. O botão “generate” cria a estrutura de diretórios apresentada na Figura 3.
Figura 3 – Estrutura de diretórios gerada pela ferramenta Atlas, opção geração da NoC (MAIA).
Sinais de interface da rede HERMES
1. Como não iremos trabalhar com injeção de dados a partir de SystemC, remover do arquivo topNoC.vhd (no diretório <work>\<nome do projeto>) a entidade inputmodule (na prática apagar da linha 96 a 136).
2. A figura 4 mostra:
a. Índice dos roteadores;
b. Índice das portas: 1 Oeste, 0 Leste, 2 Norte, 3 Sul e 4 Local
c. Sinais entre a interface de rede e o roteador. Notar que a transmissão é síncrona. Quando há dados para transmitir, o sinal rx sobe, e dados são colocados em data_in. Se o roteador não está apto a receber dados, o sinal credit_o vai para zero.
ROUTER 02 ROUTER12 ROUTER22 ROUTER 01 ROUTER11 ROUTER21 ROUTER 00 ROUTER10 ROUTER20 Network interface data_in rx credit_o ad dr es s da ta ce cr ed it_ o
Figura 4 – Sinais de interface dos roteadores e índices das portas.
Atividade 2 – Escrita do processo responsável por injetar dados na rede
1. A simulação que iremos fazer inicialmente injetará dados no roteador 00, com destino para o roteador 22. Nesta condição, devemos desabilitar a transmissão de dados por parte de todos os outros roteadores, exceto para o roteador 00. Para isto, acrescente no final do arquivo topNoC.vhd para todos os roteadores, exceto o 00, as seguintes linhas:
clock_rx(endereço) <= '0'; rx(endereço) <= '0';
Onde endereço assume os valores N0100, N0200, N0001, N0101, N0201, N0002, N0102, N0202 (inserção de 16 linhas de VHDL).
Cada par clock_rx/rx em zero impede que dados entrem nos roteadores, pois não há atividade do clock de recepção do roteador, e o sinal rx nunca sinaliza que novos dados estão chegando.
2. Definição dos sinais necessários para a injeção de dados (inserir entre architecuture e begin):
signal address1, data1: std_logic_vector(15 downto 0); signal ce1: std_logic;
• Os sinais address1, data1 e ce1 correspondem a sinais com funcionalidade de uma interface padrão de
processador, ou seja, quando o ce estiver ativo, significa que há dado em data para o endereço address.
type packet is array (0 to 16) of std_logic_vector(15 downto 0);
• Esta linha define um pacote de 17 flits (0 a 16), sendo cada flit de largura de 16 bits.
constant pck1 : packet :=
( x"0022", x"000F", x"1001", x"2002", x"3003", x"4004", x"5005", x"6006", x"7007", x"8008", x"9009", x"A00A",
x"B00B", x"C00C", x"D00D", x"E00E", x"F00F" );
• Esta linha constrói o pacote o pacote que iremos transmitir. O primeiro flit corresponde ao endereço destino
do pacote (0022), tamanho do pacote (000F), e na seqüência os 15 flits do payload.
ROUTER 2 3 1 0
NI
Processor 4Port indexes:
There is another signal in the interface, named clock_rx which can be the same of the clock router
3. Escrita da interface de rede, a qual faz a ligação dos sinais de um IP (por exemplo, um processador) como
address1, data1 e ce1 aos sinais da NoC (credit_o, rx, data_in). Um exemplo de interface de rede, muito
simples, é dado abaixo:
clock_rx(N0000) <= clock(N0000); -- clock to inject data - the same of the router process(reset, clock(N0000))
begin
if reset='1' then rx(N0000) <= '0';
elsif clock(N0000)'event and clock(N0000)='1' then if ce1='1' and address1=x"FFFF" then
rx(N0000) <= '1';
data_in(N0000) <= data1;
elsif credit_o(N0000)='1' then -- important: flow control rx(N0000) <= '0';
end if; end if; end process;
O princípio de operação deste código VHDL é simples. Inicialmente atribui-se ao clock de recepção o mesmo clock do roteador. Depois, um processo síncrono é responsável por gerenciar a geração do sinal rx. Sempre que o processador ativar o CE e escrever algum dado no endereço 0xFFFF, este dado é repassado à NoC, ativando-se o sinal rx. Notar que se não há crédito, o sinal rx permanece com valor ‘0’.
Acrescente este código após as linhas que desabilitaram injeção de tráfego para os demais roteadores.
4. O passo seguinte corresponde a escrever o comportamento de um processador, o qual deve injetar o pacote definido no primeiro passo acima. Se fôssemos escrever um código C para a escrita de um pacote no ponteiro
data, teríamos: do
{ while( credit_o==0 ); // waits until the availability of credit store_word( data, address_noc);
}
A NoC, como já vimos no segundo passo, está mapeada no endereço 0xFFFF. Um exemplo de código VHDL que simula o comportamento desta rotina C é apresentado abaixo. Insira este código após a interface de rede.
address1 <= x"FFFF"; -- address generated by the processor process
variable i : integer:= 0; begin
ce1 <= '0';
wait for 400 ns; -- time between packets i := 0;
while i < 17 loop
if credit_o(N0000)='1' then -- important: flow control
data1 <= pck1(i); -- simulate a write( pck(i), address_noc) ce1 <= '1'; wait for 20 ns; ce1 <= '0'; wait for 20 ns; i := i + 1; else wait for 20 ns; end if; end loop; end process;
Atividade 3 - Simulação
1. Ir para o diretório de trabalho. Exemplo: cd {D:\noc_lab\noc1}
2. Modificar o arquivo simulate.do comentando a linha 6 (#sccom -g SC_NoC/SC_InputModule.cpp), suprimindo as linhas 28 a 30 – elas inicializam a simulação e depois fecham o ModelSim.
3. Execute o script: do simulate.do. Pode demorar um pouco, pois há algumas rotinas SystemC compilada. 4. Inserir os sinais de interface, ou insira os comando abaixo no arquivo wave.do e execute no ModelSim do
wave.do. Estaremos visualizando as interfaces sinalizadas com círculos vermelhos na figura.
add wave -divider {FONTE DOS DADOS} add wave -format Logic /topnoc/ce1
add wave -format Literal -radix hexadecimal /topnoc/data1 add wave -divider {roteador 00 PORTA LOCAL} add wave -format Logic /topnoc/noc/router0000/clock add wave -format Logic /topnoc/noc/router0000/rx(4) add wave -format Logic /topnoc/noc/router0000/credit_o(4)
add wave -format Literal -radix hexadecimal /topnoc/noc/router0000/data_in(4) add wave -divider {roteador 00 PORTA LESTE}
add wave -format Logic /topnoc/noc/router0000/tx(0) add wave -format Logic /topnoc/noc/router0000/credit_i(0)
add wave -format Literal -radix hexadecimal /topnoc/noc/router0000/data_out(0) add wave -divider {roteador 10 PORTA LESTE}
add wave -format Logic /topnoc/noc/router0100/tx(0) add wave -format Logic /topnoc/noc/router0100/credit_i(0)
add wave -format Literal -radix hexadecimal /topnoc/noc/router0100/data_out(0) add wave -divider {roteador 20 PORTA NORTE}
add wave -format Logic /topnoc/noc/router0200/tx(2) add wave -format Logic /topnoc/noc/router0200/credit_i(2)
add wave -format Literal -radix hexadecimal /topnoc/noc/router0200/data_out(2) add wave -divider {roteador 21 PORTA NORTE}
add wave -format Logic /topnoc/noc/router0201/tx(2) add wave -format Logic /topnoc/noc/router0201/credit_i(2)
add wave -format Literal -radix hexadecimal /topnoc/noc/router0201/data_out(2) add wave -divider {roteador 22 PORTA LOCAL}
add wave -format Logic /topnoc/noc/router0202/tx(4) add wave -format Logic /topnoc/noc/router0202/credit_i(4)
add wave -format Literal -radix hexadecimal /topnoc/noc/router0202/data_out(4)
5. Execute a simulação por 2 us: run 2 us. Deve-se obter a janela abaixo:
1
2
3
4
5
Figura 5– Simulação com transferência de um pacote do roteador 00 para o roteador 22.
ROUTER 02 ROUTER12 ROUTER22 ROUTER 01 ROUTER11 ROUTER21 ROUTER 00 2 ROUTER10 3 ROUTER20 4 5 1
Caminho determinado pelo algoritmo de roteamento XY 6
Notar na simulação:
• O pacote começa a ser inserido na porta local do roteador 00 no tempo 400 ns. O pacote é
arbitrado e roteado em 5 ciclos de clock, estando disponível no tempo 500ns na porta leste do
roteador 00 (intervalo 1 da figura 4) .
• Os intervalos 2/3/4/5 mostram o caminhamento do pacote ao longo do caminho.
• A latência total do pacote é de 25 ciclos de clock (5 ciclos por hop) mais o tamanho do pacote, 17
ciclos de clock. Assim, em nanosegundos, a latência total é de (25+17)*20 = 840 ns.
• Somando-se o tempo 400 ns com 840 ns, tem-se o tempo de recepção do último flit, que é 1240
ns.
Observar no diretório de trabalho que vários arquivos textos foram gerados. Dentre estes, temos o
out8.txt, que corresponde à recepção dos dados no roteador 8 (22 no nosso caso). Simulando 10 us
obtemos a recepção de 9 pacotes:
0022 000F 1001 2002 3003 4004 5005 6006 7007 8008 9009 A00A B00B C00C D00D E00E F00F 0000 0000 0000 003F 1074024453 -1609912309 63 -1074024 390 35
0022 000F 1001 2002 3003 4004 5005 6006 7007 8008 9009 A00A B00B C00C D00D E00E F00F 0000 0000 0000 0075 1074024453 -1609912309 117 -107402 4336 37
0022 000F 1001 2002 3003 4004 5005 6006 7007 8008 9009 A00A B00B C00C D00D E00E F00F 0000 0000 0000 00AB 1074024453 -1609912309 171 -107402 4282 39
0022 000F 1001 2002 3003 4004 5005 6006 7007 8008 9009 A00A B00B C00C D00D E00E F00F 0000 0000 0000 00E1 1074024453 -1609912309 225 -107402 4228 40 0022 000F 1001 2002 3003 4004 5005 6006 7007 8008 9009 A00A B00B C00C D00D E00E F00F 0000 0000 0000 0117 1074024453 -1609912309 279 -107402 4174 42 0022 000F 1001 2002 3003 4004 5005 6006 7007 8008 9009 A00A B00B C00C D00D E00E F00F 0000 0000 0000 014D 1074024453 -1609912309 333 -107402 4120 44 0022 000F 1001 2002 3003 4004 5005 6006 7007 8008 9009 A00A B00B C00C D00D E00E F00F 0000 0000 0000 0183 1074024453 -1609912309 387 -107402 4066 45 0022 000F 1001 2002 3003 4004 5005 6006 7007 8008 9009 A00A B00B C00C D00D E00E F00F 0000 0000 0000 01B9 1074024453 -1609912309 441 -107402 4012 47
0022 000F 1001 2002 3003 4004 5005 6006 7007 8008 9009 A00A B00B C00C D00D E00E F00F 0000 0000 0000 01EF 1074024453 -1609912309 495 -107402 3958 49
Os valores “estranhos” ao final do pacote deve-se ao fato que não utilizamos SystemC para geração de
dados. São campos para cálculo de latência.
Pode-se observar também os dados passando em cada porta dos roteadores nos arquivos texto.
Atividade 4 – Simulação com a Interface Gráfica
• Execute novamente a ferramenta ATLAS, abrindo o projeto original. Gere novamente a rede para
obter os arquivos originais. Se for pedido um navegador, selecione /usr/bin/firefox
•
Lembre
: fazer backup do topnoc.vhd!
• Gere o tráfego a uma taxa de 160 Mbps para o destino 22. O cálculo é simples: o canal tem largura
de 16 bits. Logo, a 50MHz a banda do canal é de 800 Mbps. 20% corresponde a 160 Mbps. Ao
gerar-se o tráfego é aberta uma tela de confirmação
• Simular por 10 us:
• Em “Performance Evaluation” selecionar Reports ! Global Evaluation
Notar que foram transmitidos 10 pacotes, com taxa média de 20%, com a vazão igual a taxa de
injeção, pois não houveram colisões de pacotes. A latência média foi de 41 ciclos.
Atividade 5 – Exercício
1. Observe que a inserção dos flits ocorre a cada dois ciclos de clock. Durante um ciclo de clock o ce
está ativo, para sinalizar dado, e no outro ciclo de clock está em zero. Note entretanto, que na
recepção dos dados (data_out) os mesmo começam a ficar agrupados, resultando no destino a
recepção de um flit por ciclo de clock. O que explicaria este comportamento?
2. Modifique a geração de tráfego para duas origens enviando para o mesmo destino, 00!12 e 20!12.
Apresente a forma de onda resultante, analisando os resultados obtidos.
• Utilizar os seguintes pacotes:
constant pck1 : packet := ( x"0012", x"000F", x"1001", x"2002", x"3003", x"4004", x"5005", x"6006", x"7007", x"8008", x"9009", x"A00A", x"B00B", x"C00C", x"D00D", x"E00E", x"F00F" ); constant pck2 : packet := ( x"0012", x"000F", x"FFFF", x"EEEE", x"DDDD", x"CCCC", x"BBBB", x"AAAA", x"9999", x"8888", x"7777", x"6666", x"5555", x"4444", x"3333", x"2222", x"1111" );• Sugestão para wave.do inicial:
add wave -divider {FONTE DOS DADOS 00} add wave -format Logic /topnoc/ce1add wave -format Literal -radix hexadecimal /topnoc/data1 add wave -divider {FONTE DOS DADOS 20}
add wave -format Logic /topnoc/ce2
add wave -format Literal -radix hexadecimal /topnoc/data2 add wave -divider {roteador 12 PORTA LOCAL}
add wave -format Logic /topnoc/noc/router0102/tx(4) add wave -format Logic /topnoc/noc/router0102/credit_i(4)
add wave -format Literal -radix hexadecimal /topnoc/noc/router0102/data_out(4)