Tutorial Verilog
Tutorial Verilog
Tutorial Verilog
1 Edio 2011.1
INTRODUO Resolvi elaborar este documento aps pagar a cadeira de Sistemas Digitais em 2011.1, j que a maior dificuldade que os alunos (me incluindo) sentiram durante o projeto da 2 unidade, foi em entender a sintaxe e semntica da linguagem Verilog. O objetivo deste tutorial esclarecer algumas dvidas a respeito da linguagem, utilizada no projeto da 2 Unidade de Sistemas Digitais, alm de servir como reviso para a cadeira de Infraestrura de Hardware, onde ela ser trabalhada mais a fundo. Aqui voc encontrar a explicao das principais keywords alm de exemplos de como utilizlas, tentei explic-las de uma maneira menos formal para facilitar o entendimento. E no, voc no vai encontrar o cdigo entregue de bandeja neste tutorial (apesar de dar para pescar alguma coisa). A lgica com voc, ou como diz um amigo meu: D teus pulo, boy!. fas5.
1. PRINCIPAIS KEYWORDS 1) module/endmodule a mesma coisa que mtodo (ou funo) em outras linguagens. OBS.: Um module sempre encerrado com um endmodule. Sintaxe e Semntica: module nome_do_modulo (input 1, input N, ..., output1, ..., outputN); Ex1.: module SomaSub (In1, In2, Seletor, Overflow, Out); () endmodule In1, In2, Seletor = entradas. Overflow, Out = sadas. module MaiorQue (A, B, Status); () endmodule A, B = entradas. Status = sada. // Incio do mdulo SomaSub // Fim do mdulo SomaSub
Ex2.:
2) input usado para declarar uma entrada. Sintaxe e Semntica: input nome_da_entrada; Ex1.: Ex2.: input In1, In2; input [3:0] A; input [3:0] B; input [7:0] A, B; input Clock; // Declarando duas entradas, In1 e In2, de 1 bit // Declarando uma entrada, A, de 4 bits // Declarando uma entrada, B, de 4 bits // Declarando duas entradas, A e B, de 8 bits // Declarando uma entrada, Clock, de 1 bit
Ex3.:
3) output usado para declarar uma sada. Sintaxe e Semntica: output nome_da_saida; Ex1.: Ex2.: output Out; output [2:0] Out; output Overflow, Status; // Declarando uma sada, Out, de 1 bit // Declarando uma sada, Out, de 3 bits // Declarando duas sadas, Overflow e Status, de 1 bit
4) reg usado para quando se deseja guardar um valor em uma entrada ou sada at que outro valor seja enviado para essa entrada ou sada (registrador). OBS.: Entradas e sadas usadas dentro de blocos always/initial devem ser do tipo reg. Sintaxe e Semntica: reg nome_da_entrada/saida; Ex1.: Ex2.: reg In1, In2, Out; reg [2:0] Tx, Ty, Tz; reg [1:0] Tula; reg Conta, Reset; // Setando In1, In2 e Out como trs registradores de 1 bit // Setando Tx, Ty e Tz como trs registradores de 3 bits // Setando Tula como um registrador de 2 bits // Setando Conta e Reset como dois registradores de 1 bit
5) wire o tipo padro das entradas e sadas. OBS.: No se pode usar entradas/sadas do tipo wire dentro de blocos always/initial. Sintaxe e Semntica: wire nome_da_entrada/saida; Ex.: wire [3:0] Outtemp; // Declarando um fio, OutTemp, que suporta 4 bits.
6)
Sintaxe e Semntica: assign nome_da_entrada/saida = valor; Ex1.: input [3:0] In1; (...) assign In1 = 4b1001; (...) input [7:0] In1, In2; output Status; (...) assign Status = (In1 > In2); (...) // Declarando uma entrada, In1, de 4 bits // In1 recebe a cadeia de 4 bits 1001.
Ex2.:
// Declarando duas entradas, In1 e In2, de 8 bits // Declarando uma sada, Status, de 1 bit /* Status recebe 1, se In1 for maior do que In2, * caso contrrio, recebe 0 */
Ex3.:
input [3:0] In1, In2; // Declarando duas entradas, In1 e In2, de 4 bits input [1:0] Sel; // Declarando uma entrada, Sel, de 2 bits output [3:0] Out; // Declarando uma sada, Out, de 4 bits (...) assign Out = (Sel == 2'b01)? In1: In2; /* Se Sel for igual cadeia de 2 bits 01, Out (...) * recebe In1, caso contrrio, recebe In2 */
7) begin/end utilizado para iniciar uma sequncia de comandos. Quando h apenas um comando a ser executado, no necessria a utilizao de begin/end, mas recomendada, para melhorar a legibilidade do cdigo. Sintaxe e Semntica: begin comando1; comando2; (...) comandoN; end Ex.: exemplos no prximo item.
8) initial usado para inicializar inputs e/ou outputs. OBS.: Como o objetivo de inicializar inputs e outputs fazer com que eles guardem algum valor, eles tambm tm que ser declarados como reg. Sintaxe e Semntica: initial begin Saida1 = dado1; Saida2 = dado2; (...) end Ex1.: output [3:0] Out; reg [3:0] Out; (...) initial Out <= 4'b0000; (...) input [3:0] In1; input Sel; reg [3:0] In1; reg Sel; (...) initial begin In1 = 4b1010; Sel = 1; end (...) // Declarando uma sada, Out, de 4 bits // Setando Out como registrador de 4 bits // Inicializando Out com a cadeia de 4 bits 0000
Ex2.:
// Declarando uma entrada, In1, de 4 bits // Declarando uma entrada, Sel, de 1 bit // Setando In1 como registrador de 4 bits // Setando Sel como registrador de 1 bit // Incio do bloco // Inicializando In1 com a cadeia de 4 bits 1010 // Inicializando Sel com o bit 1 // Fim do bloco
9) always utilizado para realizar instrues sempre que houver mudana em alguma entrada/sada pr-determinada. OBS.: posegde = o bloco always executar na descida do clock. negedge = o bloco always executar na subida do clock. Sintaxe e Semntica: always @ (entrada1 or ... or entradaN) begin (...) cdigo; (...) end Ex1.:
ou
input [2:0] In1, In2, In3; // Declarando trs entradas, In1, In2 e In3, de 2 bits (...) always (In1 or In2 or In3) begin /* Incio do bloco. Sempre que In1, In2 ou In3 (...) * mudarem de valor, o cdigo dentro do bloco cdigo; * ser executado */ (...) end // Fim do bloco input Clock; // Declarando uma entrada, Clock, de 1 bit input [3:0] In1, In2; // Declarando duas entradas, In1 e In2, de 4 bits (...) always @(posedge Clock) begin /* Incio do bloco. Na descida do clock, o (...) * cdigo dentro do bloco ser executado */ cdigo; (...) end // Fim do bloco OBS.: Se ao invs de posedge estivesse escrito negedge, o cdigo dentro do bloco seria executado na subida do clock.
Ex2.:
10) case/endcase bloco condicional, semelhante ao bloco case em Java. OBS.: A keyword default usada para descrever uma ao padro, ou seja, caso a entrada no seja nenhuma das previstas pelo programador, um cdigo padro tambm definido pelo programador ser executado. Seu uso no no obrigatrio. Sintaxe e Semntica: case (entrada) possivel_entrada 1: begin (...) cdigo; end (...) possivel_entrada N: begin (...) cdigo; end default: begin (...) cdigo; end endcase Ex1.: input [1:0] In; output [3:0] Out; (...) case (In) 2b00: Out <= 4b0010; 2b01: Out <= 4b1010; 2b10: Out <= 4b0110; 2b11: Out <= 4b0111; endcase input [1:0] In; input Sel; output [3:0] Out; (...) case (In) 2b00: Out <= 4b0010; 2b01: Out <= 4b1010; 2b10: begin Out <= 4b0110; Sel <= 1; end default: Out <= 4b0111; endcase // Declarando uma entrada, In, de 2 bits // Declarando uma sada, Out, de 4 bits // Incio do bloco // Caso In seja igual a 00, Out receber 0010 // Caso In seja igual a 01, Out receber 1010 // Caso In seja igual a 10, Out receber 0110 // Caso In seja igual a 11, Out receber 0111 // Fim do bloco // Declarando uma entrada, In, de 2 bits // Declarando uma entrada, Sel, de 1 bit // Declarando uma sada, Out, de 4 bits // Incio do bloco // Caso In seja igual a 00, Out receber 0010 // Caso In seja igual a 01, Out receber 1010 /* Caso In seja igual a 10: * Out receber 0110 e * Sel receber 1 */ // Caso In seja igual a 11, Out receber 0111 // Fim do bloco
Ex2.:
11) if/else bloco condicional semelhante ao bloco if/else de Java. S pode ser utilizado dentro de blocos always. Sintaxe e Semntica: if (condicao) begin (...) cdigo (...) end else begin (...) end Ex1.:
ou
input [3:0] A, B; output [3:0] Out; (...) if (A > B) begin Out <= A - B; end else begin Out <= B - A; end (...)
// Declarando uma entrada, In, de 4 bits // Declarando uma sada, Out, de 4 bits /* Incio do bloco. Se A for maior do que B: * Out recebe o valor da operao A B, * caso contrrio: * Out recebe o valor da operao B - A */ // Fim do bloco
Ex2.:
input [3:0] In; // Declarando uma entrada, In, de 4 bits input [1:0] Sel; // Declarando uma entrada, Sel, de 2 bits output [3:0] Out; // Declarando uma sada, Out, de 4 bits wire [3:0] OutTemp; // Declarando um fio que suporta 4 bits (...) assign Out = (Sel == 2'b11)? In: OutTemp; /* Caso Sel seja igual a 11, Out recebr (...) * o mesmo valor de In1, caso contrrio, * receber o valor de OutTemp */
12) parameter usado para rotular dados que sero utilizados muitas vezes, contribuindo para a legibilidade do cdigo. Sintaxe e Semntica: parameter ROTULO = cadeia de bits; Ex.: input [3:0] Instrucao; // Declarando uma entrada, Instrucao, de 4 bits (...) parameter CLRLD = 4b0000; // Rotulando a cadeia de 4 bits 0000 como CLRLD parameter ADDLD = 4b0001; // Rotulando a cadeia de 4 bits 0001 como ADDLD parameter HOLD = 4b0010; // Rotulando a cadeia de 4 bits 0010 como HOLD (...) case (Instrucao) // Incio de um bloco do tipo case CLRLD: begin /* Caso Instrucao seja igual a 0000, execute () * at o prximo end */ end ADDLD: begin /* Caso Instrucao seja igual a 0001, execute () * at o prximo end */ end HOLD: begin /* Caso Instrucao seja igual a 0010, execute () * at o prximo end */ end () endcase // Fim do bloco (...) OBS.: As cadeias 0000, 0001, 0010 foram rotuladas como CLRLD, ADDLD, HOLD, respectivamente. Sempre que for preciso usar essas cadeias no cdigo, no ser necessrio digit-las novamente, podendo substitu-las por seus respectivos rtulos.