Você está na página 1de 68

Universidade Federal do Piau

Centro de Tecnologia
Curso de Engenharia Eltrica

PROJETO DE CIRCUITOS
INTEGRADOS VLSI
SystemVerilog HDL
Lgica Sequencial

Prof. Marcos Zurita


zurita@ufpi.edu.br
www.ufpi.br/zurita

Teresina - 2013

Descrio de Lgica Sequencial


em SystemVerilog

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

SystemVerilog HDL
Atribuies Blocantes e No-Blocantes

Existem dois tipos de atribuies em Verilog:

Atribuies Blocantes (=): a atribuio completada


sem que nenhum outro cdigo Verilog possa ser
executado, isto , a atribuio = bloqueia a execuo
do restante do cdigo Verilog.
Atribuies Blocantes

always @(posedge clk)


begin
a = D; // o valor de D atribudo a a.
b = a; // b copia o valor atualizado de a, isto , D.
c = b; // c copia o valor atualizado de b, isto , D.
end

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

SystemVerilog HDL
Atribuies Blocantes e No-Blocantes

Atribuies No-Blocantes (<=): todas as expresses


do lado direito so avaliadas e s so realizadas ao final
do bloco always.
Atribuies No-Blocantes

always
begin
a <=
b <=
c <=
end

@(posedge clk)
D; // o valor de D atribudo a a.
a; // b copia o valor anterior de a.
b; // c copia o valor anterior de b.

A diferena entre os dois tipos de atribuio implica que


a ferramenta de sntese deva trata-las de forma distinta
no momento de inferir a lgica descrita pelo cdigo.
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

SystemVerilog HDL
Atribuies Blocantes
always @(posedge clk)
begin
q1 = d;
q2 = q1;
end

DFF

sntese

sntese

clk

q1 wire q2

CLK

A primeira atribuio blocante (q1=d) disparada na borda


de subida do clock, o que implica na sntese de um FF.
Como esta uma atribuio blocante, a atribuio
assumida como finalizada antes da prxima atribuio.
Com isso, o q1 na segunda atribuio (q2=q1) o q1 aps
alterao causada pela borda de subida do clock, ou seja, q2
apenas copia o valor de q1, logo:
q2=q1 pode ser sintetizada apenas como um fio.
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

SystemVerilog HDL
Atribuies No-Blocantes
always @(posedge clk)
begin
q1 <= d;
q2 <= q1;
end

sntese
sntese

DFF
d
clk

Q
CLK

q1
clk

DFF
D

q2

CLK

Neste caso, os valores iniciais de d e q1 so os valores no


momento em que o bloco disparado pela borda de subida
do clock.
Da mesma forma, os valores do lado direito de todas as
atribuies no-blocantes so avaliadas antes que qualquer
atribuio ao lado esquerdo seja feita.
Isto implica na inferncia de um FF para cada uma dessas
atribuies.
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

SystemVerilog HDL
Controle Temporal: Atraso

Em Verilog existem dois tipos de controle temporal:

Controle de atraso
Controle de eventos

O controle de atraso especifica o tempo necessrio a ser


aguardado para que a instruo seguinte seja realizada.
Sintaxe:
#(min:tip:max)
Na qual, min, tip e max so os valores mnimo, tpico e
mximo de tempo do atraso.
Exemplo

#10 a = 8;
// atribuir 8 a aps 10 unidades de tempo
#(3:5:7) b = 12; // atribuir 12 b aps no mnimo 3 e no mximo 7
// unidades de tempo, mas preferencialmente em 5.
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

SystemVerilog HDL
Controle Temporal: Eventos

O controle de eventos especifica que evento deve


ocorrer para que a instruo seguinte seja realizada.
Sintaxe:
@(evento)

Na qual, o parmetro, evento pode ser:

Um evento nomeado;
A mudana do valor de alguma porta, n ou varivel;
A transio de subida ou descida de alguma porta, n ou
varivel (posedge e negedge);
Dois ou mais eventos acima (separados por or).

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

SystemVerilog HDL
Exemplo do controle de eventos:
Controle de Eventos: Exemplo
@ready a = a +1;

// 'a' ser incrementado quando o valor de


// 'ready' mudar

@(posedge clk) q = d;

// 'q' ser igual a 'd' quando 'clk' subir

@(a or b or c or d)
// um novo valor ser associado 'y' cada
y = (a | b) & (~c ^ d); // vez que ocorrer uma mudana em 'a' ou
// em 'b' ou em'c' ou em 'd'
event e;

// declarao do evento 'e'

initial begin
#10;
-> e;
end

// aguarda 10 unidades de tempo


// e dispara o evento 'e'

always @e d = 0;

// zera 'd' cada vez que o evento 'e' for


// disparado

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

SystemVerilog HDL
Declaraes de Bloco Procedimental always
Em SystemVerilog existem 4 declaraes de
bloco procedimental da famlia always:

always (herdada do Verilog)


always_comb (apenas em SV)
always_latch (apenas em SV)
always_ff (apenas em SV)

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

10

SystemVerilog HDL
A Declarao always

Comporta-se de um lao infinito que realiza a instruo


(ou bloco de instrues) associada repetidamente.
Sintaxe:
always @(lista_de_sensibilidade) bloco_instrues

Na qual a lista_de_sensibilidade uma relao


de eventos de controle temporal para os quais a instruo/bloco de instrues associada deve ser reavaliada.
Na sntese, pode dar origem circuitos combinacionais
(portas + fios) ou sequenciais (portas + fios + FFs):

A deciso feita automaticamente pela ferramenta de


sntese (por inferncia), com base na anlise da lista de
sensibilidade e do bloco de instrues.
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

11

SystemVerilog HDL

Sadas no definidas explicitamente para possveis


combinaes de entrada (o que ocorre, por exemplo,
quando um else ou um default so omitidos) iro
produzir latches (!).

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

12

SystemVerilog HDL
A Declarao always_comb

Comporta-se como a declarao always, exceto por:


Explicitar para a ferramenta de sntese que o projetista
deseja que o bloco procedimental sintetize um circuito
lgico puramente combinacional (sem latches ou FFs).
No necessitar de uma lista de sensibilidade: a lista
inferida automaticamente pela ferramenta.
Sintaxe:
always_comb instruo_ou_bloco_de_instrues

Assim como always, gera latches para sadas


dependentes de combinaes parcialmente definidas de
sinais de entrada, porm, nestes casos gera um warning
na sntese, permitindo ao projetista corrigir o erro.
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

13

SystemVerilog HDL

Nos exemplos abaixo, ambos os cdigos iro gerar um


latch para 'y', devido no especificao da sada para
o caso em que en=0.
always: Exemplo 1

always_comb: Exemplo 1

module bestinhaV(
input logic a, en,
output logic y);

module bestinhaSV(
input logic a, en,
output logic y);

always @(a, en)


if (en) y = a;
endmodule

always_comb
if (en) y = a;
endmodule

Apenas no segundo exemplo, um warning gerado.

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

14

SystemVerilog HDL

Se o latch no intencional, o cdigo pode ser


corrigindo conforme mostrado no Exemplo 2.
Se o latch intencional, o cdigo pode ser corrigindo
conforme mostrado no Exemplo 3.
always_comb: Exemplo 2

always_comb: Exemplo 3

module bestinhaV(
input logic a, en,
output logic y);

module bestinhaSV(
input logic a, en,
output logic y);

always_comb
if (en) y = a;
else y = 0
endmodule

always_latch
if (en) y = a;
endmodule

A declarao always_latch explicita que a inteno


do projetista modelar um circuito baseado em latches.
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

15

SystemVerilog HDL
Mquina de Estados
Maquina de Estados: Exemplo 1 Semforo 3 Tempos
module traffic_light(output logic[2:0] lights,
input logic
clk, resetN);
enum {GREEN, YELLOW, RED} state, nextState;
always @(posedge clk, negedge resetN)
if (!resetN) state <= RED;
else state <= nextState;
always_comb begin
case (state)
GREEN: begin lights = 3'b001; nextState = YELLOW; end
YELLOW: begin lights = 3'b010; nextState = RED;
end
RED:
begin lights = 3'b100; nextState = GREEN; end
endcase
end
endmodule

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

16

SystemVerilog HDL
Examinando o Circuito Sintetizado
Aps codificar o projeto
anterior no Quartus-II,
sintetize-o: Processing->
Start->Start Analysis &
Synthesis (ou use o
cone correspondente).
Na janela Tasks invoque
RTL Viewer e examine o
diagrama gerado.
Na janela Tasks invoque
State Machine Viewer e
examine a mquina de
estados inferida.
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

17

SystemVerilog HDL

Diagrama RTL: Circuito Sintetizado

State[31..2]: 29 Flip-flops D inteis (!!)

Mquina de Estados: No inferida corretamente.


Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

18

SystemVerilog HDL
Corrigindo a Mquina de Estados
Maquina de Estados: Exemplo 2 Semforo 3 Tempos
module traffic_light2(output logic[2:0] lights,
input logic
clock, resetN);
// nmero de bits da enumerao especificado usando 'bit[]'
// para evitar a inferncia padro de 32 bits!
enum bit[1:0] {GREEN, YELLOW, RED} state, nextState;
always @(posedge clk, negedge resetN)
if (!resetN) state <= RED;
else state <= nextState;
always_comb begin
case (state)
GREEN:
begin
YELLOW: begin
RED:
begin
default: begin
endcase
end
endmodule

lights
lights
lights
lights

=
=
=
=

3'b001;
3'b010;
3'b100;
3'b100;

nextState
nextState
nextState
nextState

=
=
=
=

YELLOW;
RED;
GREEN;
GREEN;

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

end
end
end
end

19

SystemVerilog HDL

Repita os passos para visualizar o diagrama RTL e a


mquina de estados do novo projeto:
Diagrama RTL:

Mquina de Estados:

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

20

SystemVerilog HDL

Na janela Tasks invoque Technology Map Viewer e


examine o diagrama do circuito inferido.

Um duplo clique nas clulas lgicas permite visualizar


seus contedos.

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

21

SystemVerilog HDL
A Declarao always_ff

Comporta-se como a declarao always, exceto por:


Explicitar para a ferramenta de sntese que o projetista
deseja que o bloco procedimental sintetize um circuito
lgico sequencial (contendo FFs);
Depender de uma lista de sensibilidade contendo apenas
eventos sensveis transio (posedge e/ou negedge);
Permitir apenas atribuies no-blocantes (<=).
Sintaxe:

always_ff @(lista_sensibilidade) bloco_instrues


Exemplo
always_ff @(posedge clk, negedge rst) begin
if (!rst) counter <= 0;
// reset assncrono de 'counter'
else counter <= counter + 1; // incrementa a cada transio
// de subida do clock.
end
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

22

SystemVerilog HDL
Mquina de Estados Com always_ff
Maquina de Estados: Exemplo 3 Semforo 3 Tempos
module traffic_light3(output logic[2:0] lights,
input logic
clock, resetN);
// nmero de bits da enumerao especificado usando 'bit[]'
// para evitar a inferncia padro de 32 bits!
enum bit[1:0] {GREEN, YELLOW, RED} state, nextState;
always_ff @(posedge clk, negedge resetN)
if (!resetN) state <= RED;
else state <= nextState;
always_comb begin
case (state)
GREEN:
begin
YELLOW: begin
RED:
begin
default: begin
endcase
end
endmodule

lights
lights
lights
lights

=
=
=
=

3'b001;
3'b010;
3'b100;
3'b100;

nextState
nextState
nextState
nextState

=
=
=
=

YELLOW;
RED;
GREEN;
GREEN;

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

end
end
end
end

23

SystemVerilog HDL

Uma caracterstica importante das declaraes


always_comb, always_latch e always_ff que
elas no permitem que um sinal/varivel seja alterada
por mais de um bloco procedimental.
Exemplo de Erro: Verilog
module contador4bitsErradoV(
input
clk, rst,
output reg[3:0] cnt);
always @(rst)
if (rst) cnt = 0;
always @(posedge clk)
cnt <= cnt + 1;
endmodule

Exemplo de Erro: SV
module contador4bitsErradoSV(
input logic
clk, rst,
output logic[3:0] cnt);
always_comb
if (rst) cnt = 0;
always_ff @(posedge clk)
cnt <= cnt + 1;
endmodule

Ambos exemplos iro gerar erro na sntese mas no 2


exemplo (SV) h um erro formal ainda na pr-sntese.
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

24

SystemVerilog HDL
Enumeraes (enum)

Uma enumerao uma lista de constantes inteiras.


Sintaxe:
enum tipo_base {id1=v1, id2=v2, idN=vN} var_destino;

O tipo_base e valor de cada identificador so opcionais.


Se o tipo_base for omitido, assumido o tipo inteiro 32 bits;
Por padro, o primeiro identificador tem valor zero, e valor de
cada identificador subsequente igual ao valor do identificador
anterior + 1.
Exemplo
enum {RESET, SOLVE, WAIT_CMD, GET_CMD} state;
// enum de 32 bits
enum logic[1:0] {GREEN, YELLOW, RED, BLUE} color; // enum de 2 bits
enum bit[2:0] {RECEIVE=3'd1, TRANSMIT=3'd5, WAIT_ACK=3'd7} communic;
//...
state = RESET;
color = BLUE;
communic = WAIT_ACK;
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

25

SystemVerilog HDL
Projeto de Mquinas de Estado em SV

Deve conter dois blocos always:


Um sequencial (always_ff) responsvel por inicializar a
mquina e lev-la ao estado seguinte;
Um combinacional (always_comb ou always_latch)
responsvel por gerar as sadas correspondentes s
entradas para o estado atual da mquina e definir qual
deve ser o estado seguinte.
Mltiplas mquinas de estados num mesmo mdulo podem
compartilhar o bloco sequencial.
Os estados de cada mquina devem, preferencialmente, ser
rotulados por enumeraes com identificadores inteligveis.
O bloco combinacional deve, preferencialmente, ser
implementado por uma estrutura do tipo case.

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

26

SystemVerilog HDL
Temporizao Baseada no Clock
Maquina de Estados: Exemplo 4 Temporizao
module timerClk(output logic[1:0] triggerT,
input logic clk100Hz, resetN);
enum bit[1:0] {START, T_1_S, T_2_S} state, nextState;
logic[7:0]
cnt;
always_ff @(posedge clk100Hz, negedge resetN)
if (!resetN) begin cnt <= 0; state <= START;
else begin
cnt <= (cnt==8'd250) ? 8'd0 : cnt + 1'd1;
state <= nextState;
end
always_comb begin
case (state)
START: nextState = (cnt==8'd100) ? T_1_S :
T_1_S: nextState = (cnt==8'd200) ? T_2_S :
T_2_S: nextState = (cnt==8'd250) ? START :
default: nextState = START;
endcase
triggerT = state;
end
endmodule

end

START;
T_1_S;
T_2_S;

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

27

SystemVerilog HDL
Temporizao Baseada no Clock
Maquina de Estados: Exemplo 4 Temporizao
module timerClk(output logic[1:0] triggerT,
input logic clk100Hz, resetN);
enum bit[1:0] {START, T_1_S, T_2_S} state, nextState;
logic[7:0]
cnt;
always_ff @(posedge clk100Hz, negedge resetN)
if (!resetN) begin cnt <= 0; state <= START;
else begin
cnt <= (cnt==8'd250) ? 8'd0 : cnt + 1'd1;
state <= nextState;
end
always_comb begin
case (state)
START: nextState = (cnt==8'd100) ? T_1_S :
T_1_S: nextState = (cnt==8'd200) ? T_2_S :
T_2_S: nextState = (cnt==8'd250) ? START :
default: nextState = START;
endcase
triggerT = state;
end
endmodule

end

START;
T_1_S;
T_2_S;

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

28

SystemVerilog HDL
Projeto em Sala: Semforo Disparado Por Pedestre

Projete em SV o sistema de controle de um semforo


disparado por pedestre cuja mquina de estados
representada abaixo, para um clock de entrada de 1kHz:
incio

rst= 0
key= 0->1

GREEN

KEY_ON
key= 1->0

10 s

KEY_OFF

RED

5s

YELLOW

15 s

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

29

SystemVerilog HDL
Projeto em Sala: Detector de Sequncia

Projete um sistema de capaz de detectar dois bits 1 ou 0


seguidos em uma transmisso serial. Admita que o
clock possui a mesma frequncia e fase do sinal serial.
reset

out_bit = 0

reset_state
0

1
1

out_bit = 0 read_1_zero

read_1_one

out_bit = 0

0
0

read_2_zero

read_2_one

out_bit = 1

out_bit = 1

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

30

SystemVerilog HDL
Registradores de Deslocamento

Registradores de deslocamento podem ser implementados pensando em como os FFs se conectam:


Exemplo
module shifReg(input logic shift_in, clk, reset,
output logic reg_a, reg_b, reg_c, reg_d);
always_ff @ (posedge clk) begin
if (reset) begin
reg_a <= 0; reg_b <= 0; reg_c <= 0; reg_d <= 0;
end
else begin
reg_a <= shift_in;
reg_b <= reg_a;
reg_c <= reg_b;
reg_d <= reg_c;
end
end
endmodule

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

31

SystemVerilog HDL
Registradores de Deslocamento

Registradores de deslocamento podem ser implementados usando concatenao:


Exemplo
module shifReg(input logic data_in, clk, reset,
output logic data_out);
logic[3:0] data_reg;
always_comb data_out = data_reg[0];
always_ff @(posedge clk, negedge reset) begin
if (~reset) data_reg <= 0;
else data_reg <= {data_in, data_reg[3:1]};
end
endmodule

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

32

SystemVerilog HDL
Laos de Repetio: for
Sintaxe
for (atribuio_inicial; expresso; atribuio_de_passo)
declarao_ou_grupo_de_declaraes;

Executa a atribuio_inicial uma vez, no incio do


lao.
Executa a declarao_ou_grupo_de_declaraes
enquanto a expresso for verdadeira.
Executa a atribuio_de_passo ao final de cada
passo completo do lao.

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

33

SystemVerilog HDL
Laos de Repetio: while
Sintaxe
while (expresso)
declarao_ou_grupo_de_declaraes;

Executa a declarao_ou_grupo_de_declaraes
enquanto a expresso for verdadeira.
A expresso avaliada no incio de cada passo do
lao, ou seja, se ela for falsa no incio a declarao_
ou_grupo_de_declaraes no sero executadas
nenhuma vez.

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

34

SystemVerilog HDL
Laos de Repetio: repeat
Sintaxe
repeat (nmero)
declarao_ou_grupo_de_declaraes;

Executa a declarao_ou_grupo_de_declaraes
enquanto tantas vezes quanto o nmero informado,
O nmero pode tambm ser uma expresso, neste
caso ele ser avaliado no incio do primeiro lao.

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

35

SystemVerilog HDL
Laos de Repetio: forever
Sintaxe
forever
declarao_ou_grupo_de_declaraes;

Executa a declarao_ou_grupo_de_declaraes
continuamente.

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

36

SystemVerilog HDL
Laos de Repetio: disable
Sintaxe
disable nome_do_grupo;

No se trata de um lao de repetio mas de uma


declarao capaz de interromper a execuo de um lao
de repetio cujo grupo de declaraes foi nomeado
como nome_do_grupo.

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

37

SystemVerilog HDL
Laos de Repetio: foreach
Sintaxe
foreach (nome_do_arranjo[variveis_do_lao])
declarao_ou_grupo_de_declaraes;

Trata-se de um lao, no sintetizvel, dedicado


iterao dos elementos de um arranjo (matriz ou vetor);
O nmero de iteraes do lao determinado
automaticamente pelas dimenses do arranjo.
Exemplo
string words [2] = { "Ol ", "mame!" };
int sum [1:8][1:3];
foreach (words[j]) $display(j, words[j]);
foreach (sum[i,j]) sum[i][j] = i+j;
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

38

SystemVerilog HDL
Exemplo do Uso de Laos de Repetio
Laos de Repetio: Exemplo
always @(posedge clk) begin
casez (opcode) //casez trata bits 'Z' como don't care
3'b1??: alu_out = accum; // ? em um integer literal equivale a Z
3'b000: while (bloc_xfer) // repete at que seja falso
repeat(5) @(posedge clk) begin // repete por 5 clocks
RAM[address] = data_bus;
address = address + 1;
end
3'b011: begin : load // 'load' o nome do groupo de instrues
integer i; // varivel local
for (i=0; i<=255; i=i+1)
@(negedge clk) data_bus = RAM[i];
end
default:$display(Opcode ilegal no mdulo %m);// no sintetizvel
endcase
end

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

39

SystemVerilog HDL
A Declarao Generate

Produzem hardware de tamanho varivel, de acordo com o


valor de um parmetro.
A declarao generate comporta laos de repetio for
e declaraes if para determinar quantos e quais tipos de
hardware devem ser gerados.
Laos for contidos na declarao devem ser rotulados.
Trata-se de uma declarao interna um mdulo.
Sintaxe
genvar i; // varivel de indexao para o 'generate'
generate
for (i...; i...; i...) begin : nome_do_loop
// cdigo descritor de hardware
end
endgenerate

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

40

SystemVerilog HDL
Exemplo do Uso de Generate
Porta AND de N entradas a partir de portas AND de 2
entradas ligadas em cascata.
Generate: Exemplo
module andN #(parameter width = 8)
(input logic [width-1:0] a,
output logic y);
logic [width-1:1] x;
genvar i;
generate
for (i=1; i < width; i=i+1) begin:laco_for
always_comb
if (i == 1)
x[1] = a[0] & a[1];
else
x[i] = a[i] & x[i-1];
end
endgenerate
always_comb y = x[width-1];
endmodule
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

41

SystemVerilog HDL
Memrias em SystemVerilog

possvel sintetizar memrias sncronas e assncronas,


de acesso simples, ou mesmo memrias complexas
como memrias de mltiplo acesso, escrita em linha e
leitura em coluna, etc.
Em Verilog/SV, memrias ROM e RAM (de qualquer
nvel de complexidade) podem ser automaticamente
inferidas pela ferramenta de sntese quando
corretamente descritas.

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

42

SystemVerilog HDL
Memria Apenas de Leitura (ROM)

Identificadas pela ferramenta de sntese por ter um vetor


enderevel que escrito estaticamente e apenas lido
dinamicamente.
Ex. 1: Memria ROM assncrona, de 8x256 bits, com
portas de dados e endereos comuns leitura e escrita.
Memria ROM Assncrona: Exemplo 1
module ROM(output logic [7:0] data,
input logic [1:0] address);
// vetor escrito estaticamente (em tempo de sntese)
logic [0:3][7:0] rom = {8'b11100111,
8'b11000011,
8'b10000001,
8'b00011000};
always_comb
data = rom[address]; // o vetor lido dinamicamente
endmodule

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

43

SystemVerilog HDL

Ex. 2: Memria ROM Sncrona de 7x16 bits


Memria ROM Sncrona: Exemplo 1
module sevenseg_rom(output
input
input
logic [0:15][6:0] rom =

tri
[6:0] data,
logic [3:0] address,
logic
oe, clk);
{7'b1110111, // 0
7'b0010010, // 1
7'b1011101, // 2
7'b1011011, // 3
7'b0111010, // 4
7'b1101011, // 5
7'b1101111, // 6
7'b1010010, // 7
7'b1111111, // 8
7'b1111011, // 9
7'b1101101, // A
7'b1101101, // B
7'b1101101, // C
7'b1101101, // D
7'b1101101, // E
7'b1101101}; // F

always_ff @(posedge clk)


data <= (oe) ? rom[address] : 7'bzzzzzzz;
endmodule
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

44

SystemVerilog HDL
Memrias de Acesso Aleatrio (RAM)

Identificadas pela ferramenta de sntese por ter um vetor


enderevel que lido e escrito dinamicamente.
Ex. 1: Memria RAM assncrona, de 8x256 bits, com
portas de dados e endereos comuns leitura e escrita.
Memria RAM Assncrona: Exemplo 1
module RAM (input logic [7:0] addr,
inout wire [7:0] data,
input logic
RWn);
var bit [7:0] mem[0:255];
always_comb
data = (RWn) ? mem[addr] : 8'bzzzzzzzz;
always_latch
if (~RWn) mem[addr] <= data;
endmodule

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

45

SystemVerilog HDL

Soluo RTL ao Ex. 1:

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

46

SystemVerilog HDL

Uma especial ateno ao cdigo do exemplo anterior se


deve ao uso de always_comb e always_latch para
especificao comportamental dos acessos de leitura e
de escrita, respectivamente.

Isto permite evitar a inferncia desnecessria de


componentes mantendo o cdigo conciso.

Ex. 2: Memria idntica do Ex. 1, descrita em Verilog:


Memria RAM Assncrona: Exemplo 2 (Verilog)
module RAM (input wire[7:0] addr,
inout wire[7:0] data,
input wire
RWn);
var bit [7:0] mem[0:255];
always @*
if (RWn)
data = mem[addr];
else
mem[addr] = data;
endmodule

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

47

SystemVerilog HDL

Soluo RTL ao Ex. 2:

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

48

SystemVerilog HDL

Ex. 3: Memria RAM assncrona com portas de dados e


endereos comuns leitura e escrita, linhas de
habilitao da memria (csN) e da sada (oeN).
Memria RAM Assncrona: Exemplo 3
module RAM16x8(inout wire [7:0] data,
input logic [3:0] address,
input logic
csN, weN, oeN);
var bit [7:0] mem [0:15];
always_comb
data = (~csN & ~oeN) ? mem[address] : 'z;
always_latch
if (~csN & ~weN & oeN)
mem[address] <= data;
endmodule

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

49

SystemVerilog HDL

Ex. 4: Memria RAM sncrona, de tamanho parametrizvel, com porta de endereos comum leitura e escrita e
portas de dados separadas.
Memria RAM Sncrona: Exemplo 4
module syncRAM #(parameter M=4, N=8)(output
input
input
input

logic [N-1:0] dataOut,


logic [N-1:0] address,
logic [N-1:0] dataIn,
logic
we, clk);

// mesmo que: logic [N-1:0] mem [0:(2**M)-1];


logic [N-1:0] mem [0:(1 << M)-1];
always_comb
dataOut = mem[address];
always_ff @(posedge clk)
if (~we)
mem[address] <= dataIn;
endmodule
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

50

SystemVerilog HDL
Projeto em Sala: Cronmetro com Memria

Usando a sevenseg_rom, memorize nos 100 primeiros


endereos de uma memria RAM 100x14 os valores
correspondentes aos dgitos 00 99;
em seguida, leia um endereo consecutivo da RAM a cada
segundo (a partir do endereo 0) e externe seu contedo na
sada, de modo que, se conectada displays de sete
segmentos, exibam o tempo decorrido em segundos.
ROM

reset

RAM

Control

clock
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

display[0]
display[1]
51

SystemVerilog HDL
Sub-rotinas em SystemVerilog: task

Uma task deve ser declarada dentro de um module.


pode ser chamada dentro de um bloco procedimental do tipo
always, de um initial ou de outra task.
Pode conter parmetros, argumentos de entrada/sada,
registros e eventos mas no a declarao de ns.
Pode conter declaraes comportamentais (case, if, etc.).
Exemplo
task add4bit(output logic [4:0] y,
input logic [3:0] a, b);
y = (a && b) ? a + b : 0;
endtask
always_comb
if (p1 == p2) s <= 15;
else add(s, p1, p2); // uso da task
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

52

SystemVerilog HDL
Funes em SystemVerilog: function

Uma function deve ser declarada dentro de um module.


Pode ser chamada em qualquer lugar.
Deve conter ao menos um argumento de entrada;
Retorna o valor associado ao seu nome;
Pode conter declaraes comportamentais (case, if, etc.).
No pode conter atribuies no-blocantes (<=).
Exemplo
function automatic [63:0] fatorial(input logic [31:0] n);
if (n <= 1) fatorial = 1;
else
fatorial = n * fatorial(n-1);
// obs: o uso de recursividade no sintetizvel
endfunction
always_comb
if (fatorial(a) > LIMITE) s <= 64'dz;
else s <= fatorial(a); // uso da function
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

53

SystemVerilog HDL
O Modificador automatic

Pode ser empregado tanto com tasks quanto com


functions;
Gera memria dedicada para cada chamada individual
da funo;
Obrigatrio em construes recursivas (no
sintetizveis).

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

54

SystemVerilog HDL
Interfaces em Verilog

A forma mais direta e intuitiva de conectar blocos de um


sistema conect-los porta porta.
Considere o sistema abaixo:

CPU

Memory

main_bus

IO_Ports

A
B

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

55

SystemVerilog HDL

Portas de cada mdulo do sistema:


CPU
module cpu (
inout wire
output reg
output reg
output wire
output wire
output wire
input wire
input wire
output reg
output reg
input wire
input wire

[15:0] data,
[15:0] address,
bus_grant,
bus_rwN,
mem_rwN,
mem_en,
bus_request,
data_ready,
[ 7:0] instruction,
[13:0] cpu_flags,
clock,
resetN);

Memory
module memory (
inout wire [15:0]
input wire [15:0]
output wire
input wire
input wire

data,
address,
data_ready,
mem_en,
mem_rwN);

//... cdigo de implementao


endmodule

IO_Ports

module io_ports (
inout wire [15:0] data,
input wire [15:0] address,
//... cdigo de implementao
output wire
data_ready,
endmodule
input wire
bus_rwN,
inout wire [7:0] a_port,
inout wire [7:0] b_port,
input wire
clock,
conexes comuns ao
input wire
resetN);
//... cdigo de implementao
barramento 'main_bus'
endmodule
56
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

SystemVerilog HDL

A conexo dos sinais porta porta pode se tornar


trabalhosa e conduzir a erros em sistemas mais
complexos;
As declaraes das portas de conexo ao barramento
precisam ser duplicadas em cada mdulo conectado;
Conectar todos os sinais de um barramento a cada
mdulo uma tarefa repetitiva e ineficiente;
Uma alterao na especificao dos sinais do
barramento pode requerer a alterao de vrios mdulos
a ele conectados.
A fim de reduzir tais inconvenientes, a linguagem
SystemVerilog introduziu uma nova declarao, a
interface.
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

57

SystemVerilog HDL
Interfaces em SystemVerilog: interface

Uma interface permite reunir um conjunto de sinais e


trat-los como fossem uma nica porta.
No exemplo anterior, os sinais/portas comuns ao barramento main_bus poderiam ser reunidos numa interface:
Interface main_bus
interface main_bus;
wire [15:0] data;
wire [15:0] address;
logic
bus_grant;
logic
bus_rwN;
logic
mem_rwN;
logic
mem_en;
logic
bus_request;
logic
data_ready;
endinterface

Obs.: numa interface as direes dos sinais (input,


output ou inout) devem ser omitidas.
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

58

SystemVerilog HDL

Uma vez definida a interface main_bus, os mdulos do


sistema passam a referenci-la como se fosse uma
porta:
CPU
module cpu (
main_bus
output reg [ 7:0]
output reg [13:0]
input wire
input wire

Memory
bus,
instruction,
cpu_flags,
clock,
resetN);

//... cdigo de implementao


endmodule

conexes ao barramento
'main_bus' via interface

module memory (main_bus bus);


//... cdigo de implementao
endmodule

IO_Ports
module io_ports (
main_bus
bus,
inout wire [7:0] a_port,
inout wire [7:0] b_port,
input wire
clock,
input wire
resetN);
//... cdigo de implementao
endmodule

O uso de interfaces torna o cdigo notavelmente mais


conciso e claro.
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

59

SystemVerilog HDL
Empacotando Sinais Externos Interface

Sintaticamente a interface muito semelhante


definio module, podendo tambm conter portas.
Isto permite que sinais externos interface, como o
clock ou a linha de reset possam ser agregados a ela:
Interface main_bus
interface main_bus(input logic clock,
input logic resetN);
wire [15:0] data;
wire [15:0] address;
logic
bus_grant;
logic
bus_rwN;
logic
mem_rwN;
logic
mem_en;
logic
bus_request;
logic
data_ready;
endinterface

Interconexes
module top(input logic clk,
input logic rstN);
logic [7:0] inst;
logic [13:0] flags;

//instanciando 'main_bus'
main_bus bus(.clock(clk),
.resetN(rstN));
//instanciando 'cpu'
cpu cpu1 (.bus(bus),
.instruction(inst),
.cpu_flags(flags));
'clock' e 'resetN' conectados implicita//... restante do cdigo
mente pela interface 'main_bus'.
endmodule
60
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

SystemVerilog HDL
Referenciando Sinais Internos Uma Interface

Um mdulo que possui uma porta do tipo interface pode


referenciar os sinais internos interface (ou agregados)
usando a sintaxe:
<nome_da_porta>.<nome_do_sinal_interno__interface>

Exemplo:
IO_Ports
module io_ports (main_bus
bus,
inout wire [7:0] a_port,
inout wire [7:0] b_port);
always_ff @(posedge bus.clock) begin
if (bus.resetN) a_port <= 8'bzzzzzzzz;
else
if (bus.address == 16'hFFF0)
if (bus.bus_rwN) bus.data[7:0] <= a_port;
else
a_port <= bus.data[7:0];
//... restante do cdigo
end
endmodule
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

61

SystemVerilog HDL
Interface Modports

Permite definir pontos de vista de uma interface.


Interface main_bus
interface main_bus(input logic clock,
input logic resetN);
wire [15:0] data;
wire [15:0] address;
logic
bus_grant;
logic
bus_rwN;
logic
mem_rwN;
logic
mem_en;
logic
bus_request;
logic
data_ready;
modport master(inout
output
output
output
output
output
input
input

data,
address,
bus_grant,
bus_rwN,
mem_rwN,
mem_en,
bus_request,
data_ready);

modport ports(inout
input
input
input
input
endinterface

data,
address,
bus_rwN,
clock,
resetN);

Interconexes
//instanciando 'cpu'
cpu cpu1 (.bus(bus.master),
.instruction(inst),
.cpu_flags(flags));
//instanciando 'io_ports'
io_ports io1 (.bus(bus.ports),
.a_port(A),
.b_port(B));

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

62

SystemVerilog HDL

Entretanto, as interfaces em SystemVerilog so bem


mais do que um simples conjunto de fios.
Uma definio mais abrangente da declarao
interface que ela permite encapsular toda a
comunicao entre os blocos de um sistema.
Uma especificao interface pode conter:
Os sinais e portas de comunicao que
interconectam os blocos;
Parmetros, constantes, variveis, funes e tasks.
A implementao dos protocolos de comunicao.

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

63

SystemVerilog HDL
A Declarao package

Em Verilog, construes de usurio tais como tipos,


constantes ou funes, so locais ao mdulo que as
contm;
Uma construo que utilizada em vrios mdulos
precisa ser redeclarada em cada um deles, o que
ineficiente e propenso a erros;
Uma soluo alternativa declarar as construes a
serem compartilhadas numa biblioteca e inclu-la em
todos os mdulos que comungam das construes,
entretanto isto tambm propenso a erros.

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

64

SystemVerilog HDL
A Declarao package

Um package permite que diversos mdulos possam


compartilhar construes definidas pelo usurio, tais
como:

Parmetros (param, localparam);


Constantes (const);
Tipos (typedef)
Funes e tarefas (function, task);
Declaraes importadas de outros mdulos (import).

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

65

SystemVerilog HDL
Exemplo de package
package definitions;
parameter VERSION = "1.1";
typedef enum {ADD, SUB, MUL} opcodes_t;
typedef struct {logic [31:0] a, b;
opcodes_t
opcode;
} instruction_t;
function automatic [31:0] multiplier (input [31:0] a, b);
return a * b; // implementao sem deteco de erro
endfunction
endpackage

Usando o package
module ALU (input definitions::instruction_t IW,
input logic
clock,
output logic [31:0] result);
always_ff @(posedge clock) begin
case (IW.opcode)
definitions::ADD : result = IW.a + IW.b;
definitions::SUB : result = IW.a - IW.b;
definitions::MUL : result = definitions::multiplier(IW.a, IW.b);
endcase
end
endmodule

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

66

incompleto...

Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

67

Bibliografia

S. Sutherland, S. Davidmann, P. Flake,


SystemVerilog for Design, 2nd Ed., Springer,
2006.
Peter J. Ashenden, Digital Design: An Embedded
Systems Approach Using Verilog, Elsevier, 2008.
Seetharaman Ramachandran, Digital VLSI
Systems Design, Springer, 2007.
R.B. Reese, M.A. Thornton, Introduction to Logic
Synthesis Using Verilog HDL, M&C, 2006.
Karim, M.A., Chen, X., Projeto Digital: Conceitos e
Princpios Bsicos, LTC, 2009.
Elmar Melcher, SystemC para Verificao
Funcional, 2003.
IEEE Std 1364-2001: Standard Verilog HDL, 2001.
Projeto de Circuitos Integrados VLSI Prof. Marcos Zurita

68