정보공간_1

[3기 전주 전환규] Verilog를 이용한 5단 파이프라인 하드웨어 구조 설계 본문

IT 놀이터/Elite Member Tech & Talk

[3기 전주 전환규] Verilog를 이용한 5단 파이프라인 하드웨어 구조 설계

알 수 없는 사용자 2013. 1. 26. 16:30

  안녕하세요. 전주멤버십 22-1기 전환규입니다.

  Verilog를 이용하여 5단 파이프라인 하드웨어 구조 설계에 관해서 이야기 하고자 합니다.


  Verilog HDL은 하드웨어를 설계하는 언어로서 Chip을 설계할 때 사용됩니다. 

  5단 파이프라인 구조와 이를 설계하는 방법에 대해 살펴보고자 합니다.


1. 파이프라인

  파이프라인(pipeline)은 명령어를 읽어 순차적으로 실행하는 프로세서에 적용되는 기술로, 한번에 하나의 명령어만 실행하는 것이 아니라 하나의 명령어가 실행되는 도중에 다른 명령어 실행을 시작하는 식으로 동시에 여러개의 명령어를 실행하는 기법입니다.

  하나의 명령어는 여러개의 단계로 나눌 수 있는데, 이때 하나의 명령어를 처리할 때까지 다음 명령어가 처리되지 않고 기다린다면, 명령어의 특정 단계를 처리하는 동안 다른 단계를 처리하는 부분은 아무 작업도 하지 않게 됩니다. 이때 파이프라인을 사용하면 한 명령어의 특정 단계를 처리하는 동안 다른 부분에서는 다른 명령어의 다른 단계를 처리할 수가 있게 되므로 속도가 향상될 수 있습니다.


[그림 1] Deblocking Filter Cycle

  위 그림은 필자가 설계했던 H.264/AVC의 Deblocking Filter 파트의 처리 단계입니다. Memory Read, Threshold Decision, Pre-Filtering, FIR Filtering, Memory Write 순으로 처리된다. 이 단계를 파이프라인화 하지 않고 처리하면 각단계가 5 Clock이 필요하게 됩니다. 하나의 Macro Block을 처리하는데 필요한 Cycle은 5 * 48 = 240 Cycle 이 필요하게 됩니다. 


[그림 2] 5-Stage Pipeline


  그림 2는 위에서 설명했던 처리 단계를 5단 파이프라인 구조로 나타낸 모습입니다. Operation 1이 Threshold Decision을 하는 순간 Operation 2가 Memory Read를 수행합니다. 이런 과정을 반복하면 하나의 Macro Block을 처리하는데 필요한 총 Cycle은 5 + 47 = 52 Cycle이 필요하게 됩니다. 이전 구조와 비교하였을때 240 - 52 = 188 Cycle이 감소합니다.



2. 구현

  


[그림 3] Architecture


  구현에 앞서 5단 파이프라인 구조가 정상적으로 동작하기 위해서는 컨트롤러가 필요합니다. 그림 3은 전체적인 구조에서 내부에서 사용되는 레지스터 및 메모리 영역을 제외하고 표현하였습니다. 

  Memory Read부터 저는  상승 엣지 클럭에 맞춰서 동작하게 하였습니다. Verilog에서 Alaways 문 안에 사용할 수 있는 변수는 reg 입니다. wire는 assign 에 사용하시면 됩니다. wire는 말 그대로 연결 선입니다. 


 'Deblocking Filter Pre-Filtering 일부분'

 always @ (posedge clk or negedge reset) begin

    if (~reset) begin

        aq_FIR <= 1'b0;

        ap_FIR <= 1'b0;

        bs_curr_FIR <= 3'd0;

        lumaEdgeFlag_FIR <= 1'b0;

        DF_edge_cnt_FIR <= 7'd0;

        p0_FIR <= 8'd0;    p1_FIR <= 8'd0;    p2_FIR <= 8'd0;    p3_FIR <= 8d'0;

        q0_FIR <= 8'd0;    q1_FIR <= 8'd0;    q2_FIR <= 8'd0;    q3_FIR <= 8'd0;

    end

    else begin

        aq_FIR <= aq;

        ap_FIR <= ap;

        bs_curr_FIR <= bs_curr_PRE;

        lumaEdgeFlag_FIR <= lumaEdgeFlag_PRE;

        DF_edge_cnt_FIR <= DF_edge_cnt_PRE;

        p0_FIR <= p0_PRE;    p1_FIR <= p1_PRE;    p2_FIR <= p2_PRE;    p3_FIR <= p3_PRE;

        q0_FIR <= q0_PRE;    q1_FIR <= q1_PRE;    q2_FIR <= q2_PRE;    q3_FIR <= q3_PRE;

    end

end


[그림 4] Threshold Decision 일부분

  Memory Read, Threshold Decision, Pre-Filtering, FIR-Filtering, Memory Write를 위의 코드와 같이 Clock에 맞추어 전달하면 파이프라인 구조를 설계할 수 있습니다.

  만약 코드를 작성할 때에 크리티컬 패쓰를 맞추지 못한다면 Post-Simulation에서 정상적인 데이터를 얻지 못할 수가 있습니다. Verilog로 코드를 작성할 때에는 모든 현상이 동시에 일어난다는 점과 크리티컬 패쓰를 줄이는 것을 유의하여 작성하면 됩니다.


  이번 달에는 파이프라인 하드웨어 구조 설계에 대해 알아보았습니다.

  다음달에는 UNIX 환경에서 Memory Ware를 이용하여 Memory를 생성한 뒤 ModelSim으로 Simulation 하는 과정을 알아 보도록 하겠습니다.