2017-10-03 6 views
0

때로는 슬라이스의 너비가 0이 아닌 경우 배열 슬라이스를 점검하려는 상황이 매개 변수화 된 코드로 나타납니다. 나는 다음과 같이 쓸 수 있습니다 :도달 할 수없는 평가에서 Verilog 널/유효하지 않은 슬라이스 범위

parameter SLICE_WIDTH; 
parameter SLICE_BASE; 
logic [my_array_size : 0] my_array; 
//... 
always_ff @ (posedge clk) begin 
    if (SLICE_WIDTH==0 || my_array[SLICE_BASE+:SLICE_WIDTH]==0) begin 
    //alternately "if (SLICE_WIDTH==0 || my_array[SLICE_WIDTH+SLICE_BASE-1:SLICE_BASE]==0) begin" 
     //do something 
    end 
    else begin 
     //do something else 
    end 
end 

이것은 VHDL을 작성할 때 이러한 상황을 처리 한 방법입니다. 유효하지 않은 배열 범위가 평가되는 것을 방지하기 위해 상수 평가에서 단락에 의존합니다. 작성된 시스템 Verilog에서 QuestaSim의 "range select of parted is reversed"오류 및 "range width is zero"오류가 발생합니다.

//do something의 내용을 여러 개의 if-generate 구문으로 복제하지 않고 대부분의 도구에서 허용하는 null 범위를 명확하게 처리 할 수있는 방법이 있습니까? 당신이 할 수있는 일

답변

0

는 MASK은 0

이를 테스트하지 않았나요 때 내 식으로 플레이 할 수 있도록

parameter SLICE_WIDTH; 
parameter SLICE_BASE; 
localparam logic [my_array_size : 0] MASK) = 2**SLICE_WIDTH - 1 << SLICE_BASE; 
logic [my_array_size : 0] my_array; 
//... 
always_ff @ (posedge clk) 
    if (my_array&MASK) begin 
     //do something 
    end 
    else begin 
     //do something else 
    end 

합성 도구, 멀리 논리를 최적화 마스킹 매개 변수를 만드는 것입니다 .

+0

이 인스턴스에 대해 마스킹의 변형을 사용할 수 있었지만, 일반적으로 더 깨끗한 사례는 없다는 것이 유감입니다. 순차 논리의 여러 행을 복제하지 않고 중간 넷에 조건을 결합하여 응축하는 데 생성을 사용할 수 있다고 가정합니다. – QuantumRipple

0

Verilog에서 처리하는 일반적인 방법은 '생성'블록입니다.

parameter SLICE_WIDTH; 
parameter SLICE_BASE; 

logic [my_array_size : 0] my_array; 
//... 

// generate 
if (SLICE_WIDTH==0) begin 
    // do something here 
end 
else begin 
    always_ff @ (posedge clk) begin 
     if (my_array[SLICE_BASE+:SLICE_WIDTH]==0) begin 
     //do something 
     end 
     else begin 
     //do something else 
     end 
    end 
end // endgenerate 

SV에서는 generate/endgenerate 키워드를 사용할 필요가 없습니다.

+0

OP는 * 뭔가 코드 블록을 복제하는 것을 포함하지 않는 솔루션을 요구했습니다. –

+0

이 솔루션은 Verilog에서 이러한 문제를 해결할 수있는 검증 된 유일한 방법입니다. 나머지는 해킹이나 트릭 일 뿐이며 특정 경우에는 작동 할 수도 있습니다. – Serge