2014-04-24 5 views
1

배열 및 구조체에 대한 SystemVerilog의 비트 스트림 캐스팅이 매우 안전하지 않은 것처럼 보입니다.SystemVerilog에서 배열을 올바르게 캐스팅하는 방법은 무엇입니까?

는 예를 들어, 다음 주조 문제는 실행시에 잡힐 것 (시뮬레이션에 시간이 될 수있는) :

bit [31:0] bit_queue[$]; 
logic [31:0] logic_array[5]; 
for (int i = 0; i < 10; i++) begin 
    bit_queue[i] = $urandom; 
end 

if (catch_issue) begin 
    typedef logic [31:0] logic_array_t [5]; 
    logic_array = logic_array_t'(bit_queue); // <-- ISSUE 
end 

비트 스트림 캐스팅을 수행하기위한 적절한 "안전"절차가 있습니까? 컴파일 타임에 잡히거나 런타임에 안전하게 처리되는 문제는 어디에 있습니까? 아니면이 경우 언어가 깨졌습니까?

예제 코드 위의 EDA 놀이터에 : http://www.edaplayground.com/x/2tp

답변

2

, 그것은 동적 크기의 변수를 포함하는 3 스트

if ($bits(bit_queue) == $bits(logic_array)) 
    logic_array = logic_array_t'(bit_queue); 
else 
    $error("sizes do not match"); 

와 런타임에 호환성을 확인하기 위해 사용자에게 달려있다, 당신은 컴파일 시간 오류를 얻을 수 있습니다 유효한 할당이지만 가능한 크기가있는 경우, 형변환이 발생할 때까지 크기가 변경 될 수 있기 때문에 형변환이 발생할 때까지 검사를 수행 할 수 없습니다.

0

당신이, 내가 그것을 위해 평가되지 않기 때문에 컴파일러가 정적 (이를 확인할 수 있다고 생각하지 않습니다 RHS에 (가변 크기를 의미) 큐를 사용하고 있기 때문에 고리). typedef를 고정 크기의 압축되지 않은 배열> 5 개 항목으로 변경하면 컴파일 타임 오류가 발생합니다. 더 가능한 배열 크기는 생산하지 않을 것이다 경우 $ 캐스트와 유사