2011-11-04 3 views
3

Verilog에서 부호있는 비교기를 만들고 있습니다. 다음은 코드입니다.Verilog 산술 연산 결과의 크기

module signedComparator(a0, a1, a2, b0, b1, b2, G, E, L); 
input a0, a1, a2, b0, b1, b2; 
output reg G, E, L; 

[email protected](a0 or a1 or a2 or b0 or b1 or b2) 
begin 

    if(a2 == 0 && b2 == 0) //both a and b >= 0 
    begin 
     L <= {a1,a0} < {b1,b0}; 
     G <= {a1,a0} > {b1,b0}; 
     E <= {a1,a0} == {b1,b0}; 
    end 
    else if(a2 == 1 && b2 == 0) //a negative, b >= 0 
    begin 
     L <= 1; 
     G <= 0; 
     E <= 0; 
    end 
    else if(a2 == 0 && b2 == 1) //a >= 0, b negative 
    begin 
     L <= 0; 
     G <= 1; 
     E <= 0; 
    end 
    else //both a and b negative 
    begin 
     L <= (~{a1,a0} + 1) > (~{b1,b0} + 1); 
     G <= (~{a1,a0} + 1) < (~{b1,b0} + 1); 
     E <= (~{a1,a0} + 1) == (~{b1,b0} + 1); 
    end 

end 
endmodule 

벡터를 추가 할 때 궁금한 점은 중간 결과의 길이는 얼마입니까? 나는 마지막 사건 (L <= (~{a1,a0} + 1) > (~{b1,b0} + 1);)에 대해 우려하고있다. ~ {a1, a0}에 1을 더하면 결과의 길이는 3 비트가 될 것입니까, 아니면 {1,1} + 1 = {0,0}입니까? Verilog에서 중간 결과의 데이터 유형이 무엇인지에 대한 문서가 있습니까? 아직 정확한 용어를 모르기 때문에 검색하기가 어렵습니다.

답변

5

나는 합성을위한 것으로 가정하고 코드에 대한 몇 가지 의견이 있습니다. 개별 비트를 모듈의 입력으로 사용한 다음 나중에 연결을 사용하여 벡터를 만드는 것처럼 보입니다. 포트를 부호있는 벡터로 선언하고 직접 비교하면됩니다.

input signed [2:0] a,b; 
... 
if(a == b) 
... 
else if(a > b) 
... 
else 
... 

또한 조합 논리를 모델링하기 위해 비 차단 할당을 사용하고 있습니다. 이 코드는 게시 한 코드에서 작동하지만 실제로이 방식으로 사용하면 안됩니다. 클록 처리를 통해 동기식 로직을 모델링하는 데 훨씬 효과적입니다. 합성을위한 좋은 코딩 스타일을 요약 한 good paper이 있습니다.

벡터를 추가 할 때 궁금한 점은 중간 결과의 길이는 얼마입니까?

스펙에는 피연산자와 컨텍스트에 따라 테이블이 있습니다.

  • 정수 : 크기를 지정하지 않은 상수들은 적어도 32 비트
  • {A, B}이다 :는 sizeof (a) +는 sizeof (b)
  • ~ {A}는 sizeof (a)
  • a + b : max (sizeof (a), sizeof (b))

따라서 비교 피연산자는 둘 다 (적어도) 32 비트가됩니다. 값 앞에 틱 (tick)을 사용하여 명시 적으로 고정 크기를 할당 할 수 있습니다.

4'b1 // 0001 Binary 1 
4'd1 // 0001 Decimal 1 
4'd8 // 1000 Decimal 8 
1'b1 // 1 Binary 1 
'b1 // The same as 1, tick here only specifies dec/oct/bin format 

이 문서는 어딘가를 Verilog에 중간 결과의 데이터 유형이 될 것입니다 무엇을 위해 있는가? 이 같은 내용은 발견했습니다 지금까지 최고의 자원으로

는 I가 더 찾고 정확히 내가했다, 멋진 대답 IEEE 1364

+0

사양 자체입니다. 이것은 논리 디자인 클래스를위한 것이므로 서명 된 벡터로 a와 b를 선언 할 필요는 없다고 생각합니다 (2의 보수가 어떻게 작동하는지 이해할 필요가 있음).하지만 향후 할당을 알면 좋습니다. 재미있는 종이, 아마도 내 고통스러운 디버깅에서 내 미래의 자아를 저장. 감사! –

+0

'a + b'의 너비는 실제로 상황에 따라 다릅니다. 'max (sizeof (b), sizeof (b))'보다 1 비트 큰 표현식에 할당되면 표현식은 더 넓은 크기로 평가됩니다. IEEE 1364는이 예제를 명시 적으로 나열하지만, ​​컨텍스트 규칙을 자체 결정된 경우만큼 엄격하게 설명하지는 않습니다. –

관련 문제