Atribuições Verilog
Colocar valores em redes e variáveis é chamado de atribuições. Existem três formas básicas:
- Procedimento
- Contínuo
- Procedimento contínuo
Valores legais do LHS
Uma atribuição tem duas partes - lado direito (RHS) e lado esquerdo (LHS) com um símbolo igual (=) ou um símbolo menor que igual (<=) entre eles.
Tipo de atribuição | Lado esquerdo |
---|---|
Procedimento |
|
Contínuo |
|
Procedimento Contínuo |
|
O RHS pode conter qualquer expressão que avalie um valor final, enquanto o LHS indica uma rede ou uma variável à qual o valor em RHS está sendo atribuído.
module tb;
reg clk;
wire a, b, c, d, e, f;
reg z, y;
// clk is on the LHS and the not of clk forms RHS
always #10 clk = ~clk;
// y is the LHS and the constant 1 is RHS
assign y = 1;
// f is the LHS, and the expression of a,b,d,e forms the RHS
assign f = (a | b) ^ (d & e);
always @ (posedge clk) begin
// z is the LHS, and the expression of a,b,c,d forms the RHS
z <= a + b + c + d;
end
initial begin
// Variable names on the left form LHS while 0 is RHS
a <= 0; b <= 0; c <= 0; d <= 0; e <= 0;
clk <= 0;
end
endmodule
Atribuição Processual
Atribuições procedurais ocorrem dentro de procedimentos como sempre, inicial, tarefa e funções e são usadas para colocar valores em variáveis. A variável manterá o valor até a próxima atribuição à mesma variável.
O valor será colocado na variável quando a simulação executar esta instrução em algum ponto durante o tempo de simulação. Isso pode ser controlado e modificado da maneira que queremos pelo uso de instruções de fluxo de controle, como if-else-if, instrução case e mecanismos de loop.
reg [7:0] data;
integer count;
real period;
initial begin
data = 8'h3e;
period = 4.23;
count = 0;
end
always @ (posedge clk)
count++;
Atribuição de declaração de variável
Um valor inicial pode ser colocado em uma variável no momento de sua declaração, conforme mostrado a seguir. A atribuição não tem duração e mantém o valor até que a próxima atribuição à mesma variável aconteça. Observe que as atribuições de declaração de variável para uma matriz não são permitidas.
module my_block;
reg [31:0] data = 32'hdead_cafe;
initial begin
#20 data = 32'h1234_5678; // data will have dead_cafe from time 0 to time 20
// At time 20, data will get 12345678
end
endmodule
reg [3:0] a = 4'b4;
// is equivalent to
reg [3:0] a;
initial a = 4'b4;
Se a variável for inicializada durante a declaração e no tempo 0 em um bloco inicial como mostrado abaixo, a ordem de avaliação não é garantida e, portanto, pode ter 8'h05 ou 8'hee.
module my_block;
reg [7:0] addr = 8'h05;
initial
addr = 8'hee;
endmodule
reg [3:0] array [3:0] = 0; // illegal
integer i = 0, j; // declares two integers i,j and i is assigned 0
real r2 = 4.5, r3 = 8; // declares two real numbers r2,r3 and are assigned 4.5, 8 resp.
time startTime = 40; // declares time variable with initial value 40
Blocos de procedimentos e atribuições serão abordados com mais detalhes em uma seção posterior.
Atribuição Contínua
Clique aqui para um exemplo de simulação passo a passo!
Isso é usado para atribuir valores a redes escalares e vetoriais e acontece sempre que há uma mudança no RHS. Ele fornece uma maneira de modelar a lógica combinacional sem especificar uma interconexão de portas e torna mais fácil conduzir a rede com expressões lógicas.
// Example model of an AND gate
wire a, b, c;
assign a = b & c;
Sempre que b ou c muda seu valor, então toda a expressão em RHS será avaliada e a será atualizado com o novo valor.
Atribuição de declaração líquida
Isso nos permite colocar uma atribuição contínua na mesma instrução que declara a rede. Observe que, como uma rede pode ser declarada apenas uma vez, apenas uma atribuição de declaração é possível para uma rede.
wire penable = 1;
Atribuição Contínua Processual
Estas são declarações procedurais que permitem que expressões sejam continuamente atribuídas a redes ou variáveis e são de dois tipos.
assign
...deassign
force
...release
atribuir desatribuir
Isso substituirá todas as atribuições processuais a uma variável e será desativado usando o mesmo sinal com
deassign
. O valor da variável permanecerá o mesmo até que a variável obtenha um novo valor por meio de uma atribuição procedural ou procedural contínua. O LHS de um assign
A instrução não pode ser uma seleção de bits, seleção de partes ou uma referência de matriz, mas pode ser uma variável ou uma concatenação de variáveis.
reg q;
initial begin
assign q = 0;
#10 deassign q;
end
forçar a liberação
Eles são semelhantes aos
assign - deassign
instruções, mas também pode ser aplicado a redes e variáveis. O LHS pode ser uma seleção de bits de uma rede, seleção de parte de uma rede, variável ou uma rede, mas não pode ser a referência a uma matriz e seleção de bits/parte de uma variável. O force
statment substituirá todas as outras atribuições feitas à variável até que ela seja liberada usando o release
palavra-chave.
reg o, a, b;
initial begin
force o = a & b;
...
release o;
end
Verilog