2017-12-06 2 views
1

ich gedacht war eine maßgeschneiderte Aufgabe in einem always @* Block zu verwenden, wie:Verwenden Aufgaben in immer @ * Blöcke

input [31:0] a; 
input b; 
output reg [31:0] c; 

task mytask; 
begin 
    if (b) begin 
     c = a; 
    end 
end 
endtask 

always @* begin 
    // ... (b is not included) 
    mytask; 
    // ... (b is not included) 
end 

Was ich denke, ist, dass, wenn das Signal b Änderungen 0-1 werden c eingestellt werden zum Inhalt von a. Dann fand ich, dass der always Block nicht empfindlich auf Signal b ist (mit ISim 14.7).

Ist das ein Fehler oder entwickelt, um sich so zu verhalten?

Antwort

1

Die Sprache wird so angegeben, dass sie sich so verhält. Always @ * - (oder always_comb-) Blöcke sind nicht empfindlich gegenüber Änderungen an Werten, die in Tasks verwendet werden, die nicht in der Argumentliste enthalten sind. Verwenden Sie hier eine Funktion, da Ihr Körper keine Zeit verbraucht.

1

Das ist das definierte Verhalten in Verilog. Wenn Sie wan die Aufgabe empfindlich auf die Signale zu machen, müssen Sie diese in der E/A-Liste setzen:

task mytask(input b); 

(Und der Grund, warum ich weiß ist, dass ich auch diesen Fehler gemacht und es sah nach oben)

1

Nur zu den Antworten hinzufügen: Ihre ursprüngliche always @* Prozedur wird nie ausgeführt, da es eine leere Triggerliste hat. @ * bedeutet: Hey Werkzeug (Simulator, der auf dieser Liste beruht), bauen Sie die Empfindlichkeitsliste für mich auf. always @ * (by the lang spec) reagiert nur auf Änderungen an den Argumenten einer Funktion/Task (neben anderen Triggern) (in Ihrem Fall - keine Argumente also leere Sensitivitätsliste), nicht auf Signaländerungen innerhalb des Funktions/Task-Inhalts.

Seitennotiz: Ich denke, SystemVerilog always_comb würde hier arbeiten (2012 Std 9.2.2.2.2).Dave, danke für die Klarstellung.

+2

'always_comb' nur Inline-' function' Aufrufe, keine Tasks. Dies geschieht speziell, damit Sie Debug-Code-Aufgaben in einem 'aways_comb' hinzufügen können, ohne die Empfindlichkeit zu ändern. –