verilog 하면서 제일 헷갈리는게 signed arithmetic 인거같다
매번 할 때 마다 나만의 부호 bit 체계로 하려다보니 설계할때 너무 비효율적이라
이번에 공부하면서 제대로 해볼려고 한다.
우선 참고한 자료는 첨부파일 있으니 참조
우선 signed 선언은 일반적으로 선언하는 것뒤에 signed 붙이면 그걸로 끝나는 것같다
reg → reg signed
wire → wire signed
해당 파일에서는 3bit 기준으로 정리를 했는데
예제에 쓰인 data는 위와 같은 표를 가지고 있고
음수는 2의 보수취하면 되는 것으로 보임
그리고 일반적으로 3bit + 3bit하면 4bit이 되는 것이 당연한 규칙
만약에 손으로 연산할 경우를 고려한건지 아니면 실제 연산을 고려한 건지 모르겠지만 하나하나 차분히 보면
연산할 때는 sign bit 확장해서 그냥 더해주는 작업을 하는 것 같다
그리고 추가로 생긴 bit는 삭제를 하는 것으로 보이며,
overflow, underflow case 정리를 위해 아래와 같이 정리를 해봄
이걸보면 최상위 bit를 제외하면 4bit으로 해당data가 제대로 연산이 되는 것을 확인 할수 있고
00 → 양수 범위내에 존재
11 → 음수 범위내에 존재
01 → overflow
10 → underflow
다시 설명하면 원래 3bit 기준 -4 ~ +3 까지가 data range 이고
출력값을 3bit으로 제한을 두었을 때, +6은 overflow가 발생한 것인데 이때
[3:2] bit를 보면 01로 overflow 조건이 된 것을 확인 할 수 가 있다
만약에 4bit 기준으로 한다면 [3] sign [2:0]을 data로 한다면 위의 계산된 값들이 모두 제대로 맞는 것을 확인 할 수 있다
verilog 2001규칙으로는 이렇게 쓴다고 하고
아까 말한대로1995일 경우는 signed를 안붙여주기 때문에
이걸 보면 최상위 비트를 signed라고 생각해서 복사해서 더하는 것이다
그리고 unsigned data와 signed data를 같이 더하는 형태일 경우는 casting을 해서 더하는 것으로 보이는데
현재 일하는 부서에서는 casting을 따로 사용하지는 않고 처음 설계부터 하나로 통일하여 사용한다
위에서 carry에 1'b0 붙여준거는 sign 부호이며
이걸보면 어떻게 쓰든 상관 없는 것으로 보인다
example 5에서 signed casting 안하면 오동작 및 합성 area 가 더 작다고 하니 유의가 필요하다
곱하기는 아래와 같이 한다고 하고,
부호비트가 1인것과 연산할떄는 2의 보수취해서 signed extend하는 것 같은데
무조건 하는게 아니라 multiplier의 부호가 있을 경우에만 하는 것 같고
나머지는 그냥 sign 복사하는 것을 보임
코드로 보면 엄청나게 복잡한데 signed로하면 아래처럼 간단히 되는 것 같다
signed 연산할꺼라면 example7로 하는게 시간을 줄일 수 있는 방법으로 보인다
'digital logic > knowlege' 카테고리의 다른 글
관성지연, 전달지연 (2) | 2020.10.20 |
---|---|
blocking vs non-blocking assignment(feat. race condition) (0) | 2020.10.19 |
Clock gating (0) | 2020.10.14 |
CDC(Clock domain crossing) (3) | 2020.10.13 |
댓글