有沒有什麼辦法可以得到它在SystemVerilog上操作的對象的名稱?如何使用SystemVerilog中的方法操作實例的名稱?
像實施
object1.printName()
應打印字符串
object1
有沒有什麼辦法可以得到它在SystemVerilog上操作的對象的名稱?如何使用SystemVerilog中的方法操作實例的名稱?
像實施
object1.printName()
應打印字符串
object1
對於高層次的,我不知道是否有什麼東西你描述這正是東西。
但是,有$typename
系統任務。但是,我不知道它如何與類的對象一起工作。我以前沒有找到這方面的需要。
通常我所看到的完成(以及我所做的,因爲我發現它很有用),是創建一個存儲在由構造函數指定的類中的字符串,它是對象的「名稱」。然後我可以在記錄時使用它,所以我知道不同的消息來自哪裏。當然,這取決於你使用有用的名字創建新的變量。
不,對於類來說,沒有這種語言的機制。
對於模塊,可以使用%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
捕捉它在一個字符串,然後修改或做任何與它。
實例沒有名稱。考慮以下代碼:
someObject a
someObject b
initial begin
a = new();
b = a;
a.printName();
b.printName();
end
a
和b
點的someObject
同一個實例。我們只創建一個。因此,這兩個調用將不得不報告相同的名稱,但您希望他們報告我們用來訪問它們的句柄的名稱。這是不可能的。
OVM/UVM對象包含一個包含實例名稱的成員變量。它可以在施工時使用或使用set_name()
進行設定。它可以使用get_name()
閱讀。即使您所談論的對象不是OVM/UVM,也可以使用類似的系統。
如果您使用OVM/UVM,則get_full_name()/ get_name()將返回測試平臺層次結構中組件的名稱。
對象是動態的,所以隱含地提出的問題是無效的。
當有人想要實現對象的名字,他們要做的是在每一個對象的構造函數傳遞一個「字符串名稱」,所以當對象被new'd家長會說什麼它的名字。
如果你看一下在OVM/UVM每一個部件,你會看到構造函數簽名: 功能新(字符串名稱=「」,ovm_component家長= NULL)
它們所使用的基類實現get_full_name()/ get_name()
這就是我也看到的。但是分配的字符串不需要匹配用於實例化對象的字符串..好嗎? – Jean
@Jean對,你可以將它分配給任何你想要的。但是,這可能足以滿足您的特定需求。 –