메소드가 SystemVerilog에서 작동하는 객체의 이름을 얻을 수있는 방법이 있습니까? 당신이 설명하는대로 정확하게 뭔가가 있다면 높은 수준, 나는 확실하지 않다 뭔가 문자열을SystemVerilog에서 작동중인 메소드를 사용하여 인스턴스의 이름을 얻으려면 어떻게해야합니까?
object1
메소드가 SystemVerilog에서 작동하는 객체의 이름을 얻을 수있는 방법이 있습니까? 당신이 설명하는대로 정확하게 뭔가가 있다면 높은 수준, 나는 확실하지 않다 뭔가 문자열을SystemVerilog에서 작동중인 메소드를 사용하여 인스턴스의 이름을 얻으려면 어떻게해야합니까?
object1
를 인쇄해야
object1.printName()
를 구현처럼
.
그러나 시스템 작업은 $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
출력 : %m
의 출력이 유용
top.test_inst.foo.printName
top.test_inst.printName
경우 $sformatf
를 사용하여 문자열을 캡처 한 후 수정 또는 무엇이든 함께 할 수 있습니다.
인스턴스에는 이름이 없습니다. someObject
의 동일한 인스턴스에
someObject a
someObject b
initial begin
a = new();
b = a;
a.printName();
b.printName();
end
a
및 b
점 :이 코드를 생각해 보자. 우리는 하나만 만들었습니다. 따라서 두 호출은 같은 이름을보고해야하지만 우리가 호출 할 핸들 이름을보고하기를 원합니다. 그건 불가능합니다.
OVM/UVM 개체에는 인스턴스 이름이 들어있는 멤버 변수가 포함되어 있습니다. 시공시 주어진 것이거나 set_name()
을 사용하여 설정할 수 있습니다. get_name()
을 사용하여 읽을 수 있습니다. 당신이 말하는 객체가 OVM/UVM이 아니더라도 유사한 시스템을 사용할 수 있습니다.
OVM/UVM을 사용하는 경우 get_full_name()/get_name()은 테스트 벤치 계층 구조의 구성 요소 이름을 반환합니다.
개체가 동적이므로 개체에 대한 질문이 유효하지 않습니다.
누군가가 객체 이름을 구현하려는 경우 모든 객체의 생성자에 "문자열 이름"을 전달하므로 객체가 new'd 인 경우 부모는 이름이 무엇인지 말할 것입니다. 새로운 (문자열 이름 = "", ovm_component 부모 = NULL)
이가에 기본 클래스에서 사용하는 기능 : 당신이 OVM/UVM의 모든 구성 요소를 보면
, 당신은 생성자 서명을 볼 수 있습니다 구현 get_full_name()/get_name()
이것은 내가 본 것입니다. 그러나 할당 된 문자열은 객체를 인스턴스화하는 데 사용 된 문자열과 일치 할 필요가 없습니다. – Jean
@Jean 맞아요, 당신이 원하는대로 지정할 수 있습니다. 그러나 그것은 귀하의 특별한 필요를 충족시키기에 충분할 수 있습니다. –