a linguagem verilog ii
TRANSCRIPT
-
DESCRIO VERILOG NVEL RTL
ASD 2010 - Prof. Marcos Morais
-
DESCREVENDO HARDWARE COM SOFTWARE
Hardware is called hardware because its hard
The Art of Electronics, Horowitz and Hill, 1980
-
NVEL RTL
A descrio em RTL (Register TransferLevel, nvel de transferncia de registradores) indica como e quando o contedo de registradores so transformados e armazenados em outros registradores (ou os mesmos de origem).
Utilizado para descrever lgica seqencial e lgica combinacional
Na lgica combinacional os registradores so temporrios e desaparecem no resultado final
-
Sentenas procedurais e lgica
LGICA COMBINACIONAL EM RTL
-
REVISANDO DESCRIO COM ASSIGN Descreva o circuito abaixo em verilog
usando assign:
module mux2to1 (f, a, b, sel);output f;input a, b, sel;
assign f = s ? a : b;
endmodule
-
BLOCOS ALWAYS
Para sntese, descrevem partes de hardware que existem, esto disponveis:
module mux2to1 (f, a, b, sel);output f;input a, b, sel;reg f;always @(a or b or sel)
f= s ? a : b;endmodule
Lista de sensibilidadecontm sinais cuja mudana faz o bloco executar
-
SENTENAS PROCEDURAIS
Podemos utilizar sentenas procedurais com estilo de linguagem de alto nvel (HLL) para implementar lgica. Considere o exemplo:
Descreva esta funo em palavras (comandos). Dica: if
-
IF...
if (sel == 1) f = a;
elsef = b;
-
MULTIPLEXADOR COM ALWAYSmodule mux(f, a, b, sel); output f; input a, b, sel;reg f;always @(a or b or sel)
if (sel) f = a;else f = b;
endmodule
Mdulos podem conter umou mais blocos always
Lista de sensibilidadecontm sinais cuja mudana faz o bloco executar
-
module mux(f, a, b, sel); output f; input a, b, sel;reg f;always @(a or b or sel)
if (sel) f = a;else f = b;
endmodule
Um reg se comporta como memria: mantm o seu valor at que seja imperativamente atribudo outro valor
O corpo de um bloco always contm cdigo imperativo tradicional
MULTIPLEXADOR COM ALWAYS
-
DOIS TIPOS PRINCIPAIS DE DADOS: NETS
Os nets (fiao) representam as conexes entre as coisas
No retm os seus valores Obtm os seus valores de uma sada como
uma porta ou outro mdulo No podem ser atribudos em um bloco initial
ou always
-
DOIS TIPOS PRINCIPAIS DE DADOS: REGS
regs representam armazenamento de dados Comportam-se como uma memria Retm o seu valor at que seja
explicitamente atribudo em um bloco always ou initial
Nunca ligado a nada Pode ser usado para modelar latches, flip-
flops, etc., mas no correspondem exatamente a eles
-
NETS E REGISTRADORES
Fios e registradores podem ser bits, vetores ou arrays
wire a; // fio simplestri [15:0] dbus; // barramento tristate de 16 bitsreg [-1:4] vec; // registrador de 6 bitsinteger imem[0:1023]; // array de 1024 inteirosreg [31:0] dcache[0:63]; // Uma memria de 32 bits
-
ATRIBUIO PROCEDURAL
No interior de um bloco initial* ou alwayssum = a + b + cin; Tal como C: O lado direito avaliado e atribudo
ao lado esquerdo antes que a prxima sentena execute
A sentena do lado direito pode conter fios (wires) e/ou regs
A do lado esquerdo tem que ser um reg (apenas primitivas ou atribuies contnuas
podem atribuir valores a fios)
-
BLOCOS ALWAYS
always @(reg_lista_sensibilidade_1, reg_lista_sensibilidade_1, etc)begin
/* Este bloco de codigo executado sempre que qualquer das variaveis reg_lista_sensibilidade muda de valor */
end
O cdigo entre o begin e o end do blocoalways executado sequencialmentesempre que qualquer das variveis regmencionadas nos parnteses, conhecidacomo lista de sensibilidade, mudar seusvalores.
-
PROJETO ASSNCRONO
\* Ao usar projeto assincrono simplesmente listamos os regs na lista de sensibilidade *\
always @ (reg_1,reg_2,reg_3)begin
\\ codigo vai aquiend
Usado para definir lgica combinacional e latches, como vimos.
-
PROJETO SNCRONO
\* Listamos os nomes dos reg e tambm especificamos uma borda do clock nas implementacoes sincronas. Por exemplo, para executar na borda de subida: */
always @ (posedge clk)
\\ Executar na borda de descida do clock:
always @ (negedge clk)
-
VARIVEIS REG
Apenas variveis reg podem ser manipuladas em blocos always. Isto vale para entradas, sadas e fios.
Entradas, sadas e fios so nets. Estes no armazenam valores. Para armazenar valores preciso defini-los novamente como reg.
output saida_1;reg saida_1;
-
CASE
always@(variavel_reg)case(variavel_reg)
valor_reg_1: acao_1;valor_reg_2: acao_2;\\ etc
endcase
case(variavel_reg)valor_variavel_reg_1:
beginacao_1;acao_2;\\ etc
endvalor_variavel_reg_2:
beginacao_1;acao_2;\\ etc
endendcase
-
EXEMPLO: DECODIFICADOR 7 SEGMENTOSmodule decod7seg (entrada, saida);input [3:0] entrada;output [0:6] saida;reg [0:6] saida;
always @ (entrada)begin
case (entrada)4d0: saida= 7h7E;4d1: saida= 7h30;
.
.default: saida= 7b0000001; // -
end
-
IF...ELSE
always@(reg_lista_sensibilidade_1)if condicao_1 acao_1;else if condicao_2 acao_2;else acao_3;
end
if (condicao)begin
reg_1=1'b1;reg_2=1'b1;reg_3=1'b1;
end
-
EXEMPLOS COM SENTENAS IMPERATIVAS
if (select == 1) y = a;else y = b;case (op)2b00: y = a + b;2b01: y = a - b;2b10: y = a b;default: y = hxxxx;
endcase
-
OPERADORES
Operadores aritmticos
+ Adio
- Subtrao
* Multiplicao
/ Diviso
% Mdulo
Operadores booleanos&& AND lgico
! Not lgico
|| OR lgico
& AND bit-a-bit
~ NOT bit-a-bit
| OR bit-a-bit
^ XOR bit-a-bit
& (unrio) Reduo AND
~(unrio) Reduo NOT
|(unrio) Reduo OR
^(unrio) Reduo XOR
-
OPERADORES DE REDUO
reg_1 =|input_1; /* Are SOME of our bits 1? Eg |0110=1 */reg_2 =&input_2; /* Are ALL of our bits 1? Eg &1111=1 */reg_3 =~|input_3; /* Are ALL bits equal to 0? Eg ~|0000=1 */reg_4 =~&|input_4; /* Are SOME bits equal to zero? Eg
~&0001=1 */
-
Operadores relacionais
< Menor que
> Maior que
= Maior que ou igual a
== Igual a
!= No igual a
-
COM OU SEM SINAL
Verilog trata os valores numricos como strings de bits sem sinal. O tratamento do sinal deve ser feito com lgica auxiliar.
-
EXEMPLO: CONTADOR
module counter(direction,reset,clock,count_value);input direction, reset,clock;output [7:0] count_value;reg [7:0] count_value;
always @(posedge clock)begin
count_value
-
LAOS
Lao for: sintaxe idntica a Cfor (atribuio inicial; expresso; atrib. passo)Sentenas
O nmero de vezes que o for executa tem que ser fixo para poder ser sintetizado.
-
module sum(enable,op1);input enable;output [15:0] op1;reg [15:0] op1;reg [15:0] storage;reg [7:0] i;
always @(posedge enable)begin
for (i = 8'b00; i < 8'd255; i = i+8'd1)begin
storage=storage+i;end
op1=storage;end
endmodule
EXEMPLO: SOMA OS NMEROS DE 0 A 254
-
INFERNCIA DE LATCHES
Ocorre quando no so explicitados todos os valores que podem ser atribudos a uma varivel.
Neste caso, o valor de a retido. a s muda quando b colocado em 1. Conseqentemente temos um latch.
// Bad code infers a latch!always @ (b or c)
beginif (b) begin
a = c;end
end
-
EVITANDO LATCHES
Este cdigo gera o resultado correto e demonstra um mecanismo de evitar latches.
a recebe sempre zero e somente se b e cforem ambos 1 que a recebe 1.
Outra opo usar um else.
// Good code! Gives intended behaviour.always @ (b or c)
begina = 0;if (b) begin
a = c;end
end
-
MODELAGEM COMPORTAMENTAL
-
USANDO VERILOG PARA SIMULAO
O testbench gera estmulos e verifica a resposta
Acoplado ao modelo do sistema O par executa simultaneamente
Modelo do sistema
Estmulo
Resposta
Testbench
Verifica o resultado
-
SIMULAO DE EVENTOS DISCRETOS
Idia bsica: somente trabalhe quando algo muda
Centrado sobre uma fila de eventos que contm eventos marcados com o tempo de simulao em que devem ser executados
Paradigma bsico da simulao Executa todo evento para o tempo simulado atual Fazendo isto muda o estado do sistema e pode
escalonar eventos no futuro Quando no h eventos restantes no tempo atual,
avana o tempo simulado para o tempo de evento mais cedo da fila
-
MODELAGEM COMPORTAMENTAL
Maneira muito mais fcil de escrever testbenches Tambm pode ser usado para fazer modelos
abstratos dos circuitos Mais fcil de escrever Simula mais rpido
Mais flexvel Prov sequenciamento Verilog obteve sucesso em parte porque permitiu que
o modelo e o testbench fossem descritos conjuntamente
Aula posterior especfica sobre simulao com verilog e verificao funcional
-
DOIS COMPONENTES PRINCIPAIS DE VERILOG: COMPORTAMENTAL
Processos concorrentes, disparados por eventos (comportamental)
Blocos initial e always Cdigo imperativo que pode realizar tarefas
padro de manipulao de dados (atribuio, if-then, case)
Processos ou esto executando (no caso eles podem produzir atrasos) ou esto esperando por um evento de disparo
-
BLOCOS INITIAL E ALWAYS
initialbegin
// sentenas// imperativas
end
Roda quando a simulao comea
Termina quando o controle atinge o end
Bom para prover estmulos
alwaysbegin
// sentenas// imperativas
end
Roda quando a simulao comea
Restarta quando o controle atinge o end
Bom para modelagem ou para especificar hardware
-
ALWAYS E INITIAL
Executam at encontrar um atrasoinitial begin#10 a = 1; b = 0;#10 a = 0; b = 1;
end Ou uma espera por um eventoalways @(posedge clk) q = d;always beginwait(i);a = 0;wait(~i);a = 1;
end
-
OPERADORES DE ATRIBUIO
Atribuio bloqueante: = Atribuio no-bloqueante:
-
module assignment_test();reg [0:4] a,b,c,e;reg [0:7] d;initial
begina=4'd2;$display ("A is %d", a);$display ("B is %d", b);$display ("D is %d", d);$display ("\n\n");b=4'd3;$display ("A is %d", a);$display ("B is %d", b);$display ("D is %d", d);$display ("\n\n");d=(a+b);$display ("A is %d", a);$display ("B is %d", b);$display ("D is %d", d);$display ("\n\n");
endendmodule
-
RESULTADO
Sada do compilador(atribuio bloqueante)
Sada do compilador(atribuio no-bloqueante)
A is 2B is xD is x
A is 2B is 3D is x
A is 2B is 3D is 5
A is xB is xD is x
A is xB is xD is x
A is xB is xD is x
Atribuio bloqueante: execuo seqencial Atribuio no-bloqueante: simultnea apenas no
final
-
COMO USAR
Basicamente:Use no-bloqueante em lgica sequencialUse bloqueante em lgica combinacional
-
SYSTEMVERILOG
-
SYSTEMVERILOG
Em verilog wire utilizado para conexes input e output so wires reg utilizado para descrever memria Um reg pode desaparecer Um reg no um registrador!
Systemverilog simplifica tudo utilizando a palavra chave logic
logic pode ser utilizado no lugar de um wire, no lugar de um reg e no lugar do par wire,reg.
System verilog possui tipos de dados com sinal
-
NA PRTICA
Cdigos fonte verilog tem a extenso .v Cdigos em systemverilog tem a extenso
.sv
-
O QUE VIMOS HOJE
Modelagem de circuitos lgicos no nvel RTL usando descries procedurais
O uso do reg como indicador de variveis O bloco always como indicador de hardware Conceitos de simulao com verilog
-
PRXIMA AULA
CIRCUITOS SEQUENCIAIS E CONTROLE
Descrio verilog nvel rtlDescrevendo hardware com softwareNvel RTLLgica combinacional em rtlRevisando descrio com assignBlocos alwaysSentenas proceduraisIF...Multiplexador com AlwaysMultiplexador com AlwaysDois tipos principais de dados: NetsDois tipos principais de dados: RegsNets e RegistradoresAtribuio ProceduralBlocos alwaysProjeto assncronoProjeto sncronoVariveis regCaseExemplo: decodificador 7 segmentosif...elseExemplos com sentenas imperativasOperadoresOperadores de reduoSlide Number 25Com ou sem sinalExemplo: contadorLaosExemplo: soma os nmeros de 0 a 254Inferncia de latchesEvitando latchesModelagem COMPORTAMENTALUsando Verilog para SimulaoSimulao de Eventos DiscretosModelagem ComportamentalDois componentes principais de Verilog: ComportamentalBlocos Initial e AlwaysAlways e InitialOperadores de atribuioSlide Number 40ResultadoComo usarsystemverilogSystemverilogNa prticaO que vimos hojeCircuitos seqUenciais e controle