2016-10-27 4 views
4

레코드의 std_logic_vector 표현을 반환하는 VHDL 함수가 있고 그 std_logic_vector의 길이를 원합니다. 함수에 직접 길이 속성을 사용할 수 있습니다. 왜 ModelSim에서 경고 메시지가 나타 납니까? 나는 미묘한 문제들을 초청하고 있는가? 경고 텍스트를 검색하는 것이 도움이된다는 것을 이해하지 못했습니다.VHDL - 함수에서 길이 속성을 직접 사용하면 경고가 발생하는 이유는 무엇입니까?

my_function_returns_slv(my_record)'length; 

** 경고 : ../src/my.vhd(line#) (VCOM-1515 사전 규정 된 속성 "길이"의) 접두사이다 함수 호출 "my_function_returns_slv"

필자는 레코드 요소의 std_logic_vector 표현을 연결하여 출력을 어셈블하는 함수를 작성했습니다. 레코드의 길이는 컴파일 타임에 고정되어 있지만 길이를 하드 코딩하고 싶지는 않습니다. 함수 출력을 사용하기위한 신호를 생성하려면 길이가 필요합니다. 그래서 출력을 유지하기 위해 제한되지 않은 신호를 선언 할 수 없기 때문에 '함수의 출력 길이'를 호출 할 수 없습니다 (예 : 함수 출력을 보유하는 신호의 길이를 호출). std_logic_vector의 길이를 계산하는 비슷한 함수를 작성할 수는 있지만 중요한 코드를 추가 할 것입니다. 특히 레코드 수가 많습니다. ModelSim 경고를 받아들이고 계속해야합니까? 내 레코드의 비트 너비를 모으기 위해 함수를 작성하는 추가 코드를 처리해야합니까? 더 좋은 해결책이 있습니까?

도움 기록 팩/압축 풀기 서브 프로그램은 내가 사용하고 있어요 :

http://www.eda-twiki.org/twiki/pub/P1076/RecordReflectionToSlv/standard_functions.vhd

감사합니다!

답변

2

함수에 직접 'length 특성을 사용하는 것은 기본 출력보다 함수 결과의 다른 부분을 취하는 것으로 볼 수 있습니다. 따라서 개념적 관점에서 보면 아무 문제가 없어야합니다.

그래서 ModelSim 경고를 받아 들일 것이지만 도구가 구성에 대해 걱정한다는 표시로 받아 들여서 다른 도구 (예 : 합성 도구 및 코드 검사기는 함수 호출시 직접이 속성을 사용합니다.

function len(slv : std_logic_vector) return natural is 
begin 
    return slv'length; 
end function; 

다음이이 ModelSim을 경고가 발생하지 않습니다 :

는 같은 기능을함으로써 ModelSim을 경고를 피할 수 있다는 것을 나타납니다

signal MY_LEN : natural := len(slv_not(CONST)); 

그래서를 방지 할 수있는 이러한 캡슐화를 사용하는 경고는 경고가 처음에는 조금 희박하다는 것을 확인합니다.

+1

'my_function_returns_slv (my_record)'길이가 유효한지 여부는 '길이 속성 접두사 요구 사항을 Ada 83 LRM의 -1987 LRM으로 옮겨 놓는 오타 (typo)에서 비롯됩니다. [Issue Report 1005 (-1993)] (http://web.archive.org/web/20120217010956/http://www.eda.org/isac/IRs-VHDL-93/IR1005.txt) - 오타 결코 고정되어 있지 않다는 것을 의미하는 근거는 의미 일치가 아니어야하고 "배열 객체에 적합 함"은 어디에도 정의되어 있지 않으며 "배열 유형에 대해서는"정의되어 있지 않습니다. – user1155120

+0

감사합니다. @ user1155120! 저는 LRM과 표준 과정에 대해 알기 시작했습니다. 이 역사적인 정보는 나에게 매우 흥미 롭습니다. –

+1

고맙습니다 @ 모르 텐! 함수를 사용하여 'length'호출을 캡슐화하면 내 환경에서도 경고가 제거됩니다. 나는 신호를 할당 할 필요가 있다고 생각했다. 얼마나 창조적 인 솔루션인가! 나는 또한 나의 합성 도구 (Quartus)가 경고와 함께 my_func() 길이를 표시하지 않는다고 후손을 위해보고 할 것이라고 생각했다. –

1

"함수 출력을 사용하기 위해 신호를 생성하는 데 길이가 필요합니다. 그래서 함수의 출력에서 ​​length를 호출 할 수 없습니다 (예 : 함수 출력을 포함하는 신호의 길이를 호출). 출력을 유지하기 위해 제한되지 않은 신호를 선언 할 수는 없습니다. "

크기 조정 신호에 대한 주변의 재미 작업은 다음과 같습니다

constant MY_CONST : std_logic_vector := my_function_returns_slv(my_record) ; 
signal MySig : std_logic_vector(MY_CONST'range) := MY_CONST ; 

우리는 신호를 구속하고 초기화에서 자신의 제약을받을 수 있습니다 VHDL-2017에 대한 LCS 있습니다.