2012-09-26 64 views

回答

2

對於高層次的,我不知道是否有什麼東西你描述這正是東西。

但是,有$typename系統任務。但是,我不知道它如何與類的對象一起工作。我以前沒有找到這方面的需要。

通常我所看到的完成(以及我所做的,因爲我發現它很有用),是創建一個存儲在由構造函數指定的類中的字符串,它是對象的「名稱」。然後我可以在記錄時使用它,所以我知道不同的消息來自哪裏。當然,這取決於你使用有用的名字創建新的變量。

+0

這就是我也看到的。但是分配的字符串不需要匹配用於實例化對象的字符串..好嗎? – Jean

+0

@Jean對,你可以將它分配給任何你想要的。但是,這可能足以滿足您的特定需求。 –

8

不,對於類來說,沒有這種語言的機制。

對於模塊,可以使用%m格式說明符來顯示分層名稱。但對於類,使用%m的輸出顯示類類型名稱,而不是實例名稱。 (至少那是Incisive和Questa觀察到的行爲。)另外請注意,%m將包含函數名稱(如果從函數內調用)。

例子:

module test; 

    // Print %m in a module 
    function void printName(); 
    $display("%m"); 
    endfunction 

    class foo; 

    // Print %m in a class 
    virtual function void printName(); 
     $display("%m"); 
    endfunction 

    endclass 

    foo foo_inst = new; 

endmodule 

module top; 
    test test_inst(); 

    initial begin 
    test_inst.foo_inst.printName(); 
    test_inst.printName(); 
    end 
endmodule 

輸出:

top.test_inst.foo.printName 
top.test_inst.printName 

如果從%m輸出是非常有用的,你可以使用$sformatf捕捉它在一個字符串,然後修改或做任何與它。

4

實例沒有名稱。考慮以下代碼:

someObject a 
someObject b 

initial begin 
    a = new(); 
    b = a; 
    a.printName(); 
    b.printName(); 
end 

ab點的someObject同一個實例。我們只創建一個。因此,這兩個調用將不得不報告相同的名稱,但您希望他們報告我們用來訪問它們的句柄的名稱。這是不可能的。


OVM/UVM對象包含一個包含實例名稱的成員變量。它可以在施工時使用或使用set_name()進行設定。它可以使用get_name()閱讀。即使您所談論的對象不是OVM/UVM,也可以使用類似的系統。

2

如果您使用OVM/UVM,則get_full_name()/ get_name()將返回測試平臺層次結構中組件的名稱。

對象是動態的,所以隱含地提出的問題是無效的。

當有人想要實現對象的名字,他們要做的是在每一個對象的構造函數傳遞一個「字符串名稱」,所以當對象被new'd家長會說什麼它的名字。

如果你看一下在OVM/UVM每一個部件,你會看到構造函數簽名: 功能新(字符串名稱=「」,ovm_component家長= NULL)

它們所使用的基類實現get_full_name()/ get_name()

相關問題