2015-06-25 125 views
0

在systemverilog中通過ref傳遞和傳遞val有什麼區別?在systemverilog中通過ref傳遞和傳遞val有什麼區別?

我只是想知道pass by refpass by val在systemverilog中有什麼區別?

我找不到任何example.also expecially,這是什麼?有誰知道這是什麼並解釋?

interface xxx 
    ... 
event yyy; 
event ggg; 

modport io_bus (ref yyy, 
        ref ggg, 
        .... 
       ); 
endinterface 

modport中的「ref yyy」的用途是什麼?

回答

0

按值傳遞

在SystemVerilog中,由值傳遞是傳遞參數給子程序默認的機制。該參數傳遞機制通過將每個參數複製到子例程區域來工作。如果子程序是自動的,那麼子程序在其堆棧中保留參數的本地副本。

通過引用傳遞

參數通過引用傳遞不會被複制到子程序區域,確切地說,原來的參數的引用傳遞到子程序。

子程序然後可以經由參考訪問參數數據。不允許鑄造。

還要注意,它應是非法使用的參數通過引用傳遞的子程序與靜態一生。

只有應按下述法律按引用傳遞:

— A variable, 
— A class property, 
— A member of an unpacked structure, or 
— An element of an unpacked array. 

籃網和選擇成網,不得借參照

傳遞對於你的問題

的目的是什麼「mod yyy」在modport?

有一些性能改進,當您使用的參考,當不同的事件被多次觸發的事件,但它是當需要/必要的相當大的性能優化,只使用一個很好的做法。一個推薦實施例通過參考使用通行證可以在link

在這裏找到我展示與參考事件如何modport使用的一種方法。

interface intf(input clk); 
event out_event; 
    logic clk; 
    modport dut(input clk,ref out_event); 
    always @(out_event) 
    $display ($time,"ns"," out_event triggered"); 
endinterface 

module dut(intf.dut d); 
    reg [2:0] count; 
    initial 
    count = 0; 
    always @ (posedge d.clk)begin 
    count = count + 1'b1; 
    if (count == 'd2) 
     -> d.out_event; 
     end 
endmodule 

module top (input clk); 
    intf int_f(.clk(clk)); 
    dut u0(.d(int_f.dut)); 
endmodule 

上述工作實施例中所用的鏈接EDA-Playground

詳情通過值找到約通行證參閱第13.5.1節的SystemVerilog LRM IEEE 1800-2012和用於通行證通過引用參考13.5節0.2

+0

這個例子的意義是什麼?當我只是使用inout out_event而不是ref時,我找不到任何不同之處。 – bunch

+0

這個例子中的要點是針對你的問題「我找不到任何例子,這是什麼?」和「一個ref參數類似於inout參數,除了一個inout參數被複制兩次:當子例程被調用時,一次從實際參數進入參數,當子例程返回時,一次從參數進入實際。我再次提到了表現的差異。請注意,ref無法通過定向限定符進行限定。 – Emman

0

下面的兩個代碼塊總結了不同之處。

value = 1; 
IncreaseByOne(ref value); //pass by reference 
//value will be set to 2 

value = 1; 
IncreaseByOne(value); //pass by value 
//value will still be 1 

傳遞引用意味着它獲取該參數的方法是能夠改變可變的,使得原始變量也被改變。按值傳遞意味着傳遞值的副本,並且對該副本的任何更改都不會反映到原始變量上。

+0

坦克讓我知道兩者的區別。但特別是使用'事件'不只是變量。那你怎麼解釋呢? – bunch

+0

我不熟悉使用Verilog自己,在某些語言中的數據類型只能通過參考(Java/C#)進行傳遞。 您可以創建通過使用ref關鍵字的事件的例子,一個不使用ref關鍵字。然後對事件進行更改。之後,您可以檢查原始事件是否已更改。 – sanderarts

相關問題