2017-08-29 51 views
0

我想了解System Verilog中的任務如何工作。我認爲一個任務只是一種命名和參數化一些代碼的方式,否則它可能會出現在beginend之間。但是,參數的工作方式並不明顯。非阻塞賦值參考參數

說我想從一個模塊中分解出非阻塞賦值的實例。我可能會做類似以下的事情,從而達到了只有參數(ff_0和ff_1)有兩個相同任務的實例不同的地方。

module test_inlined; 

bit clk; 
int count = 0; 
logic [7:0] x, y, z; 

task automatic ff_0; 
    @(posedge clk); 
    y <= x; 
endtask 

task automatic ff_1; // really same task as ff_0 to within variable renaming 
    @(posedge clk); 
    z <= y; 
endtask 

always 
    ff_0; 

always 
    ff_1; 

always @(posedge clk) 
    $strobe("%d: x=%d, y=%d, z=%d", count, x, y, z); 

always 
    #5 clk = !clk; 

always @(posedge clk) 
    begin 
    x <= count; 
    count ++; 
    if (count > 20) $finish;  
    end 

endmodule 

這將是微不足道的,而不是放置分解出來的任務(又名觸發器)到同一模塊的兩個實例,因此它將使意義它是也可以表達方面相同的功能兩個相同任務的實例。

以下不起作用,因爲out被認爲是自動的,或者這就是Modelsim所聲稱的。我不明白爲什麼會這樣,因爲它顯然是對模塊靜態成員的引用。

task automatic ff (ref logic [7:0] out, ref logic [7:0] inp, ref bit clk); 
@(posedge clk); 
out <= inp; 
endtask 

module test_broken; 

    bit clk; 
    int count = 0; 
    logic [7:0] x, y, z; 

    always 
    ff(y, x, clk); 

    always 
    ff(z, y, clk); 

    // .... same as before 

endmodule 

確實有意義的是,任務需要自動使用參考參數,因爲那樣就沒有必要擔心它們的壽命。不太清楚爲什麼只允許阻止賦值給自動變量。當存在未決的非阻塞賦值時,它不像是有任何明顯的需要讓自動變量消失嗎?

如何將非阻塞任務分解爲任務?提前謝謝了。

+0

在你的情況下使用任務的目的是什麼?分解非阻塞賦值是一種使rtl不可讀的方法,而使用任務是使它不可綜合的方法。你是用這種方式建立一個測試臺嗎? – Serge

+0

這只是一個讓問題儘可能簡單的方法。我真正想做的是構建一個能夠理解測試向量的抽象表示的測試平臺。如果我不得不使用流行語,那就是TLP。測試平臺的任何一方都不需要模塊,特別是它們都需要通過引用來引用參數並且不可合成。 – jeremiah

回答

1

問題是,task不能假定傳遞給它的變量的存儲分類。爲任務生成的代碼必須適用於任何類型的存儲,因此傳遞ref必須承擔悲觀的一組限制。

+0

我不確定這是多麼真實。很明顯,實施選項不具備該要求,例如內聯。此外,還不清楚爲什麼對自動變量進行非阻塞賦值這麼大的問題。無論如何,非常感謝您的回答。 – jeremiah

+0

基於類的測試平臺的內聯虛擬方法是不可行的。 –

+0

自動變量的生命週期與變量定義的過程塊(範圍)的生命週期相關聯。在編譯時檢查變量的引用很容易,以確保它們在塊的範圍內。 NBA可以在其生命結束後安排一個變量的分配,並且該參考不再有效。雖然SV可以設計一種方法來在有預定分配時延長變量的壽命,但這會給運算帶來巨大的負擔。 –