작성
·
23
1
안녕하세요 맛비님
베릴로그 코딩을 하면서 항상 궁금했던 것이 있어 질문드립니다.
제가 HW 언어를 공부하면서 느낀 점은
흔히 코딩을 처음 접하는 SW의 C언어와 같이 구현을 하면 안된다는 것입니다.
이렇게 생각한 이유는 HW는 병렬 처리가 가능하기 때문인데요!
이렇다보니 SW언어에서의 for 구문과 HW의 for 구문이 어떻게 다르게 동작하는지 궁금했습니다.
HW 언어의 for문은 시뮬레이션 환경에서 유효한 것인지? 합성이 될수도 안될수도 있다고 하여 질문드립니다.
HW 언어에서 for 문이 합성이 된다면
for loop에서의 동작은 병렬로 동시에 처리되는지 아니면 시뮬레이션 처럼 clk에 동기화 시킨다면 실제로 동기화되어 동작하는지 궁금합니다.
또한 HW 언어에서의 for문을 어떤식으로 접근하면 설계하는데 도움이 될지 궁금합니다.
감사합니다.
답변 3
0
안녕하세요 🙂
중복 질문인 것 같아서 하나만 달겠습니다.
HW 언어의 for문은 처음 접하면 SW의 for문과 비슷하게 보이지만, 실제 동작 원리와 합성 방식은 상당히 다릅니다. 특히 병렬 하드웨어 설계에서는 이 차이를 이해하지 않으면 의도와 다른 회로가 만들어질 수 있습니다. 질문 주신 1, 2, 3 순서에 맞춰 정리해드리겠습니다.
HW 언어의 for문은 시뮬레이션 환경에서도 유효하고 합성도 가능합니다. 다만 SW처럼 실행 시간에 반복하는 개념이 아니라,합성 시점에 반복이 풀려서 동일한 구조의 회로가 여러 벌 생성되는 방식입니다. 그래서 루프 횟수가 고정돼 있어야 하고, 합성 시점에 인덱스 값이 정해질 수 있어야 합니다. 조건이나 횟수가 동적으로 변하면 합성이 안 될 수 있습니다.
합성된 for문은 병렬 구조로 동작합니다. 조합 논리 안에 있으면 모든 반복이 동시에 평가되고, 순차 논리 안에 있으면 전개된 회로들이 클럭에 맞춰 동시에 갱신됩니다. 즉, 시뮬레이션에서처럼 한 번 돌고 다음 클럭에서 또 도는 순차적인 루프 실행이 아니라, 한 클럭 이벤트 시점에 전체가 병렬로 동작하는 구조입니다. 실제로 순차 실행을 하려면 카운터와 상태머신으로 직접 설계해야 합니다.
설계에서는 for문을 동작 순서를 만드는 도구가 아니라 동일한 회로를 반복적으로 작성하기 위한 문법적 편의 기능으로 생각하는 게 좋습니다. 반복 횟수는 작고 고정된 값으로 두고, 큰 반복문은 전개 후의 리소스와 타이밍을 고려해야 합니다. 순차 처리가 필요하면 FSM을 설계해서 처리하고, for문은 가독성과 코드 작성량을 줄이는 용도로 쓰는 것이 안전합니다.
결론적으로, HW 언어에서 for문은 SW의 순차 반복과는 다른, 병렬 하드웨어 생성의 개념이라는 점을 이해하고 사용하시면 설계 시 혼동을 줄일 수 있습니다.
즐공하세요!
0
안녕하세요 맛비님
베릴로그 코딩을 하면서 항상 궁금했던 것이 있어 질문드립니다.
제가 HW 언어를 공부하면서 느낀 점은
흔히 코딩을 처음 접하는 SW의 C언어와 같이 구현을 하면 안된다는 것입니다.
이렇게 생각한 이유는 HW는 병렬 처리가 가능하기 때문인데요!
이렇다보니 SW언어에서의 for 구문과 HW의 for 구문이 어떻게 다르게 동작하는지 궁금했습니다.
HW 언어의 for문은 시뮬레이션 환경에서 유효한 것인지? 합성이 될수도 안될수도 있다고 하여 질문드립니다.
HW 언어에서 for 문이 합성이 된다면
for loop에서의 동작은 병렬로 동시에 처리되는지 아니면 시뮬레이션 처럼 clk에 동기화 시킨다면 실제로 동기화되어 동작하는지 궁금합니다.
또한 HW 언어에서의 for문을 어떤식으로 접근하면 설계하는데 도움이 될지 궁금합니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. 지닝님께서 질문하신 Verilog의 for문에 대한 내용을 이해해보도록 하겠습니다.
HW 언어, 특히 Verilog의 for문은 SW의 그것과는 컴파일 후의 동작 측면에서 차이가 있습니다. 이를 명확히 짚고 넘어가도록 하겠습니다.
HW 언어에서의 for문은 합성이 가능하면서도 시뮬레이션에도 유효합니다. 그러나 for문이 합성 가능한지는 사용 방식에 따라 달라질 수 있습니다. 합성이 가능한 for문을 사용하면 반복적인 하드웨어 구조를 효율적으로 생성할 수 있습니다.
Verilog에서 for문을 사용하면, 설계자가 정의한 인스턴스들이 고정된 하드웨어 형태로 작성됩니다. 즉, 합성 시에는 병렬로 여러 하드웨어 블록을 생성하여 동시에 동작할 수 있습니다. 그러나 시뮬레이션에서의 동작은 시계 신호(clk)에 따라 동기로 동작하여 원하는 결과를 얻을 수 있게 됩니다.
관련 예제를 통해 더 깊이 이해하시길 권장드립니다. 아래의 링크에서 비슷한 주제의 질문에 대한 답변을 참고하실 수 있습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
감사합니다