Verilog에서 표현식 비트 너비를 자르는 방법은 무엇입니까?


11

다음과 같은 표현을 고려하십시오.

assign x = func(A) ^ func(B);

여기서 func의 출력은 32 비트이며 x는 16 비트의 와이어입니다. 결과 xor의 가장 낮은 16 비트 만 할당하고 싶습니다.

위의 코드는 이미 그렇게하지만 경고를 생성합니다. "명백한"접근 방식이 작동하지 않습니다.

assign x = (func(A) ^ func(B))[15:0]; // error: '[' is unexpected

답변:


8

특별히 우아하지는 않지만 다른 변수를 사용할 수 있습니다.

wire[31:0] y;

assign y = func(A) ^ func(B);
assign x = y[15:0];

더 나은 방법은 함수를 사용하는 것입니다.

function [15:0] trunc_32_to_16(input [31:0] val32);
  trunc_32_to_16 = val32[15:0];
endfunction

assign x = trunc_32_to_16(func(A) ^ func(B));

나는 그것보다 더 좋은 무언가가 있기를 바라고 있었다.
user23106

5

귀하의 예에서, 당신은 암시 적으로 비트를 자르고 있습니다.

잘림을 명시 적으로 만들면 시뮬레이션 / 린트 / 합성에서 경고를 제거 할 수 있습니다.

이 인라인을 수행하는 한 가지 방법은 캐스트 연산자를 사용하는 것입니다. 예 :

typedef logic [15:0] HALF_WORD;
assign x = HALF_WORD'((func(A) ^ func(B));

이 접근 방식은 삭제되는 모든 비트가 0이라는 컨텍스트에서 명백한 경우 의미가 있습니다.

비트 중 일부가 0이 아닌 경우 이전 답변 에서 제안 된 @dwikle과 같은 중간 네트를 계속 사용하는 것이 좋습니다 . 비트를 실제로 버리는 것이 더 분명하기 때문입니다. 여기 다시 참조하십시오.

wire[31:0] y;

assign y = func(A) ^ func(B);
assign x = y[15:0];

1
나는 그것이 SystemVerilog에서만 작동한다고 생각합니다. 흥미롭지 않은 재미있는.
Tom Carpenter

@TomCarpenter, 최신 통합 IEEE Std 1800 개정판 중 하나에서 사용할 수있는 전체 합성 가능한 Verilog를 사용하는 대신 IEEE Std 1364-2005에서 사용 가능한 Verilog의 하위 집합으로 제한하고 싶습니까? Verilog 표준이 2009 년 통일 된 SystemVerilog 표준에 포함 되었기 때문에 Verilog-2005 또는 명확하게 설명 할 수 있습니다.
mattgately

3

이것이 줄 수를 줄이는 데 도움이 될 것이라고 생각합니다.

wire [15:0] not_used ;

assign {not_used, x} = (func(A) ^ func(B));

그래도 할당에 유효한지 확실하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.