Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1. System Verilog
System Verilog é uma linguagem que foi baseada na linguagem de descrição de
Hardware Verilog 95 e por esta razão engloba a maior parte dos aspectos de projeto do
sistema e do testbench que Verilog oferece.
Além disto System Verilog se propõe a ser uma HDL e HVL ou seja, adequada para
codificação (projeto) bem como verificação.. Isto demanda outras funcionalidades que ainda
não eram disponíveis em Verilog ou VHDL, mas em E ou Open Vera. System Verilog foi
muito influenciada por Open Vera e por isto se parece mais com esta HVL.
A linguagem completa:
2. Tipos
2.1. Enumeração
2.2. Arrays
System Verilog suporta Arrays, bem como as HDLs conhecidas. Existe o conecite de
array packed e unpacked.
2.4. Filas
System Verilog também oferece filas (queues) que aumentam e diminuem em tempo
de execução e aceitam comandos de colocar na fila e tirar da fila.
Pode-se colocar elementos ou no começo ou no final e 0 indica o primeiro elemento, 1
o segundo e assim sucessivamente, enquanto que $ representa o último.
Um ponto importante é que a semântica exige um tempo de acesso constante.
Exemplos de filas com tamanho limitado ou ilimitado:
int canal[$]; //lista de inteiros
byte dados[$] = { 2h’00, 2h’FF}; //lista de bytes com inicialização
int fila_restrita[$:16]; //fila com no máximo 16 elementos
Exemplos de operações qe podem ser feitas com filas e já vem prontas em System
Verilog:
int e, pos;
int canal2[$]; // outra fila sem limite
e=canal[0]; //pega o primeiro (mais a esquerda)elemento da fila
canal2=canal; // copia uma fila completa
canal[0]=e; // escreve na primeira posição da fila
canal=canal[1:$]; // copia a lista para ela mesma sem o primeiro elemento ou seja deleta o primeiro
canal2={e,canal}; //monta uma lista com o elemento e concatenado com a lista canal
canal={}; // esvazia a fila
canal = {canal{0:pos},e,canal{pos+1:$}}; // insere o elemento e na posição pos
2.5. Interfaces
Uma interface agrupa e encapsula um conjunto de fios assim como uma struct faz isto
com variáveis. Facilita o acesso e o uso.
As interfaces são instanciadas e nos poupam ficar definindo sinais que são saída em
um módulo e entrada noutro.
2.6. Structs
2.7. Casting
Semelhante ao C
3. Escopo
System Verilog também permite declarar sinais e variáveis globais e locais
Int max = 10;
Int n;
module topo;
int n;
initial begin
automatic int i; // variável local como em C
n = 2;
end
initial begin: meu bloco
n=1
$root.n = n; // $root.n é a variável global e n é aqui a local
end
endmodule
4. Operadores
Entre os vários tipos existem operadores que podem ser usados:
& e ~& E e não-e
| e ~| Ou e não-ou
^ e ~^
== e !== Igualdade e desigualdade
estrutura_mista X,Y,Z;
bind + function estrutura_mista fadds(estrutura_mista,estrutura_mista);
bind + function estrutura_mista faddi(estrutura_mista, integer);
5. Literais
Literais funcionam de maneira semelhante a Verilog.
reg [31:0} a,b;
reg [15:0] c,d;
...
a = 32’hf0ab;
c = 16’hFFFF;
a = ‘0; // enche um array packed de 0s
6. Descrever hardware
Naturalmente como uma HDl system verilog deve permitir a escrita de um hardware.
Isto é feito definindo-se módulos de hardware. Vejamos um exemplo:
module topo;
logic clk;
7. Descrever Verificação
Em System Verilog a DUT e o código do testbench são separados. Isto é oferecedio
pela linguagem.
Em System Verilog toda a automatização que tinha que ser feita a mão usando as
linguagens de verificação normais pode ser automatizada dentro da linguagem.
Exemplo:
8. Classes
System Verilog oferece classes, uma vez que é uma linguagem orientada a objetos,
portanto oferece encapsulamento, herança e polimorfismo.
System Verilog oferece Métodos (Method) da mesma forma que qualquer linguagem
orientada a objetos faz, além de funções e tarefas (functions e tasks). A principal diferença
entre funções e tarefas é que tarefas podem ser bloqueadas e funções não.
Além disto, temos handle e instâncias para os objetos. Note que system verilog não
tem nenhum outro tipo de ponteiros como c ou c++.
Exemplo:
class pacote;
Blabla;
cnd class;
8.1. Construtores
8.2. Escopo
Da mesma forma que verilog, System verilog permite observar todos os sinais dando
o caminho completo dentro da hierarquia, o que não é possível usando-se VHDL.
9. Blocos de Programa
È uma maneira de se encapsular o que é usado no testbench da sua DUT. Esta
barreira existe naturalmente se estamos utilizando uma HDL e HVL, mas no caso de System
Verilog poderia se misturar as coisas e assim existe a necessidade desta separação.
Além disto blocos de programa ajudam na portabilidade e reuso. È uma maneira
metodológica de isolar os transactors.
Características: tem um único bloco de inicialização; executa eventos em uma fase de
verificação sincronizada aos eventos de simulação; pode usar a tarefa $exit que termina a
simulação depois que todos os blocos de programa acabaram de executar.
10. Interfaces
As interfaces representam as portas que comunicam os módulos. Na verdade serve
como uma maneira de definir bundles de tipos e reusa-los. As interfaces não tem direção e
assim evita ficar definindo um port de uma lado como saída e de outro como entrada como
se conhece em VHDL.
Duas classes vazias que estão ai para serem reescritas com coisas que precisam ser
feitas antes ou depois da randomização.
Srand(semente) pode inicializar a semente da função de randomização.
12.3. Restrições
Uma vez que queremos dados randômicos, mas existem dados que não nos interessa,
é possível restringir os dados randômicos que são gerados.
class base;
rand int y;
rand int x;
constraint R {y >x;} //expressão booleana
End class
13.1. Herança
Herança é um conceito que existe em OOP e que nos serve para a verificação.
E oferece uma herança like, ou seja parecido.
class BasePacket
int id;
byte Payload[];
task send(bit data[]);
endtask
endclass
class ATMPacket extends BasePacket;
byte header[0:4];
function new; // redefine a função
super.new(); // chama o constructor pai
payload = new[48];
.....
end function;
task send(bit data[]); // sobreescreve o método pai
....
endtask
endclass
System Verilog não suporta herança múltipla, mas não é extremamente necessário
para os propósitos da verificação. Super. serve para redefinir o método-pai.
Também é possível reescrever um método completamente:
class minha_base;
virtual task metodo_a();
blabla
endtask
endclass
Este exemplo não tem nada de excepcional, simplesmente defina a escrita e leitura no
barramento. Mas note que agora podemos usar esta classe superior para fazer uma classe
entendida, por exemplo, que escreve erroneamente, para ver como o sistema se comporta
com erros. Em geral o comportamento errôneo é bem parecido tendo apenas um erro de CRC
ou um bit errado ou um byte diferente. Assim vejamos uma extensão deste tipo que escreve
mas usando o bit mais significativo corrupto escrevendo nele 0.
Ou usar a escrita para “guardar” em algum lugar meu valor para comparação
posterior.
Outra possibilidade seria definir um outro método e usar o super. para “herdar” o
que já existe. É outra maneira de implementar.
Usam-se classes abstratas como um template para novas classes. Serve para reuso. A
idéia é particionar a funcionalidade em classes básicas e classes derivadas o que ajuda o
reuso, mas note que isto deve ser planejado.
13.3. Polimorfismo
Define-se duas classes diferentes, mas que enviam pacotes de dados, cada uma tendo
a sua tarefa de envio diferenciada.
pacote ListadePacotes[100]
pacote_ATM pa = new; // cria um pacote ATM
pacoteToken pt = new; //cria um pacote Token
ListadPacotes[0]=pa;
ListadePacotes[1]=pt;
...
ListadePacotes[0].enviar; // sabe que deve usar o enviar do pacote ATM
ListadePacotes[1].enviar; //sabe que deve usa o enviar de pacotes do tipo Token.
13.4. Pacotes
System Verilog oferece o mesmo tipo de pacote que VHDL. A declaração é feita no
arquivo de package.
package ClassesBasicas;
virtual class Base;
int id;
virtual task status;
endtask
end class
…
endpackage
Depois usa-se no programa principal:
program BFM;
import ClassesBasicas::Base;
Quantas vezes o a foi igual a 1? Uma vez que se estivermos fazendo uma verificação
randômica pode acontecer que os dados não estejam sendo usados uma vez que rodamos
poucas vezes a nossa simulação.
14.1. Bins
Os bins são contêiners que podem ser criados para valores num intervalo. Na
verdade quanddo definimos um tipo de dados sabemos que o intervalo é maior do que os
valores que vão realmente ocorrer, assim podsso definir “baldes” para colocar meus valores
utilizando para a cobertura funcional os valores que mais me interessam
Pode-se usar o .triggered para indicar a condição de um evento ter sido disparado.
15.1. Semáforos
Imagine a situação de um BFM que pode somente escrever ou ler, ou seja, uma
situação de exclusão mútua. Assim pode-se definir o semáforo in_use de forma que somente
um dos processos vai ser disparado.
15.2. Mailboxes
16. Asserções
As asserções não serão tratadas aqui, pois farão parte de uma aula exclusiva para elas
juntamente com PSL.
Considerações:
• Arquiteura: O topo é System Verilog ou VHDL
• Como conectamos a DUT em VHDl em um Testvbench em Sysem verilog
Teria que usar alguma ferramenta que permitisse se ver (por exemplo o SignalSpy da
mentor).