PROCESSADORES PROGRAMÁVEIS - como projetar um processador em VERILOG - Codificação - parte 3

processador em VERILOG processadores em verilog Processadores programáveis
Este post faz parte da série Processadores programáveis. Leia também os outros posts da série:

Prezado leitor, depois de um longo tempo, daremos continuidade à série. Neste sentido, o presente artigo tem o intuito de construir um conhecimento inicial sobre Linguagem de Descrição de Hardware, ou HDLs (Hardware Description Languages), utilizando como ferramenta de aprendizagem o processador descrito no artigo anterior.

 

Antes de avançarmos diretamente sobre a linguagem, faz-se necessário refletir sobre qual foi o intuito da criação de mais uma linguagem de programação. Primeiramente vamos contextualizar o leitor com um exemplo de projeto, para depois justificar a criação do HDL. Segundo [1] quando projetamos/desenhamos no papel (sim amigo leitor, ainda se usa muito papel na indústria para começar um projeto) um circuito como o da Figura 1 conseguimos observar as portas lógicas OR, AND, NOT sendo interligadas através das respectivas entradas e saídas por fios, tudo isso formando um grande esquemático do projeto.

 

 

PORTA
Figura 1: Circuito abridor de porta automático (ver [1] página 68)

 

Fantástico! Antes mesmo de entendermos de HDL criamos nosso primeiro projeto que vai revolucionar a abertura automática de portas (fica a dica - bons projetos devem ser simples como os da figura 1 - o segredo é encontrar o mercado consumidor certo). Contudo, e se o nosso projeto for um pouco maior ou mais complexo? Digamos agora que, na melhor das hipóteses, nosso projeto possua algumas centenas de componentes lógicos.

(i) Como seria possível desenhá-lo em um papel ou mesmo corrigí-lo caso futuramente encontrarmos um erro?

(ii) E para simularmos ?

(iii) E como seria possível decrevê-los em uma linguagem mais abstrata?

(iv) E se o cliente mudar algum requisito?

São muitas as perguntas que poderíamos fazer.

 

Assim, agora justificando a criação das linguagens HDLs - segundo [1] nas décadas de 70 e 80 algumas linguagens foram desenvolvidas no intuito de transformar a sintaxe de programação em elementos construtivos de hardware, ou seja, estamos falando agora de linguagens que descrevem portas lógicas, portas de IOs, etc, sendo que cada elemento de hardware possui suas características físicas (impedância, capacitância, etc) e comportamentais (ativo na borda de subida,etc), o que permitiu tanto as interconexões estrutural entre esses elementos lógicos quanto a descrição do comportamento de cada elemento ou de um sistema como um todo.

 

Tais linguagens são por exemplo (i) VHDL, (ii) Verilog, (iii) SystemC e (iv) SystemVerilog. Cada linguagem possui suas particularidades, e quem realmente pretende mergulhar mais a fundo no assunto aconselho fortemente a procurar padrões/normas disponíveis na WEB (em uma busca simples aparecem diversos materiais). Através dessas linguagens conseguimos responder muitas da perguntas feitas anteriormente, portanto considero todas as linguagens HDLs importantes, com suas particularidades e igualmente relevantes para descrevermos hardware. Para finalizar todo esse contexto, o presente artigo vamos considerar que a descrição do processador será utilizada a linguagem Verilog.

 

 

O que é VERILOG ?

 

Em resumo, segundo [2] podemos listar que:

  1. Verilog NÃO é um linguagem de software (extrapolando filosoficamente, você não está programando um software, mas sim descrevendo um sistema utilizando uma linguagem de hardware que pressupõe um modelamento/especificação de tempo do componente de hardware. Em resumo - outras linguagens de programação de software (até onde conheço) não possuem explicitamente a capacidade de expressar o requisito TEMPO de um componente - isso já foi motivo para brigas longas em botecos e certamente vai ser motivo de discussão neste artigo );
  2. Verilog é uma linguagem de descrição de hardware (HDL), ou seja, Verilog é uma linguagem com estruturas especiais para modelarmos hardware;
  3. Verilog pode ser usado para simulação e para síntese lógica e física de um sistema;
  4. Verilog é um padrão IEEE (atualmente é o IEEE 1364 - 2005);

 

O que significam os termos (i) modelo estrutural (structural para os mais letrados no inglês) e (ii) modelo comportamental (behavior) tanto mencionado em livros?

 

  1. O modelo estrutural se refere a um circuito como o da figura 1, ou seja, a componentes lógicos interligados através de barramentos e fios. Podemos pensar que basicamente é um modelo que define as relações entre entrada e saída de um circuito;
  2. O modelo comportamental estamos falando agora do programador descrevendo como um circuito deve funcionar, utilizando uma linguagem HDL, deixando para as ferramentas de síntese a criação da lógica e da simulação correta. Nesse momento o modelo pode ser a nível de porta ou módulos sendo instanciados no nosso design;

 

Em geral um projeto como um todo é combinação dos dois modelos. O código abaixo (código 1) é um exemplo da capacidade das linguagens HDLs em descrever o comportamento de um circuito, no caso estamos criando um módulo de hardware descrevendo o comportamento de uma porta lógica AND em Verilog.

 

Código 1: Porta Lógica AND

 

 

Níveis de abstração - Comportamental, RTL e Estrutural

 

Pessoalmente acredito que Verilog é uma linguagem muito poderosa. Justifico essa afirmação lembrando de uma frase interessante do curso [2] página 6 - “Tell me how your circuit should behave and I’ll give you the hardware that does the job”(a tradução é livre). Essa frase traduz muito da linguagem, tanto que de acordo com [3] em Verilog você pode descrever sistemas em diferentes níveis de abstração nos quais listo logo abaixo. Os três principais níveis de abstração são:

  • Comportamental - descreve um sistema utilizando equações matemáticas, podendo omitir questões como o tempo de propagação da lógica (timing);
  • RTL (Register Transfer Level) - nosso sistema é dividido em lógica combinacional e sequencial conforme previsto na linguagem Verilog;
  • Nível de Porta (Gate Level) - cujo sistema já possui seus módulos interconectados, questões de timing já foram tratadas e já possuímos uma NETLIST* oriunda da ferramenta de síntese lógica;


Teríamos um quarto nível, o nível físico de descrição do sistema - inclui a tecnologia utilizada, árvore de clock e pinos de entrada e saída, etc. Não estou incluindo mais detalhes pois acredito que não é o momento de irmos tão a fundo (ainda não).

 

Em [3] na página 2-18 temos um exemplo didático dos níveis de abstração, esse exemplo é reproduzido na Figura 2 abaixo.

 

Comportamental

div2

 

 

RTL

shift_reg

 

 Estrutural

estrutural

Figura 2: Divisão por 2 - Níveis de Abstração

 

Na figura acima (figura 2) fica mais claro a definição dos níveis de abstração. O nível comportamental por exemplo joga toda a responsabilidade para o compilador no momento em que abstraímos a forma como será feita a divisão por 2. Em geral o compilador sabe o que está fazendo e para aplicações mais simples não precisamos nos preocupar tanto com o resultado final da compilação, mas quando o projeto possui uma complexidade e restrições maiores temos que ficar atentos ao tradeoff ** entre a liberdade do compilador e o tempo/custo para configurar o compilador para a melhor solução final.

 

 

Modelamento em VERILOG

 

Prezado leitor, até agora discutimos aspectos amplos da linguagem Verilog com alguns exemplos simples que ilustraram alguns detalhes da linguagem, mas como realmente podemos modelar um sistema em Verilog?  Nesse sentido, vamos navegar nos principais aspectos da linguagem, sua estrutura, seus componentes, seus tipos principais. Tudo isso para que até o fim deste artigo possamos ter um conhecimento básico em como desenvolver um processador em HDL (mas isso não exime o leitor de uma boa leitura sobre a linguagem).

 

Neste sentido, devemos esclarecer alguns aspectos básicos da linguagem:

  1. Verilog é CASE-SENSITIVE;
  2. Espaço em branco é utilizado para melhor visualização do código;
  3. ponto e virgula “ ; ” - é utilizado no fim de cada declaração;
  4. Barras duplas “ // “ - é utilizado para comentário simples;
  5. Barra simples seguido de e asterisco e vice-versa “/* <comentario> */“ - é utilizado para comentário com múltiplas linhas;
  6. Declaração de tempo somente é utilizado para simulação (mas a frente ficará mais claro);

 

Os componentes básico para declararmos um módulo em Verilog são exemplificados na figura 3 abaixo.

 

Figura 3: Componentes básicos para a declaração de um módulo em Verilog

 

Prezado leitor, em [2] existe uma descrição muito clara dos componentes da linguagem, para quem está iniciando a programação em Verilog é uma “mão na roda”, a figura 4 reproduz essa figura.

 

componentes
Figura 4: Componentes da Linguagem Verilog
 

 

 

A palavra chave MODULE

 

A primeira palavra chave que devemos considerar no nosso estudo é a palavra module. Essa palavra é a base para a construção de blocos funcionais ou também chamados módulos dos nossos projetos. Abaixo são descritos suas características:

  1. Descreve a interface do bloco funcional ou do sistema;
  2. Descreve o comportamento do sistema;
  3. Os módulos trocam informações através das suas listas de portas;
  4. Cada módulo criado com nome diferente define um novo escopo;
  5. Cada palavra chave module deve ser encerrada com endmodule seguido de “;” para encerrar o bloco;
  6. Blocos de simulação não possuem declaração de portas de entrada e saída (será tratado a posteriori esse assunto);

 

O código 2 abaixo ilustra a criação de um módulo de um somador binário com bit de transporte.

 

Código 2: Exemplo de uso da palavra chave MODULE 
na criação de um meio somador

 

No código 2 já podemos observar detalhes. Entre as linhas 9 e 12 aparecem as declarações das portas de entrada e saída do nosso sistema ou comumente chamado de PORT LIST do sistema, que podem ser do tipo:

  • input  - porta de entrada de dados;
  • output - porta de saída de dados;
  • inout - porta bidirecional de dados, acredito que alguns cometários a respeito desse tipo de porta são IMPORTANTES:
    • Portas INOUT não devem ser do tipo REG;
    • Não é possível LER e ESCREVER nessa porta simultaneamente, tendo em vista que ela permanece em alta impedância (HIGH Z - 1'bz) para leitura;
    • Uma abordagem recomendada é colocar um sinal de ENABLE para a porta de saída e alta impedância para a porta de entrada de dados;

 

O código 3 exemplifica essa atenção especial que devemos dar a porta INOUT.

 

Código 3: Exemplo de porta INOUT

 

Já a figura 5 é o hardware aproximado do código 3 proposto acima.

inout
Figura 5: Porta INOUT
 

 

O assunto que vamos entrar agora é extenso e necessitaria de um artigo somente para ser bem tratado - Tipo de Dados em Verilog, no entando vou tentar resumir com o que considero o mínimo necessário para entender tipo de dados em Verilog. Existem três tipos de classes de tipos em Verilog que vamos discutir a seguir (ver figura 4 em Declaração de tipos):

  1. NETs - representam a conexão física entre estruturas e objetos (módulos) - exemplo: wire, tri, supply, wand, triand, wor, trior - entre outros;
  2. PARÂMETROS - utiliza constantes para a parametrização dos módulos criados. Muito utilizado para definir delay, tamanhos de variáveis e enumeração de tipos literais. Verilog 2001 adiciona a possibilidade de parâmetros locais (interno ao módulo) através através da construção utilizando a palavra localparamO uso de parâmetros é algo muito útil e forte em um projeto - contudo aconselho fortemente DEFINIR NO INÍCIO DO PROJETO os parâmetros que serão utilizados, em especial o nome e o escopo de cada parâmetros (local ao módulo ou global ao sistema). Recentemente tive problema em um projeto, cuja definição de parâmetros estava definida em um arquivo que utilizava a diretiva `include <arquivo> para incluir no arquivo de topo e subjacentes as definições de forma "GLOBAL" do projeto, contudo no transcorrer do projeto tivemos diversos problemas, principalmente com os nomes utilizados e na síntese lógica;
  3. REGISTROS - representa a unidade básica de memória em Verilog. O valor é armazenado através de um novo evento. A tabela abaixo trata com mais detalhes o assunto (fechando um pouco mais o escopo - estamos falando de Verilog 2001 abaixo):

 

Tipos de RegistrosFuncionalidade
regInteiro sem sinal. Tamanho varia conforme a declaração
reg signedInteiro sem sinal. Tamanho varia conforme a declaração
integerInteiro com sinal. 32 bits de tamanho.
Em operações aritméticas produz complemento de dois.
realPonto Flutuante com precisão dupla
time Inteiro sem sinal. 64 bits de tamanho.

 

Observações importantes sobre REGISTROS:

  • Registros são os tipos mais utilizados - leia muito sobre o assunto, nunca é demais. Registros são como mulheres - bonitas, necessárias, complexas as vezes e possuem tempo e temperamento próprio - portanto trate bem e com sabedoria ou você só irá ter dor de cabeça (essa é a opinião do autor - assumo toda a responsabilidade se algum grupo feminista reclamar);
  • Atenção ao utilizar REAL - ferramentas de síntese necessariamente podem não sintetizar do jeito que você está pensado (experiência própria de quem já teve que voltar para corrigir o design e perdeu algumas horas até descobrir onde estava o problema);
  • TIME é utilizado para armazenar variáveis de tempo para SIMULAÇÃO, esse tipo não é sintetizável;

 

 

HIERARQUIA EM VERILOG

 

O tópico Hierarquia em Verilog é uma parte interessante deste estudo. Neste tópico é possível unir o conhecimento adquirido tal como definir uma especificação de projeto, criar os blocos funcionais e alinhavar com os próximos conhecimentos relativos a processos e simulação em Verilog. Seguindo uma hierarquia ou seja, um módulo principal e seus adjacentes, podemos conectar nossos módulos através de suas portas de entrada e saída de forma a criar um sistema completo. Um exemplo prático é o desenvolvimento de um somador completo [3] a partir de um meio somador (figura 6). Somadores completos de 1 bit são usados em cascata para a criação de somadores maiores de 8, 16, 32 bits. 

 

full_adder
Figura 6: Exemplo de Somador Completo com Carry
 

 

Na figura 6 é possível observar como funciona todo o aspecto da hierarquia em Verilog. O módulo full_add é o módulo que chamamos de TOPO, é a partir do arquivo de topo que iremos construir todo o nosso projeto de um somador completo utilizando meio somadores. Tendo em vista o código 3 do meio somador (half_add) temos as respectivas portas dos módulos U0 e U1 interligadas ou a portas de entrada/saída do full_add ou entre os respectivos dois módulos. Ainda assim, saídas de carry dos módulos U0 e U1 são interligadas a uma porta lógica OU (U2) sinalizando o carry de saída (cout).

 

Código 4: Somador Completo

 

Vale notar que no caso do código 4 as instâncias U0 e U1 são cópias idênticas do half_add. Cada cópia é completa, independente e funciona concorrentemente a outra. Outro aspecto interessante foi necessidade da criação de fios (código 4 linha 9 - wire) para interconectar as portas entres os dois módulos U0 e U1, bem como a porta lógica U2.  

 

PORTAS NÃO CONECTADAS podem causar problemas pois são inicializadas em alta impedância (nível lógico - 'Z). Fica outra dica importante em conectar as portas pelo nome e NÃO PELA POSIÇÃO delas no módulo, garanto que adotar essa dica vai evitar muita dor de cabeça.

 

 

Modelo Comportamental

 

Agora entramos em detalhes chaves das linguagens de descrição de hardware. Estamos falando em como modelar circuitos de forma combinacional ou sequencial.  Para isso vamos entender quando e como usar os operadores (i) assign ou atribuição direta, (ii) always e (iii) initial.

 

Atribuição Contínua

 

Na atribuição continua modelamos o comportamento de uma lógica combinacional através dos seguintes operadores:

  1. Atribuição direta ao fio (wire), por exemplo: wire [7:0] sum_out = mult_out + data_out;   
  2. Ou através do uso da chamada assign, por exemplo: 

 

Algumas características importantes da Atribuição Continua são listadas abaixo:

  1. O tipo da variável mais a esquerda deve ser do tipo fio (wire);
  2. O tipo da variável mais a esquerda sempre será atualizado imediatamente se qualquer variável a direita mudar;
  3. As variáveis a direita podem ser do tipo REG, WIRE ou mesmo chamadas de função (chamadas de função não serão tratadas neste artigo);
  4. Para simulação - tempo pode ser atribuído para modelar atrasos de porta;

 

Blocos de Procedimentos

 

Segundo [2] existem dois operadores a serem discutidos neste tópico o operador  (i) initial e operador (ii) always.

 

O bloco INITIAL é utilizado para inicializar variáveis em simulação, bem como monitorar formas de onda e outros processos durante a simulação. Um bloco INITIAL sempre inicia no tempo zero e só é executado uma única vez na simulação mas de forma concorrente com outros blocos. Dentro do bloco as chamadas são executadas sequencialmente. Por fim, blocos INITIALs não são sintetizáveis.

 

 

TempoChamada executada

0

5

15

20

 

a = 1'b0; b = 1'b1;

c = 1'b0;

d = 1'b0;

$finish

Código 5: Exemplo de bloco INITIAL

 

O operador ALWAYS é muito poderoso. É a partir dele que modelamos um processo que é repetido continuamente em um circuito digital. As principais características são:

  1. Sempre inicia no tempo zero e executa todas a chamadas internas continuamente em looping;  
  2. Se existem múltiplos blocos eles são executados de forma concorrente;
  3. Dentro do bloco as chamadas são executadas sequencialmente.
  4. Também pode ser utilizado em simulação;
  5. Variáveis da esquerda devem ser: registros, inteiros, real ou variável de tempo ou elemento de memória; 

 

O código 6 é um exemplo do uso do operador ALWAYS. 

 

 

TempoChamada executada

0

25

50

75

100

clk = 1'b0;

clk = 1'b1;

clk = 1'b0;

clk = 1'b1;

$finish

Código 6: Exemplo de bloco ALWAYS

 

O próximo assunto merece um artigo somente para ele devido a importância e a complexidade que ele oferece para quem está inicialmente trabalhando com Verilog. Assim sendo vamos caracterizar um pouco mais os dois tipo de chamada de procedimentos que existem em Verilog, as chamadas (i) bloqueante e as chamadas (ii) não-bloqueante. Resumidamente o leitor tem que ter em mente as seguintes afirmações:

  • PROCESSOS COMBINACIONAIS - podemos empregar os dois tipos;
  • PROCESSOS SEQUENCIAIS - SOMENTE é utilizado NÃO-BLOQUEANTE (evita condição de corrida, ou em inglês, race condition);

 

Em um procedimento bloqueante, ou seja quando a variável a recebe um valor somente através da atribuição igual ( = ), a atribuição é executada em sequência no bloco.

 

Em um procedimento não-bloqueante, ou seja quando a variável a recebe um valor através da atribuição menor e igual ( <= ), a atribuição é executada em paralelo no bloco. Em [2] página 25, a figura 7 é um excelente exemplo do que foi discutido acima.

 

 
b_nb
Figura 7: Exemplos de atribuições bloqueantes e não-bloqueantes
 

 

 

Operadores em VERILOG

 

Conforme listado em [3] Verilog possui os seguintes operadores: (i) aritméticos, (ii) lógica binária ou bit-wise, (iii) redução, (iv) rotação de bit, (v) igualdade, (vi) relacional, (vii) condicional, (viii) concatenação e por fim (ix) replicação. A tabela abaixo lista todos os operadores, seus simbolos e precedência do mais alto para o mais baixo.

 

Tipo de OperadorSímboloPrioridade
Concatenação/Replicação{  }   {{  }}Alta prioridade
Inversão (logica/ bit-a-bit/ aritmética)!   ~  +  - (unário)

Média prioridade

Exponencial**
Aritmético

*  /  % + -  (binário)

Rotação<<   >>     <<<   >>>
Relacional<  <= > =>
Igualdade==  !=   ===  !==
Bit-a-bit/ Redução

&  ~&  ^  ^~  ~^

|   ~|

Lógico

&&

||

Condicional? : (ternário) Baixa Prioridade

 

Todos os operadores são importantes e valem a pena serem estudados com mais afinco, contudo três me chamam muita atenção pela praticidade que exercem quando bem utilizados em um projeto, o operador de concatenação, replicação e condicional. O operador de concatenação "{ }" é muito utilizado para reorganização e construção de vetores de bits, o código 6 abaixo é um bom exemplo de concatenação.

 

Código 6: Exemplo de Concatenação

 

O operador replicação por sua vez é muito utilizado para replicar bits em vetores, a sintaxe segue a seguinte forma: { <repetições> {<variável>}} como exemplo poderíamos repetir o bit 1 - 1’b1  oito vezes e atribuir esse valor ao um registro com o código 7 abaixo.

 

Código 7: replicação do bit 1 oito vezes

 

O operador condicional "? : " é um operador muito forte, podemos tratá-lo como um multiplexador, ou seja, conforme uma condição inicial o valor de saída pode assumir a expressão verdadeira ou a expressão falsa. A sintaxe desse operador possui a seguinte forma: <saída> = <expressão_condicional> ? <expressão_verdadeira>:<expressão_falsa>;

(e.g. assign d_out = (sel == true) ? d_in1 : d_in0;)

 

O operador shift aritmético " <<< ou >>> " possui características interessantes:

  • shift aritmético para a direita: desloca o número especificado de bits, preenche com o valor do bit de sinal se expressão é assinalada, caso contrário, preenche com zero;
  • shift aritmético para a esquerda: Desloca o número especificado de bits, preenche com zero;

 

 

Código VERILOG de um processador de 16 bits

 

Finalmente chegamos ao processador. Justifico essa demora pela necessidade de difundirmos o conhecimento da forma mais simples até a mais complexa. Como prometido no primeiro post (PROCESSADORES PROGRAMÁVEIS - como projetar um processador em VERILOG - Arquitetura - parte 1) vamos agora compartilhar parte do fruto de duas frentes de trabalho, a primeira iniciada com o desenvolvimento do processador BIP e do ambiente de ensino BIPIDE [5] pelos professores da UNIVALI - SC e a segunda frente que utilizou a arquitetura do BIP como base para o ensino de microeletrônica no programa CI-Brasil em Campinas/SP em 2014/2015. 

 

Peço ao leitor que use o código com sabedoria, no intuito de evoluir o conhecimento ministrado seus pelos professores. Caso encontre algum erro por gentileza me comunique que iremos trabalhar para melhorar o código. Sugestões para controle de requisitos e discrepância também serão muito úteis, agradeço desde já a todos. Caso existam dúvidas sobre a organização adotada por gentileza consulte o post -  PROCESSADORES PROGRAMÁVEIS - como projetar um processador em VERILOG - organização - parte 2.

 

Abaixo estão listados em árvore os arquivos utilizados no projeto. Logo abaixo segue um link com somente o código fonte em formato ZIP. 

 

 Link para o código -> link

 

 

PRÓXIMA PUBLICAÇÃO

 

Prezado leitor, na próxima publicação (Simulação – Parte 4) iremos tratar em como simular o processador utilizando a ferramenta MODEL da Mentor Lab. Iremos trabalhar aspectos de escala de temporização, formas de gerar um testbench, iremos discutir o uso de task e diretivas de simulação. Volto a reafirmar que o processador tem cunho didático e não esgota por si só o conteúdo.

 

* NETLIST - no presente contexto netlist é usado para descrever um arquivo com a interligações do sistema. O assunto é amplo e será abordado mais amiúde nas próximas publicações. 

 

** Trade-off - traduzindo livremente é uma relação de perda-e-ganho, ou seja, se diminuirmos alguma característica do sistema outra caracteristica do sistema é aumentada. Um exemplo singelo pode ser - reduzindo a frequência de operação de uma ULA é aumentado o tempo para que a operação da ULA seja finalizada, contudo outros benefícios deve ser considerados como ganho, como a redução da potência dissipada em Watts (calor) pela ULA e por conseguinte a redução do consumo de energia em Volts (ou mili-volts). Nesse sentido pensar em trade-off devemos sempre considerar aspectos como consumo de área (tamanho do silício), a eficiência energética do sistema e o desempenho do sistema, e como cada aspecto interage um com o outro. O assunto trade-off é extenso e não se limita somente somente aos aspectos mencionados acima - recomendo fortemente a leitura de [4] ao leitor, no intuito de perceber o impacto da escolha de uma técnica otimização de um circuito digital (escolha de parâmetros da porta lógica) pode influenciar diretamente no desempenho, na potência e/ou na área de um circuito.

 

 

REFERÊNCIAS

 

[1] Sistemas Digitais - Projeto, Otimização e Hdls - Frank Vahid, ed.Artmed, 2008

[2] ALTERA - Introduction to Verilog. Material disponibilizado no curso de Introdução a Verilog ministrado pela Macnica DHW (http://www.macnicadhw.com.br/introduction-to-verilog)

[3] CADENCE - Verilog Language and Application, version 6.2. March 6, 2008.

[4] Livramento, Vinícius (esse cara é fera) - Sizing Discreto Baseado em Relaxação Lagrangeana para Minimização de Leakage em Circuitos Digitais, Ano de Obtenção, 2013: https://repositorio.ufsc.br/bitstream/handle/123456789/107097/318856.pdf?sequence=1&isAllowed=y

[5] http://bipide.com.br/

 

Outros artigos da série

<< PROCESSADORES PROGRAMÁVEIS - como projetar um processador em VERILOG - Organização - parte 2
Este post faz da série Processadores programáveis. Leia também os outros posts da série:
NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Rodrigo Pereira
Engenheiro da Computação e Mestre em Computação Aplicada, cursou o programa Brasil-IP e CI-Brasil em Campinas/SP. Atualmente cursa doutorado junto ao PPGeEL - UFSC. Possui experiência no desenvolvimento e projeto de hardware e firmware para sistemas embarcados. Jornalista freelancer, curte praia e conhecer outros lugares. No tempo livre respira aviação. Amo meu filho, Francisco.

3
Deixe um comentário

avatar
 
3 Comment threads
0 Thread replies
2 Followers
 
Most reacted comment
Hottest comment thread
2 Comment authors
Alexandre VenitoJOSE PEDREIRA NETO Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Alexandre Venito
Membro
Alexandre Venito

Excelente material. Minha pergunta é a mesma do José Pedreira, já houve a quarta parte?

JOSE PEDREIRA NETO
Visitante
JOSE NETO

Bom dia, ótimo material!!
Gostaria de saber a parte 4 Simulação, já existe alguém pode passar o link?

trackback

[…] [1] https://www.embarcados.com.br/processadores-programaveis-como-projetar-um-processador-em-verilog-codi… […]