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에서 중간 결과의 데이터 유형이 무엇인지에 대한 문서가 있습니까? 아직 정확한 용어를 모르기 때문에 검색하기가 어렵습니다.
사양 자체입니다. 이것은 논리 디자인 클래스를위한 것이므로 서명 된 벡터로 a와 b를 선언 할 필요는 없다고 생각합니다 (2의 보수가 어떻게 작동하는지 이해할 필요가 있음).하지만 향후 할당을 알면 좋습니다. 재미있는 종이, 아마도 내 고통스러운 디버깅에서 내 미래의 자아를 저장. 감사! –
'a + b'의 너비는 실제로 상황에 따라 다릅니다. 'max (sizeof (b), sizeof (b))'보다 1 비트 큰 표현식에 할당되면 표현식은 더 넓은 크기로 평가됩니다. IEEE 1364는이 예제를 명시 적으로 나열하지만, 컨텍스트 규칙을 자체 결정된 경우만큼 엄격하게 설명하지는 않습니다. –