810 likes | 966 Views
Projetando Sistemas Digitais com SystemVerilog. Edna Barros Grupo de Engenharia da Computação Centro de Informática -UFPE. P. C. W. r. i. t. e. C. o. n. d. P. C. S. o. u. r. c. e. P. C. W. r. i. t. e. A. L. U. O. p. O. u. t. p. u. t. s. I. o. r. D. A.
E N D
Projetando Sistemas Digitais com SystemVerilog Edna Barros Grupo de Engenharia da Computação Centro de Informática -UFPE
P C W r i t e C o n d P C S o u r c e P C W r i t e A L U O p O u t p u t s I o r D A L U S r c B M e m R e a d A L U S r c A C o n t r o l M e m W r i t e R e g W r i t e M e m t o R e g O p R e g D s t I R W r i t e [ 5 – 0 ] 0 M u J u m p x I n s t r u c t i a d d r e s s [ 3 1 - 0 ] 2 I n s t r u c t i o n [ 3 1 - 2 6 ] P C 0 I n s t r u c t i o n R e a d M [ 2 5 – 2 1 ] r e g i s t e r 1 u x R e a d A I n s t r u c t i o n R e a d Z e r o 1 d a t a 1 [ 2 0 – 1 6 ] r e g i s t e r 2 A L U A L U 0 R e g i s t e r s r e s u l t I n s t r u c t i o n W r i t e M R e a d B [ 1 5 – 0 ] r e g i s t e r u I n s t r u c t i o n d a t a 2 x [ 1 5 – 1 1 ] I n s t r u c t i o n 4 W r i t e 1 r e g i s t e r d a t a 0 I n s t r u c t i o n [ 1 5 – 0 ] M u x M e m o r y 1 1 6 3 2 d a t a A L U S h i f t S i g n r e g i s t e r c o n t r o l l e f t 2 e x t e n d I n s t r u c t i o n [ 5 – 0 ] Projeto: Implementação Multi-ciclo 1 2 6 2 8 o n [ 2 5 – 0 ] S h i f t l e f t 2 P C [ 3 1 - 2 8 ] 0 M A d d r e s s u x M e m o r y 1 A L U O u t M e m D a t a 0 W r i t e M 1 d a t a u 2 x 3
Especificação • Diagrama de Gajski
Formas de Descrição de Circuitos • Em SystemVerilog temos quatro formas diferentes de descrever circuitos. • Forma Estrutural • Fluxo de Dados • Forma Comportamental • RTL
Definindo Entidades • Definição das portas do circuito • A definição dos terminais de um módulo é feita da seguinte forma. moduleteste ( input logicA,B, input C, output logicS1, output logicS2 ); ..... endmodule
Definindo Entidades • Exemplo: no código abaixo está descrito um somador de 1 bit modulesomador1Bit ( inputA, B, output Soma, Carry); always_comb Soma <= A ^ B; //A xor B always_combCarry <= A & B; //A and B endmodule
b sel_b sel a1 n1 sel_n out o1 a a2 sel_a Formas de Descrição de Circuitos • Forma Estrutural • Representacircuitoslógicosusandoprimitivasdalinguagem. • Exemplo Module X (input a, b, sel output out); notn1(sel_n, sel); and a1(sel_b, b, sel_b); anda2(sel_a, a, sel); oro1(out, sel_b, sel_a); endmodule
Formas de Descrição de Circuitos moduleor_nand_1 ( inputenable, x1, x2, x3, x4, output logic y); logicw1, w2; or(w1, x1, x2); or (w2, x3, x4); nand(y, w1, w2, enable); endmodule • Forma Estrutural • Os comandos são executados de forma concorrente.
Mapeamento de Portas • Após criar vários módulos componentes de um mesmo circuito, SystemVerilog nos permite ligá-los em um módulo maior de três formas diferentes. • Conexão por Posição • Conexão Explícita. • Conexão por Casamento
Mapeamento de Portas • Conexão por Posição • As conexões são dadas através da posição das portas do módulo filho. • A ordem de ligação das portas é significativa.
Mapeamento de Portas modulo_Pai modulemodulo_Filho( inputsig_a, sig_b, output logic sig_c,sig_d);// descrição do module endmodule modulemodulo_Pai(...); logic[3:0] g; child_modU1(g[3],g[1], g[0],g[2]); endmodule • Conexão por Posição • Exemplo:
Mapeamento de Portas • Conexão Explícita • Neste caso os sinais de ligação internos são explicitamente ligados às portas dos módulos componentes. • A ordem de ligação das portas não é significativa.
Mapeamento de Portas modulemodulo_Filho(inputsig_a, sig_b,output logic sig_c,sig_d);// descrição do module endmodule module modulo_Pai( ... ); logic [3:0] g; modulo_Filho U1( .sig_c(g[0]), .sig_b(g[1]), .sib_d(g[2]), .sig_a(g[3]) ); endmodule modulo_Pai Conexão Explícita
Mapeamento de Portas • Conexão por Casamento • Neste caso a conexão se dá de forma totalmente implícita. • Sinais internos ao módulo pai são declarados com o mesmo nome das portas dos módulos filhos. A conexão se dá de forma automática. • Esse tipo de conexão está muito sujeita a erros.
modulo_Pai a b c d a b c dmodulo_Filho Mapeamento de Portas Conexão por casamento modulemodulo_Filho( inputa, b, output logicc,d);// descrição do module endmodule modulemodulo_Pai(...); logica,b,c,d; child_mod U1( .* ); endmodule
b sel_b sel sel_n out sel_a a Formas de Descrição de Circuitos • Fluxo de Dados • Representasinais de saídaemfunção de sinais de entrada. always_combout <= (sel & a) | (~sel & b);
Formas de Descrição de Circuitos module or_nand_2 ( input enable, x1, x2, x3, x4, output logic y); always_comby <= !(enable & (x1 | x2) & (x3 | x4)); endmodule • Fluxo de Dados • Todas as atribuições permanentes executam concorrentemente. • A ordem das atribuições no arquivo não importa.
a Black Box 2x1 MUX out b sel Formas de Descrição de Circuitos modulemux_2x1(inputa, b, sel, output logic out); always_comb if(sel == 1) out = a; else out = b; endmodule • Forma Comportamental • Representa o comportamentona forma de um algoritmo.
Formas de Descrição de Circuitos • Forma Comportamental • As duas principais formas de descrição comportamental são initial e always_comb. • initial: determina um bloco não sintetizável que será executado apenas uma vez no início da simulação. • always_comb: determina um bloco sintetizável que ira executar de forma repetida.
Formas de Descrição de Circuitos … initial begin Soma = 0; Carry = 0; end … … always_comb begin Soma = A ^ B; Carry = A & B; end … • Descrição Comportamental • Exemplo: initial e always_comb
Formas de Descrição de Circuitos • Decrição RTL(Register Transfer Level) • Descreve o queacontece a cadatransiçãoativa do sinal de relógio. • Exemplo: always_ff @(posedge clock) begin pisca <= ~pisca; end
Principais Tipos • Para valores inteiros, SystemVerilog possui uma boa diversidade de definições. • Os bits dos tipos abaixo podem assumir apenas valores zero ou um. • shortint: inteiro sinalizado de 16 bits. • int: inteiro sinalizado de 32 bits. • longint: inteiro sinalizado de 64 bits.
Principais Tipos • Temos ainda o tipo integer o qual seus bits podem assumir valor 1, 0, Z e X. • integer: inteiro sinalizado de 64 bits. • Os tipos podem ser forçados a serem sinalizados ou não-sinalizados. Para isso deve-se usar as palavras signed ou unsigned. intunsignedvalor; intsignedvalor;
Principais Tipos • O tipo byte representa um conjunto de oito bits que podem ser interpretados como um inteiro sinalizado ou um caractere ASCII. byte valor; byte unsignedvalor; • O tipo bit é usado basicamente na definição de vetores e pode assumir apenas valores 0 e 1.
Principais Tipos • O tipos logic também é usado na definição de vetores . Seus bits podem assumir valor 0, 1, Z e X. Por padrão os terminais de entrada e saída dos módulos possuem esse tipo. • SystemVerilog possui ainda os tipos real (64 bits) e shortreal (32 bits). Esses ainda não são sintetizáveis. real valor; shortrealvalor;
Principais Tipos • Temos também o tipo string que representa uma cadeia de caracteres. Esse tipo possui um bom conjunto de métodos definidos. Deve ser delimitado por aspas duplas e pode ter até 1024 caracteres. string nome = “String”; byte a = “A” //Atribui A para a bit [10:0] c = “41” //Atribui 000_0100_0001 a C
Trabalhando com Números • Com SystemVerilog podemos trabalhar com números decimais, hexadecimais e binários. Para tanto, devem ser declarados o tamanho em bits do número e seu tipo. 6'd33 8'hA6 8'b1000_1101 • Obs: os números podem ser explicitamente sinalizados através do uso de - ou +
Vetores de Bits • Para a definição de vetores de bits procedemos das formas apresentadas abaixo. • Vetor unidimensional logic [msb: lsb] nome_vetor; • Vetor bidimensional logic[msb: lsb] nome_vetor [minimo :máximo]; • Vetor tridimensional logic[msb:lsb] [máximo:mínimo] nome_vetor[mínimo: máximo]
Vetores de Bits • Exemplos • Abaixo é definido um vetor de oito bits. logic [7:0] vetor; • No próximo exemplo temos um vetor de 64 posições, sendo cada uma de 4 bits. logic [3:0] matriz [0:63]; • Nessa construção temos 10 entradas de matrizes 4x8. Configurando assim uma matriz tridimensional. logic[3:0] [7:0] matriz [0:10];
Vetores de Bits • O acesso aos elementos do vetor são demonstrados nos exemplos abaixo. string [4:0] vet = { “H”, ”P”, ”C”, ”I”, “n”}; vet[3] = vet[2]; logic[7:0] matriz [0:4]; matriz [0] = 8’b1010_0011; matriz [0] [7] = 1’b0; logic[3:0] [7:0] matriz [0:7]; matriz [0] = 8'b1010_0011; matriz [0][2][7] = 1'b1;
Operadores • Os operadores de SystemVerilog são parecidos com os da linguagem C. Nesta apresentação é demonstrado apenas um subconjunto dos operadores da linguagem. • Temos os seguintes operadores unários lógicos ~ : negação bit a bit ! : negação lógica + : positivo - : negativo
Operadores • Operadores lógicos binários >> : deslocamento lógico para a direita. << : deslocamento para a esquerda. == : verifica a igualdade entre os operandos. != : verifica e diferença entre dois operandos. =< : menor ou igual >= : maior ou igual. > : maior. < : menor. | ou || : ou lógico. ^ : ou exclusivo. & ou && : and lógico. ? : operador condicional <condição> ? <expressão_verdadeira> :<expressão_falsa> ;
Operadores • Operadores de atribuição = : atribuição simples += : atribuição com soma -= : atribuição com subtração *= : atribuição com multiplicação /= : atribuição com divisão %= : atribuição do resto
Operadores • Operadores Aritméticos * : multiplicação. / : divisão. %: resto da divisão. + : soma. - : subtração. • Observação: em operações lógicas o valor Z é tratado como X. • Observação: em operações aritméticas a presença de um bit Z ou X torna todo o resultado X.
Circuitos Sequenciais e Combinacionais Com SystemVerilog podemos construir circuitos sequenciais e combinacionais com o uso das construções always_ff e always_comb. always_ff é usado para criar um bloco síncrono de código. always_comb é usado para a descrição de lógica puramente combinacional.
Circuitos Sequenciais e Combinacionais • No caso da construção always_ff a definição de quais os valores irão sincronizar o bloco de código é feita através das palavras posedge e negedge. • posedge indica que a partir da subida de um determinado sinal o bloco síncrono será ativado. • negedge indica que a partir da descida de um determinado sinal o bloco síncrono será ativado.
Circuitos Sequenciais e Combinacionais • O exemplo abaixo demonstra a forma de declaração da construção always_ff always_ff @ ( posedgeclkorposedgerstornegedgeneg ) begin local para a descrição da lógica síncrona. end
Circuitos Sequenciais e Combinacionais • Para circuitos combinacionais é usado o bloco always_comb. Tal bloco será sensível à mudança de qualquer sinal nele contido. always_comb begin local para a descrição da lógica assíncrona. end
Decisões Em SystemVerilog temos basicamente duas formas de efetuar tomadas de decisões. Uma delas é feita através da construção if, else if e else. Outra forma é através do comando case.
Decisões Os comandos if podem ser encadeados e anihados. Caso exista uma cláusula else e nenhum dos testes condicionais se confirme ela será executada. • Construção if else if ( condição ) begin //Local para a inserção de comandos. end elseif( condição ) begin if ( condição ) begin //Local para a inserção de comandos. end else begin //Local para a inserção de comandos. end end else begin //Local para a inserção de comandos. end
Decisões • Construção Case • Na construção case um teste de valor é executado e de acordo com o resultado um conjunto de operações é executado. case(X) 2’b00: Y = A + B; 2’b01: Y = A – B; 2’b10: Y = A / B; default: Y = 0; endcase
a[3:0] b[3:0] y[3:0] c[3:0] d[3:0] sel[1:0] Exemplos modulemux_4bits ( input[3:0] a, b, c, d, input[1:0] sel, output logic [3:0] y); always_comb case (sel) 2’b00: y <= a; 2’b01: y <= b; 2’b10: y <= c; default: y <= d; endcase endmodule Multiplexador 4x1
Exemplos module Shift_reg4 ( input Data_in, clock, reset, output logic Data_out); logic [3:0] Data_reg; always_combData_out = Data_reg[0]; always_ff@ (negedge reset or posedge clock) begin if (reset == 0) Data_reg <= 0; else Data_reg <= {Data_in, Data_reg[3:1]}; end endmodule Registrador de deslocamento do quatro bits.
Prática O contador é trigado na subida do clock. O valor de Data_in deverá ser carregado quando load = 1. O contador conta quando counter_on = 1. Caso cont_up = 1 o contador é incrementado, Caso count_up = 0 o contador é decrementado. O reset deve ser assíncrono. Construa o contador indicado abaixo
Prática module up_down_counter ( input clk, reset, load, count_up, counter_on, input [2:0] Data_in, output logic [2:0] Count); always_ff@ (posedgereset or posedgeclk)begin if (reset) Count = 0; else if (load) Count <= Data_in; else if (counter_on) begin if (count_up) Count <= Count +1; else Count <= Count –1; end end endmodule Solução
entity sistema is port(...) end sistema; architecture estrut of sistema is signal ... component processamento port(...) component controle port(...) begin U0: controle portmap(...); U1: processamento portmap(...); end estrut; A B 4 4 L2 L1 L2 L1 Z ALU F 2 N L3 4 C Projetando um sistema digital • Estrutura: controle + processamento L3
P C W r i t e C o n d P C S o u r c e P C W r i t e A L U O p O u t p u t s I o r D A L U S r c B M e m R e a d A L U S r c A C o n t r o l M e m W r i t e R e g W r i t e M e m t o R e g O p R e g D s t I R W r i t e [ 5 – 0 ] 0 M u J u m p x I n s t r u c t i a d d r e s s [ 3 1 - 0 ] 2 I n s t r u c t i o n [ 3 1 - 2 6 ] P C 0 I n s t r u c t i o n R e a d M [ 2 5 – 2 1 ] r e g i s t e r 1 u x R e a d A I n s t r u c t i o n R e a d Z e r o 1 d a t a 1 [ 2 0 – 1 6 ] r e g i s t e r 2 A L U A L U 0 R e g i s t e r s r e s u l t I n s t r u c t i o n W r i t e M R e a d B [ 1 5 – 0 ] r e g i s t e r u I n s t r u c t i o n d a t a 2 x [ 1 5 – 1 1 ] I n s t r u c t i o n 4 W r i t e 1 r e g i s t e r d a t a 0 I n s t r u c t i o n [ 1 5 – 0 ] M u x M e m o r y 1 1 6 3 2 d a t a A L U S h i f t S i g n r e g i s t e r c o n t r o l l e f t 2 e x t e n d I n s t r u c t i o n [ 5 – 0 ] Projeto: Implementação Multi-ciclo 1 2 6 2 8 o n [ 2 5 – 0 ] S h i f t l e f t 2 P C [ 3 1 - 2 8 ] 0 M A d d r e s s u x M e m o r y 1 A L U O u t M e m D a t a 0 W r i t e M 1 d a t a u 2 x 3
A B 32 32 Z N ALU O EQ LT GT 32 S Compondo a Unidade de Processamento: ALU: Unidade Lógico-Aritmética
Compondo a Unidade de Processamento.... • Permitir que a saída da ALU seja deslocada • Registrador de deslocamento • Load e shift síncronos (descida) • Clear assíncrono • Deslocamentos (n vezes): • Esquerda • Entrada: 0 • Direita (lógico e aritmético) • Entrada: 0 ou MSB (Bit mais significativo) • Rotação (direita ou esquerda): • Entrada: LSB, MSB • Saída: MSB, LSB (Bit Menos Significativo)
Compondo a Unidade de Execução... Entrada B Entrada A Z N f ALU O eq, gt, lt ck shift Reg. desl 3 shift descrição 3 n reset 000 nada 001 Load (no shift) Saída_execução Desl. Esquerda n vezes Desl. Esquerda n vezes 010 011 Desl. Direita Lógico n vezes 100 Desl. Direita aritmético n vezes 101 Rotação direita n vezes 110 Rotação esquerda n vezes