1. 중첩된 루프는 피한다 : 소프트웨어에서 루프의 처리는 그냥 행을 반복해서 연산하는 것이지만, 하드웨어 설계에서 루프는 피드백이 있는 하드웨어를 의미한다. 때문에 중첩된 루프 구조는 최적화에 바람직하지 않다,
2. 중첩된 if문은 피한다 : if문은 하드웨어에서 로직으로 구현된다. 따라서 if문이 중첩될수록 로직의 아웃풋이 다른 로직의 인풋으로 들어가면서 로직 레벨이 증가한다. 로직 레벨이 증가할수록 딜레이가 커지기 때문에 타이밍 에러가 발생할 확률이 높다.
3. if문보다는 case문
- if/else의 반복도 마찬가지로 로직 레벨을 증가시킨다. case문을 쓰면 입력이 여러개인 하나의 로직을 사용하기 때문에 로직 레벨이 낮아짐.
4. 괄호 사용
z<= A+B+C+D 대신 z<= (A+B)+(C+D)
- 똑같이 세번의 연산이 수행되지만 후자가 더 빠르다. 앞의 경우는 A+B 수행 후 그 값에 C를 더하고 다시 D를 더하는 순서로 이루어짐. 따라서 앞에 연산이 끝나는 것을 계속 기다려야 한다. 후자의 경우는 A+B와 C+D가 독립적으로 연산되므로 동시에 수행 가능하고 그 두값을 마지막에 더하면 된다. 따라서 전자는 3싸이클이 필요하지만 후자는 2싸이클로 줄어든다.
5. Latch 사용을 피하자.
6. 동기식 RESET을 사용하자.
7. CLK 갯수를 가능한한 줄이자. 적은 수의 클락을 사용해야 오작동 확률 줄어들고 모두 싱크가 잘맞음. 또한 엣지는 가급적 한종류만.
8. 서로 다른 CLK을 사용하는 회로를 경유하는 신호가 있다면 가급적 synchronization 회로를 넣는것이 좋다.
9. Top-down design을 사용하자. 펑션이나 클럭에 따라 여러 개의 모듈을 따로따로 만들자.
10. FSM을 코딩할 때 Next State Logic과 State register, state machine output 의 부분으롤 나눌 수 있는데 이 각 부분을 서로 다른 always문, 즉 프로세스에 코딩하라.
11. FSM의 state를 parameter로 인코딩할 경우 두가지 방법이 있다.
- binary encoding : ex) state 5개일 경우 3bit만 사용하여 000, 001, 010, 011, 100으로 인코딩
- one-hot encoding : ex) state 5개일 경우 5bit을 이용하여 00001,00010, 00100, 01000, 10000 으로
언뜻보면 바이너리 인코딩이 레지스터를 더 적게 쓰기 때문에 좋아보이지만 one-hot encoding을 쓰는 것이 좋다. 레지스터는 더 많이 쓰지만 next state logic을 구현하는 logic이 더 간단해지기 때문. 어차피 FPGA는 레지스터가 충분하기 때문에 로직을 더 줄이는 것이 이득.
'Circuit Design' 카테고리의 다른 글
[RTL] Equivalence Checking (0) | 2021.08.26 |
---|---|
[Verilog] Signed, unsigned (2) | 2019.12.25 |
디지털집적회로 정리 (0) | 2018.05.06 |
집적설 정리 (0) | 2018.05.06 |
MOSFET - 기본 구조 및 동작, Threshold voltage (3) | 2018.05.04 |