2014-09-21 11 views
1
내 확인 환경에서

다른 레지스터 유형은 색인 만 다른 거의 동일한 이름을 가지고 있습니다 (예 : timer_load_0, timer_load_1 등). string ('name'of 그 인덱스가없는 레지스터)와 uint (레지스터의 인덱스)을 결합하여 "연결된"레지스터 유형의 변수를 반환합니다. 예를 들어 내가 명령하는 것이 싶습니다Specman DAC 매크로 : 다른 유형의 2 개 입력 (uint 및 string)을 정의하는 방법은 무엇입니까?

my_idx : uint = 0; 
create_reg "timer_load" my_idx; 

변수 timer_load_0를 반환합니다.

내 매크로 코드 :

define <var_by_idx'action> "create_reg <name'any> <idx'exp>" as computed { 
    var idx : uint = <idx'exp>.as_a(uint); 
    result = appendf("%s_%d",<name'any>, idx); 
}; 

컴파일 에러가 나는 얻을 :

Error: Looking for a number but found 'my_idx' 
       at line 45 in @macros 
    var idx : uint = <idx'exp>.as_a(uint); 
       during execution of a define-as-computed macro: 
       at line 380 in @timer_monitor 
      create_reg "timer_load" my_idx; 

매크로 string로 .. 어떤 도움 주셔서 감사합니다 my_idxuint 변수로하지만, 인식하지 못하는 .

+1

이 매크로로 정확히 무엇을 달성하려고하는지 명확하지 않습니다. 일반적으로 DAC 매크로는 (실행시가 아닌) 파싱하는 동안 실행되며, 일반적으로 일부 합법적 인 e 코드를 포함하고 더 파싱되는 문자열을 반환해야합니다. 이 예제에서 매크로는 문자열을 반환하지 않습니다. 정확히 여기서 무엇을하려고합니까? 런타임에 어떤 일이 발생할 것으로 예상됩니까? –

+1

안녕하세요, Yuri 님, 메모에 따라 수정 된 질문으로 수정했습니다. – Halona

+1

이전에 묻고 계신 질문에서 내가하고 싶은 것을 얻을 수 있다고 생각합니다. 두 하위 유형 모두에 동일한 필드가 정의되어있어 액세스 할 수 있도록 캐스트해야합니다. 이 경우 리플렉션을 사용할 수는 있지만 런타임 성능면에서 볼 때 더 비쌉니다. –

답변

2

원하는 매크로를 수행하는 매크로는 상수 값만 전달할 수 있으므로 <idx'num>으로 다시 변경해야합니다.

Yuri가 언급했듯이 계산 된 매크로는 컴파일 타임에 확장되므로 정의하십시오. 즉 created_reg에 할당 할 변수 유형을 알기 위해 매크로에 idx에 대한 상수 값을 가져와야 함을 의미합니다. 매크로에 전달하고자하는 변수 idx의 값은 실행시에만 설정되며 너무 늦습니다.

+1

안녕 튜더, 나는 질문을 편집했고 as_a (uint)로 코드를 수정했지만 여전히 컴파일 오류가 있습니다. – Halona

+1

@Halona 방금 알기 때문에 당신이 원하는 것은 불가능하다는 것을 깨달았습니다. 원하는 하위 유형 (TIMER_LOAD_0 또는 TIMER_LOAD_1)을 컴파일하십시오. 이를 위해 변수를 사용할 수 없습니다. –

+0

매크로가 상수 (예 : 'create_reg'timer_load '1')와 함께 사용 되더라도 예상 결과가 무엇인지 아직 명확하지 않습니다. 매크로는 으로 선언되었지만 'timer_load_1'은 작업이 아닙니다. 그렇다면 실제로 무엇을해야합니까? 필드를 선언 하시겠습니까? 지역 변수를 선언 하시겠습니까? 다른 건 없니? –