2015-01-19 8 views
5

Qual è la differenza tra le attività statiche e quelle automatiche.Qual è la differenza tra attività automatica e attività statica, perché non possiamo passare per riferimento a un'attività statica

program class_ref; 
    int index,value; 

class holding_values; 
    int ass_array[*]; 
    task assign_value (int value,int index); 
     ass_array[index] = value; 
    endtask 

    function void disp(int index); 
     $display("%t %M:ASSOSIATIVA VALUE%d ",$time,ass_array[index]); 
    endfunction 

endclass 

initial begin 
    holding_values obc; 
    index =5; 
    value =88; 
    obc = new(); 
    map(obc,value); 
    obc.disp(index); 
end 


task map(ref holding_values obc,ref int value); 
    value +=5; 
    obc.assign_value(value,index); 
    obc =null; 
endtask 

endprogram 

se questo codice viene eseguito darà l'errore

argomento riferimento è illegale all'interno dichiarazione compito-funzione statica

se task "mappa" viene fatta automaticamente il programma piste.

Perché è necessario rendere automatico il compito? Qual è la differenza tra compiti statici e automatici?

risposta

9

Per un'attività statica, più invocazioni della stessa attività faranno riferimento alle stesse variabili locali. Per un'attività automatica, le variabili locali saranno univoche per ciascuna chiamata dell'attività.

Ciò significa che per la seguente operazione:

task some_task(); 
    int foo = 5; 
    // ... 
endtask 

se la definiamo statico, allora tutte le chiamate vedrà lo stesso valore per foo (cioè foo sarà condiviso tra loro) . Ciò significa che la modifica del valore in una discussione farà sì che anche tutti gli altri vedano la modifica.

Se dovessimo definire some_task() automatica, quindi ogni invocazione avrebbe la propria copia locale del foo, totalmente indipendente dagli altri. Il cambio pippo in un thread non avrà alcun effetto in altri.

+0

se l'attività è statica, più invocazioni della stessa attività uccideranno l'attività precedentemente chiamata, quindi non c'è condivisione di variabile tra le attività. @ Tudor –

+0

@AkshayPatil Non penso. Se l'attività è statica, più invocazioni della stessa attività non uccideranno quella precedente. Esempio: http://www.edaplayground.com/x/8VC – AldoT

6

Penso che valga anche la pena notare che in system-verilog ogni task/funzione definita in un modulo/programma o standalone è di default statico, ma se definito in una classe è di default automatico (come in ogni altro linguaggio di programmazione). Suppongo che la ragione di ciò sia che verilog non è un "linguaggio normale" ma un linguaggio HDL, il blocco always in un modulo è per definizione statico.

function add(); 
    int i; 
    i++; 
    $display("i=%0d", i); 

endfunction 


module try; 


    initial begin 
     add(); 
     add(); 
     $finish; 
    end 
endmodule 

uscita:

i=1 
i=2 
$finish called from file "try.sv", line 15 
+1

Vale anche la pena notare che alcuni [alcuni fornitori] (http://www.xilinx.com/support/answers/51533.html) ignorano le specifiche della lingua e supponiamo che tutto sia automatico indipendentemente. – Chiggs

0

Nessuno indirizzata il "perché non possiamo passare con riferimento ad un compito statico" parte della questione. L'LRM non fornisce un "perché" per quanto posso dire, ma posso azzardare un'ipotesi e fare un'ulteriore domanda.

Indovinare: la raccolta dei rifiuti è in questione. Passando i riferimenti a funzioni statiche, in effetti, li hai mantenuti in vita per sempre. L'LRM afferma che anche se un array viene cancellato al di fuori dell'attività, se un elemento dell'array è stato passato per riferimento all'attività, allora quell'elemento deve essere mantenuto in vita. Non sarà ancora visibile al resto della simulazione dopo l'eliminazione dell'array. Questo sarebbe un modo interessante per eseguire rapidamente errori fuori memoria.

Domanda: è possibile che gli argomenti relativi alle attività statiche abbiano una durata statica?In tal caso, un handle referenziato a un oggetto potrebbe essere sovrascritto con il puntatore a un altro oggetto se l'attività è stata richiamata con un diverso valore argomento?

Problemi correlati