Inflearn brand logo image

인프런 커뮤니티 질문&답변

김수진님의 프로필 이미지
김수진

작성한 질문수

설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)

[HDL 14장] HW 가속기의 비밀인 Pipeline 을 이해해보자 (실습편)

always와 assign 문

작성

·

59

1

안녕하세요 🙂

[1. 질문 챕터] : 14장 19강 6분쯤

[2. 질문 내용] : always 문에서 ff값을 업데이트에만 사용하고 연산은 assign으로 하는데 always 블락 안에서 연산하는건 비효율적이거나 안되는건가요?

[3. 시도했던 내용, 그렇게 생각하는 이유] :

    always @(posedge clk or negedge reset_n) begin
        if(!reset_n)
            r_power_2 <= 0;
        else
            r_power_2 <= i_value * i_value;
    end
    always @(posedge clk or negedge reset_n) begin
        if(!reset_n)
            r_power_4 <= 0;
        else
            r_power_4 <= r_power_2 * r_power_2;
    end
    always @(posedge clk or negedge reset_n) begin
        if(!reset_n)
            r_power_8 <= 0;
        else
            r_power_8 <= r_power_4 * r_power_4;
    end

 실습코드 같이 보기전에 제가 한번 써보고 맛비님 강의 들으면서 코드 비교하는식으로 듣는중인데 차이가 커서 궁금해서 질문드려요! 지난 강의에서 카운터 만들때는 always block 내부에서 +1 연산을 했어서 이것도 괜찮지 않을까 싶어서 이렇게 코딩했는데 혹시 처리시간이나 딜레이쪽에서 손해를 보나요?

================ 다음 내용은 읽어보시고 지우시면 됩니다.=================

질문 내용을 작성해주실 때, 위의 3단계로 제가 이해할 수 있게 작성해주시면 정확한 답변을 드릴 수 있을 것 같아요!!

현업자인지라 업무때문에 답변이 늦을 수 있습니다. (길어도 만 3일 안에는 꼭 답변드리려고 노력중입니다 ㅠㅠ)

  1. 강의에서 다룬 내용들의 질문들을 부탁드립니다!! (설치과정, 강의내용을 듣고 이해가 안되었던 부분들, 강의의 오류 등등)

  2. 이런 질문은 부담스러워요.. (답변거부해도 양해 부탁드려요)

    1. 개인 과제, 강의에서 다루지 않은 내용들의 궁금증 해소, 영상과 다른 접근방법 후 디버깅 요청, 고민 상담 등..

  3. 글쓰기 에티튜드를 지켜주세요 (저 포함, 다른 수강생 분들이 함께보는 공간입니다.)

    1. 서로 예의를 지키며 존중하는 문화를 만들어가요.

    2. 질문글을 보고 내용을 이해할 수 있도록 남겨주시면 답변에 큰 도움이 될 것 같아요. (상세히 작성하면 더 좋아요! )

  4. 먼저 유사한 질문이 있었는지 검색해보세요.

  5. 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

==================

답변 2

0

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

안녕하세요 🙂

AI 답변이 답을 잘 달아줬는데요.

핵심은, coding style 은 다르지만, timing 까지 고려한 function 결과가 정확하게 일치한다면, 합성기에서는 같은 HW 를 만들어낼 가능성이 높습니다.

따라서 코딩 스타일의 변경으로 HW 효율 측면이 변경되느냐의 저의 답은 no 입니다. (정말 완벽하게 timing + function 동일해야함)

코딩 스타일에 따른 효율 비효율을 논할 수 있는 가장 확실한 방법은 합성을 통한 schematic 을 뽑아보는 방법도 좋을 것 같아요. (이게 가장 옳은 답일 것 같네요)

현재 제작중인 강의 내용을 보시면, schematic 을 뽑는 과정이 있고요.

참고하셔서, 코딩 스타일을 바꿔보시면 되겠습니다.

변경 전, 후가 동일한 schematic 이 나오면 "영향이 없다" 로 이해하시면 되겠습니다.

영상 : https://www.youtube.com/watch?v=dgi8cD8eb3E&t=20s

실습자료 : https://github.com/semisgdh/SGDH-Design-interview-question/tree/main/Practical_interview_answer/LEVEL_0/L0_P1_Basic_Gate

즐공하세요!

 

0

안녕하세요, 인프런 AI 인턴입니다. 김수진님.

always 블록assign문 사용의 차이에 대해 궁금하신 점을 잘 이해했습니다. Verilog 코딩에서 이러한 차이가 발생하는 이유에 대해 몇 가지 맥락을 설명드리겠습니다.

Always vs Assign

  1. Always 블록:

    • 주로 sequential logic을 구현할 때 사용합니다.
    • clock 신호와 관련하여 플립플롭(ff)을 업데이트하는 데 적합합니다.
    • 이를 통해 복잡한 상태 유지(logic)를 처리할 수 있으며, 주로 데이터의 변경이나 상태 전이 등을 기반으로 동작합니다.
  2. Assign문:

    • 조합 논리를 정의하는 데 사용됩니다.
    • 지속적인 할당으로, 신호의 변화에 즉시 대응할 수 있도록 설계됩니다.
    • 연산적인 계산이 주 목적인 경우, 다소 효율적일 수 있습니다.

적용의 차이

  • always 블록 내에서의 연산과 단순 assign 연산의 차이는, signal이 어떻게 컴파일되어 하드웨어 디스크립션으로 변환되는지에 따라 달라질 수 있습니다.
  • 포인트는 always 블록에서 연산하는 것이 가능하지만, 이러한 접근법이 실제 환경(예: FPGA)에서의 실제 시간 효율성이나 자원 효율성과 직결되지는 않습니다.
  • 항상 항상 블록이 좋다, assign이 좋다는 없고 경우에 따라 최적의 방법을 선택하는 것이 중시됩니다.

Practical Approach

  • 가장 이해하기 쉬운 설계법디버깅이 용이한 구조를 유지하는 것이 좋습니다.
  • 복잡한 수학적 계산을 무작정 always 블록에서 사용하는 것은 좋지 않으며, 때로는 필요한 블록 수를 줄이고 간결하게 유지하는 것이 장점이 될 수 있습니다.

관련 링크들

이 질문들이 상황에 적합한 해결책을 제시하는데 도움을 줄 것입니다. 질문자님의 이해를 돕기 위해 지식공유자님의 기존 답변을 참고로 유사한 답변 링크를 추천했습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

김수진님의 프로필 이미지
김수진

작성한 질문수

질문하기