VERILOG Alex Vidigal Bastos
Sumário Objetivos Introdução Hierarquia Estruturas de Modelagem
Objetivos Identificar os modelos de componentes do Verilog, incluindo módulos, instâncias e portas; Correta sintaxe para cada um dos modelos dos componentes do Verilog; Indicar as relações entre os diferentes modelos dos componentes do Verilog; Identificar e corrigir a sintaxe para as estruturas de modelagem que são componentes dos
Verilog Com as linguagens de descrição de hardware, o processo passou a ser como o de se desenvolver um software. Um exemplo seria: Especificação Design de Alto Nível Codificação Verificação / Testes Sintetização
Introdução Linguagens de descrição de hardware, ou HDL, são linguagens utilizadas para projetar hardware. Tal como o nome implica, um HDL também pode ser usado para descrever a funcionalidade do hardware, bem como a sua aplicação.
Introdução A principal característica de uma linguagem de descrição de hardware é que ele contém a capacidade para descrever a função de uma peça de hardware de forma independente da aplicação.
Introdução O grande avanço com HDL modernos foi o reconhecimento de que uma linguagem única pode ser utilizada para descrever a função do projeto e também para descrever a implementação. Isto permite que o processo de concepção inteira para ter lugar numa única linguagem, e, assim, uma representação única do projeto.
História
Hierarquia Verilog permite representar a hierarquia de um projeto. As estruturas de Verilog que constrõem a hierarquia são: Módulos; Portas;
Hierarquia Um modelo de Verilog é composto de módulos. Um módulo é a unidade básica do modelo, e pode ser composto de instâncias de outros módulos. Um módulo de que é composto de instâncias dos outros módulos é chamado um parent module, e as instâncias são chamadas parent children.
Hierarquia
Verilog - Exemplo
Verilog - Exemplo module and2 (a, b, y); input a, b; output y; assign y = a & b; endmodule
Linguagens de Descrição de Hardware - HDL Para quê precisamos de uma Linguagem de Descrição de Hardware? Modelar, Representar e simular hardware digital Concorrência Paralelismo Semântica para valores de sinais no tempo Construções e semântica especiais Transições (bordas) de valores de sinais Atrasos de propagação de sinais Verificação de condições temporais 14
VERILOG HDL A unidade básica o modulo Modulo (module) Descreve a funcionalidade do circuito Define terminais (pinos, portas) de entrada e saída Exemplo: Um computador Funcionalidade: Realizar operações programadas Portas de entrada/saída: conector para teclado, mouse, conector VGA, conector USB 15
Module Definição geral module module_name ( port_list ); port declarations; variable declaration; description of behavior endmodule Exemplo module HalfAdder (A, B, Sum, Carry); input A, B; output Sum, Carry; assign Sum = A ^ B; //^ denotes XOR assign Carry = A & B; // & denotes AND endmodule 16
Convenções Lexicais Comentários // comentário de uma linha só /* outra forma de comentário de uma linha */ /* inicio de comentário com múltiplas linhas todo texto é ignorado termina com a linha abaixo */ Números decimal, hexadecimal, octal, binário unsized decimal form size base form include underlines, +,- Cadeias de caracteres "Delimite usando aspas numa mesma linha" limitados a 1024 caracteres 17
Identifier A... Z a... z 0... 9 Underscore Convenções Lexicais (cont.) Strings são limitadas a 1024 caracteres Primeiro caractere de identificação não deve ser um dígito Operators: Verilog diferencia letras maiúsculos de minúsculos 18
Estilos de Descrição Estrutural: representa circuitos lógicos usando primitivas da linguagem Verilog Exemplo: not n1(sel_n, sel); and a1(sel_n, b, sel_b); and a2(sel_a, a, sel); or o1(out, sel_b, sel_a); b sel n1 a1 sel_b sel_n a o1 out a2 sel_a 19
Estilo de Descrição (cont.) Fluxo de dados: Representa sinais de saída em função de sinais de entrada Exemplo: assign out = (sel & a) (~sel & b); b sel sel_n sel_b out sel_a a 20
Estilo de Descrição (cont.) Comportamental: representa o comportamento na forma de um algoritmo Exemplo: if (select == 0) begin out = b; end else if (select == 1) begin out = a; end a b Black Box 2x1 MUX out select 21
Estilo de Descrição (cont.) RTL (Register Transfer Level): descreve o que acontece a cada transição ativa do sinal de relógio Exemplo: always @(posedge clock) begin end pisca = ~pisca; 22
Modelo estrutural Execução: Concorrente Formato (portas lógicas primitivas): and G2(Carry, A, B); Primeiro parâmetro (Carry) Output Outros parâmetros (A, B) - Inputs 23
Modelo de Fluxo de Dados Usa atribuição permanente para sinais Format: assign [ delay ] net = expression; Example: assign sum = a ^ b; delay : Atraso de propagação da expressão para o sinal Todas as atribuições permanentes executam simultaneamente A ordens das atribuições dentro do arquivo Verilog não tem efeito sobre a execução. 24
Modelo de Fluxo de Dados (cont.) Atraso Exemplo: assign #2 sum = a ^ b; #2 indica 2 unidades de tempo Sem especificação de atraso: 0 (default) Associação entre unidade de tempo e tempo simulado `timescale unidade de tempo/ precisão tempo Exemplo: `timescale 1 ns / 10 ps 1 unidade de tempo = 1 ns resolução é 10 ps (0.01 ns) 10.512 ns é interpretado como 10.51 ns 25
Modelo de Fluxo de Dados (cont.) Exemplo: `timescale 1ns/10ps module HalfAdder (A, B, Sum, Carry); input A, B; output Sum, Carry; assign #3 Sum = A ^ B; assign #6 Carry = A & B; endmodule 26
Modelo de Fluxo de Dados (cont.) 27
Exemplo: Modelo comportamental module mux_2x1(a, b, sel, out); input a, a, sel; output out; always @(a or b or sel) begin if (sel == 1) out = a; else out = b; end endmodule Sensitivity List 28
Modelo comportamental RTL (cont.) always statement : Sequência do bloco; Sequential Block: Todas as declarações dentro do bloco são executados sequencialmente; Quando é executado? Ocorrência de um evento na lista de sensibilidade; Evento: Mudança do valor lógico 29
Modelo comportamental RTL (cont.) - Declarações com um bloco seqüencial: Atribuições processuais - Atraso na Atribuições processuais Inter-Statement Delay Intra-Statement Delay 30
Modelo comportamental (cont.) Atraso entre atribuições: Exemplo: Sum = A ^ B; #2 Carry = A & B; Execução atrasada Atraso dentro de uma atribuição: Exemplo: Sum = A ^ B; Carry = #2 A & B; Atribuição atrasada 31
Existem dois: Construções Procedurais initial : Executa uma única vez no início da simulação, NÃO sintetizável always : Executa repetidamente, sintetizável Exemplo: initial begin Sum = 0; Carry = 0; end always @(A or B) begin Sum = A ^ B; Carry = A & B; end 32
Controle por evento Controle por evento Disparo do evento por transição (borda) Disparo do evento por nível Controle por evento de transição @ (posedge CLK) // transição positiva de CLK Curr_State = Next_state; Controle por evento de nível lógico @ (A or B) // mudança nos valores de A ou B Out = A & B; 33
Instruções de Laço Laços Repeat While For Laço repeat Exemplo: repeat (Count) sum = sum + 5; Se a condição é x or z ela é tratada como 0 34
Laço While Instruções de Laço (cont.) Exemplo: while (Count < 10) begin end sum = sum + 5; Count = Count +1; Se a condição é x or z ela é tratada como 0 Laço For Exemplo: for (Count = 0; Count < 10; Count = Count + 1) begin end sum = sum + 5; 35
Instruções Condicionais Formato: if (condition) procedural_statement else if (condition) procedural_statement else procedural_statement Exemplo: if (reset) Q = 0; else Q = D; 36
Instruções Condicionais (cont.) Instrução Case Exemplo 1: case (X) 2 b00: Y = A + B; 2 b01: Y = A B; 2 b10: Y = A / B; endcase Example 2: case (3 b101 << 2) 3 b100: A=B+C; 4 b0100: A=B C; 5 b10100: A=B/C; //This statement is executed endcase 37
Tipos de Dados Net Type: Wire wire [ msb : lsb ] wire1, wire2, Exemplo: wire Reset; // A 1-bit wire wire [6:0] Clear; // A 7-bit wire Register Type: Reg reg [ msb : lsb ] reg1, reg2, Exemplo: reg [ 3: 0 ] cla; // A 4-bit register reg cla; // A 1-bit register 38
Restrições sobre Tipos de Dados Fluxo de Dados e Modelagem Estrutural - Pode usar somente tipos de dados wire - Não pode usar tipo de dados reg Modelos de Comportamento - Pode usar somente tipos de dados reg (dentro das construções iniciais e always) - Não pode usar tipo de dados wire 39
Um array de registros Memórias reg [ msb : lsb ] memory1 [ upper : lower ]; Example reg [ 0 : 3 ] mem [ 0 : 63 ]; // Um array de 64-4bit de registradores reg mem [ 0 : 4 ]; // Um array de 5 1-bit registers 40
Diretivas de Compilação `define (Similar ao define em C) usado para definir parâmetros globais Example: `define BUS_WIDTH 16 reg [ `BUS_WIDTH - 1 : 0 ] System_Bus; `undef Remove a diretiva previamente definida Example: `define BUS_WIDTH 16 reg [ `BUS_WIDTH - 1 : 0 ] System_Bus; `undef BUS_WIDTH 41
Compiler Directives (cont.) `include usado para incluir outro arquivo Example `include./fulladder.v 42
Tarefas de Sistema Exibir as tarefas - $display : Mostra toda a lista no momento em que declaração é encontrada; $monitor : Sempre que há uma mudança em qualquer argumento, exibe toda a lista no final do passo de tempo; Tarefa de Controle de Simulação $finish : Faz o simulador sair; $stop : Suspende a simulação Time $time: dá o tempo da simulação; 43
Tipos de Conexões de portas Connection by Position parent_mod 44
Tipos de Conexões de portas (cont.) Connection by Name parent_mod 45
Conexões de Portas Vazias Se uma porta de entrada de um módulo instanciado estiver vazia, a porta está definida para um valor de z (alta impedância). module child_mod(in1, In2, Out1, Out2) module parent_mod(.) input In1; input In2; child_mod mod(a,,y1, Y2); output Out1; //Empty Input output Out2; endmodule //behavior relating In1 and In2 to Out1 endmodule Se uma porta de saída de um módulo instanciado é deixado vazio, a porta é considerado como não utilizada. module parent_mod(.) child_mod mod(a, B, Y1, ); //Empty Output endmodule 46
Bancada de Teste `timescale 1ns/100ps module Top; reg PA, PB; wire PSum, PCarry; HalfAdder G1(PA, PB, PSum, PCarry); initial begin: LABEL reg [2:0] i; for (i=0; i<4; i=i+1) begin {PA, PB} = i; #5 $display ( PA=%b PB=%b PSum=%b PCarry=%b, PA, PB, PSum, PCarry); end // for end // initial endmodule Test Bench Apply Inputs Design Module Observe Outputs 47
Bancada de Teste - Estímulo gerador Exemplo: uma sequência de valores; initial begin Clock = 0; #50 Clock = 1; #30 Clock = 0; #20 Clock = 1; end 48
Bancada de Teste Gerando Clock Sinais Repetitivos Signals (clock) Clock Solução Simples: wire Clock; assign #10 Clock = ~ Clock Cuidados: Iniciar valores de clock (wire data type) = z ~z = x and ~x = x 49
Bancada de Teste Gerando Clock Inicializar o sinal de clock initial begin Clock = 0; end Cuidado: Clock is of data type wire, cannot be used in an initial statement Solução: reg Clock; initial begin Clock = 0; end always begin #10 Clock = ~ Clock; end SEMPRE loop pode ser usado para gerar clock 50
Perguntas?