작성
·
38
0
안녕하세요 강의자님, 현재 FPGA Program 1 을 수강하고 있습니다.
수강을 하다가 Verilog 코딩 스타일에 궁금증과 조언을 듣고 싶어서 질문하게 되었습니다.
저도 이 강의를 들으면서 강의자님의 코딩 스타일을 배우고 싶어서 노력해왔고 현재는 익숙해진 상태입니다. 그런데 강의자님과 조금 다른 코딩 스타일을 접하게 되었는데 어떤 걸 구현하느냐에 따라 다르겠지만 어떤 경우에는 다른 코딩 스타일이 좀 더 한 번에 이해가 된 경우가 있었습니다.
예를 들어, state machine 에서
next_state = present_state;
done = 1'b0;
case (present_state)
IDLE: begin
if (start)
next_state = BUSY;
// 조건
end
BUSY: begin
next_state = FINISH;
end
FINISH: begin
done = 1'b1;
이런 식으로 각 상태에서 모든 변수를 처리하는 방식입니다. 저도 강의자님 스타일에 익숙해져서 하던 방식대로 짜보려고 했지만 어려움이 있었습니다. 강의자님은 어떻게 코딩 스타일을 정하셨는지 저도 강의자님 처럼 일관된 스타일로 어려운 코드를 어떻게 구현하기 위해 어떤 점을 중점적으로 연습하면 좋을지 조언 부탁드립니다. 감사합니다.
답변 2
0
안녕하세요.
코딩 스타일은 생각보다 매우 중요합니다.
자신에게 맞는 코딩 스타일을 만들어 가는 것이 좋습니다.
강의에 설명된 코딩 스타일은 제가 오랫동안 일을 진행하고
여러 코딩스타일을 접해보면서 나름 정리된 내용입니다.
이를 기반으로 많은 프로젝트를 진행했습니다.
차이가 나는 것은 크게 2가지 정도 입니다.
1) next_state 를 사용하는냐 사용하지 않느냐?
많은 분들이 next_state 를 사용합니다.
fpga를 구현하는 것은 크게 mux 와 flip-flop(register)로 구성됩니다.
mux는 combinational 로직으로 if, switch, assign, 기타 등등이고,
register는 flip-flop 을 거치면서 1-clock delay가 발생합니다.
어떤 분들은 mux (combinational logic)을 구현할 때,
always (*) + switch (or if) 문을 사용합니다.
저는 always (*) 문 대신에 wire (assign) + 3항 연산자를 사용합니다.
제가 오랫동안 일을 하면서 3항 연산자를 이용하는 것이 가장 좋다고 생각했습니다.
always 문을 combinational 로직과 register 로직과 함께 사용할 때 여러가지
오류가 발생하거나 원치 않는 동작을 하는 경우가 많습니다.
이로 인해 systemverilog 에서는 combinational logic을 위해서는 always_comb 를 사용하고
register 로직에서는 always_ff 를 사용합니다.
저는 always 문에서는 combinational 로직을 사용하지 않고, 오직 register 로직에서만 사용합니다.
2) fsm 을 구현할 때, 각 상태별로 신호들을 묶어서 처리하느냐, 아니면
각 신호별로 상태에 따라서 구현하느냐 의 차이입니다.
저도 처음에는 각 상태별로 신호들을 묶어서 처리하였습니다.
다른 고급 언어들이 이처럼 구현합니다.
그러나 많은 코드들을 접해보면서, 각 신호별로 구현하는 것이 더 좋은 것이라 생각하였습니다.
여러가지 이유가 있겠지만,
fpga 구현하는 것은 clock과의 싸움입니다.
clock에 맞게 신호들일 처리되는지 simulation을 통하여 확인하고,
clock이 안 맞으면, 1-clock, 2-clock, ** delay를 추가하여 타이밍을 맞추어야 합니다.
코드 중에 xxx_1d, xxx_2d 신호들은 생각만으로 구현된게 결코 아닙니다.
처음에는 대충 구현하고, simulation을 하면서 clock에 맞게 timing을 맞추어 주어야 합니다.
아무리 간단한 로직이라 해도, 수십번의 simulation을 해야만 timing을 다 맞출수 있습니다.
비교적 간단한 spi 로직도 수십번의 simulation을 하면서 1d, 2d 신호들을 추가하면서 타이밍을 맞추게 됩니다.
질문 내용이 답변하기에는 내용이 많아서 두서없이 답변드렸습니다.
제가 전에 저의 코드를 ChatGPT에게 물어보았던 적이 있습니다.
매우 훌륭한 코드라고 답변을 받았습니다.
저도 실무에서 20년 넘게 이 코드 스타일로 프로젝트를 진행하고 있습니다.
코딩 스타일이 문제가 되었던 적은 없었습니다.
또한 나중에 SystemVerilog를 접하게 된다면 저의 코딩 스타일이 SystemVerilog에서도 잘 맞는 것을 알 수 있을 것입니다.
fpga를 배우는 것이 단시간에 되는 것은 결코 아닙니다.
많은 시간이 필요하고, 코딩하고 simulation으로 검증하고, 보드에서 확인하고
이러한 작업을 하다보면 조금씩 배우게 됩니다.
아무튼 강의 통해 많은 도움되시길 바랍니다.
감사합니다~!!
0
안녕하세요, 인프런 AI 인턴입니다. ljkrhs3025님, Verilog 코딩 스타일에 대한 궁금증을 해결해드리기 위해 관련 게시물을 찾아보았습니다.
Verilog 프로그래밍에서 일관된 코딩 스타일을 유지하는 것은 특히 협업과 유지보수를 고려할 때 매우 중요합니다. 다양한 스타일이 있으며, 상황에 따라 가장 이해하기 쉬운 스타일을 선택하는 것이 좋습니다.
Verilog 스타일과 관련하여 이해를 도울 수 있는 몇 가지 게시물을 소개합니다:
강의문의: Verilog를 이용한 FPGA 활용 기초
강의를 통해 Verilog 문법과 스타일을 이해하기 좋은 기본기를 다져나가는 방법에 대해 설명합니다. 기초 과정을 통해 더욱 심화된 주제를 편하게 접근할 수 있습니다.
alwayw구문의 작동 순서에 관해: 특정 코드의 구문 작동 순서를 이해하고, Verilog의 다양한 스타일에 대한 감을 잡을 수 있도록 돕는 내용입니다. 코드의 시각적 표현과 시뮬레이션 결과를 통해 스타일 차이를 이해하는 데 유용할 것입니다.
Verilog 코딩 스타일에 대한 교훈: Verilog 코딩 스타일 및 설계 방법에 대한 깊이 있는 토론이 이루어진 게시물입니다. 다양한 스타일을 비교하고 본인에게 맞는 방식을 찾을 수 있습니다.
각 코딩 스타일에는 각기 다른 장단점이 있으며, 여러 스타일을 체험하면서 본인에게 가장 적합한 방식을 찾아가는 것이 중요합니다. 또한 스타일을 이해하고 설정하는 데 있어 가독성, 유지 보수성, 협력 작업의 용이성을 고려하는 것이 중요합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
코드를 구상하던 도중에 생각이 나서 이렇게 질문을 드렸는데 자세하게 답변해 주셔서 정말 감사드립니다. 고민이 바로 해결되었습니다.
좋은 퀄리티의 강의 덕분에 많이 배우고 강의자 님의 코드를 기준 삼아서 수강하고 있습니다. 아마 이 강의가 없었다면 정말 많은 어려움 겪고 FPGA를 중간에 포기했을 것 같습니다. 강의자 님의 조언을 명심하고 오래 걸리더라도 꾸준히 코딩하고 simulation 하고 보드에서 확인까지 하겠습니다.