Tarefa Verilog
Um
function
destina-se a fazer algum processamento na entrada e retornar um único valor, enquanto um task
é mais geral e pode calcular vários valores de resultado e devolvê-los usando saída e dentro argumentos de tipo. As tarefas podem conter elementos demorados de simulação, como @ , postado e outros. Sintaxe
Uma tarefa não precisa ter um conjunto de argumentos na lista de portas, caso em que ela pode ser mantida vazia.
// Style 1
task [name];
input [port_list];
inout [port_list];
output [port_list];
begin
[statements]
end
endtask
// Style 2
task [name] (input [port_list], inout [port_list], output [port_list]);
begin
[statements]
end
endtask
// Empty port list
task [name] ();
begin
[statements]
end
endtask
Tarefa Estática
Se uma tarefa for estática, todas as suas variáveis de membro serão compartilhadas em diferentes invocações da mesma tarefa que foi iniciada para ser executada simultaneamente
task sum (input [7:0] a, b, output [7:0] c);
begin
c = a + b;
end
endtask
// or
task sum;
input [7:0] a, b;
output [7:0] c;
begin
c = a + b;
end
endtask
initial begin
reg [7:0] x, y , z;
sum (x, y, z);
end
Os argumentos de habilitação da tarefa (x, y, z) correspondem aos argumentos (a, b, c) definidos pela tarefa. Desde um e b são entradas, valores de x e s será colocado em a e b respectivamente. Porque c é declarado como uma saída e conectado com z durante a invocação, a soma será automaticamente passada para a variável z de c .
Tarefa automática
A palavra-chave
automatic
tornará a tarefa reentrante, caso contrário, será estática por padrão. Todos os itens dentro de automático as tarefas são alocadas dinamicamente para cada chamada e não compartilhadas entre as chamadas da mesma tarefa em execução simultaneamente. Observe que automatic
itens de tarefa não podem ser acessados por referências hierárquicas. Para ilustração, considere o estático exibição de tarefa que é chamada de diferentes
initial
blocos que são executados simultaneamente. Nesse caso, a variável inteira declarada na tarefa é compartilhada entre todas as invocações da tarefa e, portanto, o valor exibido deve ser incrementado para cada chamada.
module tb;
initial display();
initial display();
initial display();
initial display();
// This is a static task
task display();
integer i = 0;
i = i + 1;
$display("i=%0d", i);
endtask
endmodule
Registro de simulação xcelium> run i=1 i=2 i=3 i=4 xmsim: *W,RNQUIE: Simulation is complete.
Se a tarefa for automática, cada chamada da tarefa é alocada em um espaço diferente na memória de simulação e se comporta de maneira diferente.
module tb;
initial display();
initial display();
initial display();
initial display();
// Note that the task is now automatic
task automatic display();
integer i = 0;
i = i + 1;
$display("i=%0d", i);
endtask
endmodule
Registro de simulação xcelium> run i=1 i=1 i=1 i=1 xmsim: *W,RNQUIE: Simulation is complete.
Tarefas globais
As tarefas declaradas fora de todos os módulos são chamadas de global tarefas, pois elas têm um escopo global e podem ser chamadas dentro de qualquer módulo.
// This task is outside all modules
task display();
$display("Hello World !");
endtask
module des;
initial begin
display();
end
endmodule
Registro de simulação xcelium> run Hello World ! xmsim: *W,RNQUIE: Simulation is complete.
Se a tarefa foi declarada dentro do módulo des, ela teria que ser chamada em referência ao nome da instância do módulo.
module tb;
des u0();
initial begin
u0.display(); // Task is not visible in the module 'tb'
end
endmodule
module des;
initial begin
display(); // Task definition is local to the module
end
task display();
$display("Hello World");
endtask
endmodule
Registro de simulação xcelium> run Hello World Hello World xmsim: *W,RNQUIE: Simulation is complete.
Diferença entre function
e task
Embora as funções e tarefas do Verilog sirvam a propósitos semelhantes, existem algumas diferenças notáveis entre elas.
Função | Tarefa |
---|---|
Não pode ter instruções/atrasos de controle de tempo e, portanto, executa na mesma unidade de tempo de simulação | Pode conter declarações/atrasos de controle de tempo e só pode ser concluído em outro momento |
Não é possível habilitar uma tarefa devido à regra acima | Pode habilitar outras tarefas e funções |
Deve ter pelo menos um argumento de entrada e não pode ter argumentos de saída ou entrada | Pode ter zero ou mais argumentos de qualquer tipo |
Pode retornar apenas um único valor | Não é possível retornar um valor, mas pode obter o mesmo efeito usando argumentos de saída |
Quando uma função tenta chamar um
task
ou contém uma instrução demorada, o compilador relata um erro.
module tb;
reg signal;
initial wait_for_1(signal);
function wait_for_1(reg signal);
#10;
endfunction
endmodule
Registro de simulação #10; | xmvlog: *E,BADFCN (testbench.sv,7|4): illegal time/event control statement within a function or final block or analog initial block [10.3.4(IEEE)].
Desativar tarefa
As tarefas podem ser desativadas usando o
disable
palavra-chave.
module tb;
initial display();
initial begin
// After 50 time units, disable a particular named
// block T_DISPLAY inside the task called 'display'
#50 disable display.T_DISPLAY;
end
task display();
begin : T_DISPLAY
$display("[%0t] T_Task started", $time);
#100;
$display("[%0t] T_Task ended", $time);
end
begin : S_DISPLAY
#10;
$display("[%0t] S_Task started", $time);
#20;
$display("[%0t] S_Task ended", $time);
end
endtask
endmodule
Quando exibir tarefa foi iniciada pelo primeiro
initial
bloco, T_DISPLAY iniciou e foi desabilitado quando o tempo atingiu 50 unidades. Imediatamente o próximo bloco S_DISPLAY começou e correu até a conclusão por 80 unidades. Registro de simulação
xcelium> run [0] T_Task started [60] S_Task started [80] S_Task ended xmsim: *W,RNQUIE: Simulation is complete.
Verilog