Você está na página 1de 9

Codificação RTL

João Leonardo Fragoso

RTL

 RTL  Register Transfer Level


– Formalismo utilizado nas linguagens de hardware
– Define sub-conjuntos da linguagens que « podem »
João Leonardo Fragoso

ser sintetizados

1
O que mais codificador deve saber?

 Regras de escrita – coding guidelines


– Convenções
– Comentários
João Leonardo Fragoso

– Coding for Verification


– Coding for Test
– Coding for Synthesis
 Facilitar reusabilidade e manutenção
 Definir interfaces – mas sem ferir guidelines

Convenções

 E importante estabelecer convenções adotadas


por todos os projetistas
– Nomenclatura de arquivos
João Leonardo Fragoso

– Nomes para portas de IO


– Etc.
 Facilita a « legibilidade » e o entendimento

2
Exemplos de convenções (1)

 Usar identificadores com nomes que


demonstrem o significado
 Usar letras grandes e pequenas para os
João Leonardo Fragoso

identificadores e palavras reservadas em


minúsculas
 Usar _n para sinais ativos em 0
 Usar o nome do sinal com um prefixo indicando
o bloco

Exemplos de convenções (2)


João Leonardo Fragoso

Bloco1 Bloco2
Ack
Ack_o Ack_i

3
Exemplos de convenções (3)

 Escrever constantes todas em maiúsculas


 O nome da entidade deve indicar o que ela faz
 Arquivos de configuração com cfg
João Leonardo Fragoso

 Arquivos de package com pkg


– Ex: Bloco1_cfg.vhd e Bloco1_pkg.vhd
 Arquivos de Testbench com TB
 Etc...

E mais convenções

 Se possível padronize o editor a ser utilizado;


 Escolha um editor com highlight de síntaxe
– emacs, xemacs e até vim são boas opções ;)
João Leonardo Fragoso

 Padronize até os headers dos arquivos VHDL

4
Comentários

 Exija comentários
– Por entitidade
– Por porta de IO
João Leonardo Fragoso

– Por sinal
– Por processo
 Estabeleça métricas sobre os comentários – se
possível utilize um gerador automático de
documentação
 Faça peer-review dos códigos

Inicialização

 Inicialização de sinais não são sintetizadas


 Devem ser PROIBIDAS para o código RTL
Mas visando o teste todos os registradores
João Leonardo Fragoso


(não são todos os sinais) devem ser
inicializados para um valor conhecido com um
« reset »

10

5
A lista de sensibilidade é sensível

 Esta lista (em um processo) define os triggers


para disparar a execução do processo
– Para qualquer mudança de um sinal na lista, e
João Leonardo Fragoso

atendendo a condição de disparo, o processo é


executado
 Em VHDL ou se usa um lista na definição do
processo ou se usa wait – não se permite os
dois juntos
 Todas as entradas – em um processo
combinatório – devem estar definidas na lista
de sensibilidade
11
– Considerem usar System Verilog… ☺

Processos sequênciais

 Só o relógio e o reset assíncrono na lista de


sensibilidade
João Leonardo Fragoso

data_register : process ( rst_n, clk )


begin
if ( rst_n = ‘0’) then
data_out <= (others => ‘0’);
elsif (clk’event and clk = ‘1’) then
data_out <= data_in;
end if;
end process data_register;

12

6
João Leonardo Fragoso
Processos combinatórios

13

Múltiplos relógios

 Atenção a múltiplos domínios de relógio, eles


precisam ser sincronizados
 Evite usar múltiplos relógios na mesa entidade
João Leonardo Fragoso

– Ajuda síntese e reusabilidade


 Não escreva processos sensíveis as duas
bordas de um mesmo relógio

14

7
Resets

 Síncrono vs assíncrono
 Resets síncronos garantem que o circuito é
100% síncrono
João Leonardo Fragoso

 Resets assincronos podem ser perigosos se


não utilizados de forma correta

15

Reset Síncrono

counter_process : process ( clk )


begin
if (clk = ‘1’) then
if ( rst_n = ‘0’) then
João Leonardo Fragoso

count_s <= (others => ‘0’);


elsif (load_i = ‘1’) then
count_s <= load_value_i;
else
count_s <= count_s + 1;
end if;
end if;
end process counter_process;

16

8
Reset Assíncrono

counter_process : process ( rst_n, clk )


begin
if ( rst_n = ‘0’) then
João Leonardo Fragoso

count_s <= (others => ‘0’);


elsif (clk’event and clk = ‘1’) then
elsif (load_i = ‘1’) then
count_s <= load_value_i;
else
count_s <= count_s + 1;
end if;
end if;
end process counter_process;

17

Reuso

 Generics
 Constantes para reset e loops
 Registrar saídas dos blocos
João Leonardo Fragoso

18

Você também pode gostar