python에서 사용하는 weight나 bias는 전부 floating point로 구성이 되어있습니다
하지만 이를 그대로 hdl로 구현하기에는 불필요한 logic이 너무 클 것 같다고 생각하여
우선 fixed point로 해볼려고 했으나
이왕 하는 김에 floating point로 똑같이 설계해서 SW vs HW 결과값을 비교하는 걸 시작하려 합니다
1. floating point 구조
floating32는 너무 size가 클 것같아서 우선 floating16 spec 찾아보니 설계를 하려하고
찾아보니 아래와 같은 구조를 가집니다
- sign bit 1
- 지수 bit 5
- 가수 bit 10
이걸 유효숫자 형태로 표현한다음에 더하거나 곱하는 식으로 하는것인데
인터넷에 설명된 자료는 대부분이 32bit 기준인데 이거랑은 bit만 다르고 다 똑같은거 같고
exponent bias만 15로 다른거 같습니다
찾아보니깐 이런식으로 지수가 bias되서 저장이 되는 것 같고
부동소수점에서는 0을 표현할 수가 없어서 지수 0, 31 둘중 하나는 0으로 해버리는 것입니다
2. floating point adder 설계(data gen)
해당 float16을 연산이 가능한 logic을 hdl로 설계시작을 해봅시다
github나 구글링해보면 blocking assignment로 설계를 해놔서
나는 pipeline 동작하도록 한번 설계를 해보았습니다
이 설계를 한것이 제대로 동작하는지 test set을 만들어야 하기 때문에
다시 python에서 예제 testset을 10개정도 생성하기로 합시다
맨아래 있는 코드는 구글 검색하다보니깐 누가 시도해봤길래 가져와서
값 넣어 봤을때는 손으로 계산한 것과 똑같이 나오는 것을 확인을 하면~
이 예제에선 지수(exponent)가 19 이기 때문에 bias 15 빼면 4가 됩니다
그리서 가수에 1을 맨앞에 붙이고 정수를 5bit를 가져가게 되면 아래 처럼 나오게됩니다
엑셀로 돌려보니 반올림만 안되어있을 뿐 똑같은 것을 확인하였고
실험을 좀 더 해보기 위해 10개 정도 test set을 만드는 작업을 했습니다
A + B = C 먼저 만들어 보고
이걸 입력받을수 있도록 파일로 빼서 testbench에 넣어서 돌리면 됩니다
참고로 하드웨어 설계는 overflow, underflow 처리는 안했으며
만든 test set을 엑셀로 뽑아서 test bench에 몇개만 test 해보는 걸로 하기로 합시다
이렇게 엑셀로 만든걸 하드웨어에 넣기위해서
이렇게 변환을 해서 test bench에 삽입을 하면 됩니다
3. floating point adder 설계(verilog)
우선 floating point adder만 설계를 아래와 같이 진행하였습니다
이런식으로 data 구분해서 연산하는 식으로 하고
반올림은 우선 제외 시켰습니다
4. simulation result
simulation을 돌리면 아래와 같이 나옵니다
<input data - data_c>
<output data - data_result>
2개의 data가 동일하게 나오는 것을 확인했습니다
input data가 (17,840) → (16,510) → (18,233) ... 나오고
output datark가 (17,840) → (16,510) → (18,232) ... 나오는 것을보면 동일하다고 생각하면 됩니다
(정확도는 overflow,underflow 차이일 듯)
이것으로 우선 floating point adder 설계 마무리~
'language > Verilog' 카테고리의 다른 글
[verilog] hardware realtime DCT (0) | 2021.01.26 |
---|---|
[verilog] 동일 logic LUT 비교 (0) | 2021.01.26 |
[verilog] 16bit floating point hdl구현(multiplier) (0) | 2021.01.25 |
[verilog] memory 및 image filter 설계 (4) | 2021.01.24 |
[verilog] image 입/출력 설계 (6) | 2021.01.23 |
댓글