본문 바로가기

FPGA 공부

FPGA TestBench 및 기초 지식

얻은 점

  • TestBench Code 짜는 법
  • Clock 및 reset등 사용 방법

Verilog HDL..?

  • verilog : Verification Logic
  • HDL : Hardware Description Language
  • 즉 Verilog HDL은 Hardware 설계와 검증에 모두 사용되는 도구임

TestBench

  • 검증에 사용되는 모듈
  • TestBench는 기본적으로 Stimulus와 Checker라는 기본 두 기능 포함해 작성함

  • Stimulus(한글로 "자극") : Module을 동작시키기 위한 input
  • Checker : output이 설계한 대로 나왔는지 확인하는 것

DUT(Design Under Test)

  • 검증하고 싶은 설계한 HW Module

  • 우리는 이처럼 어느 모듈을 설계 시에 여러 개의 모듈을 설계하게 됨
  • 그런데 Module3만을 검증하고 싶다면?
  • 따라서 Module3만을 위한 Stimulus와 Checker를 만들어 Module3만의 TestBench를 만드는 것이다.
  • Module3 = DUT, Module3이 제대로 동작? = TestBench
  • TestBench는 HW Module이 아님!

Pipeline

  • 한 ==데이터 처리 단계의 출력이 다음 단계의 입력으로 이어지는 형태로 연결된 구조==
  • 이렇게 연결된 데이터 처리 단계는 한 여러 단계가 동시에, 병렬적으로 수행될 수 있어 효율성을 향상할수 있다
  • 각 단계의 입출력을 중계하기 위해 버퍼가 사용될 수 있다.

Latency(L)

  • 처음 입력이 들어가서 출력이 나올때까지 걸리는 시간(Cycle)Throughput
  • 새로운 출력이 나갈 수 있는 비율

처음 Latency가 커도 Throughput이 1이라면 한번 출력이 나오기 시작했다면 매번

FSM

  • Finite State Machine
  • 현재 State와 input으로 다음 State 결정
  • FSM은 현재 State를 정확하게 명시하고 input에 의해서 동작을 기술하기에 Control Logic 설계에 좋다
  • 하나의 FSM Logic은 하나의 State만을 가지게 되며 어떠한 사건에 의해 현 상태에서 다른 상태로 변화할 수 있으며 이를 Transition(전이)라고 한다.

    Mealy VS More Machine
  • Mealy Machine
    • output 결정시 현재 State와 input으로 결정
    • input까지 보기 때문에 Delay 발생
  • Moore Machine
    • output 결정시 현재 State와 input으로 결정
    • 단방향으로 Data가 흘러가는 System에서는 Timing에 유리한 Moore 사용 지향
  • Memory는 휘발성

 

1Bit를 저장하기 위한 Momory

  • Register :
    • 1개의 FF - 8개의 2-input nand gate(4 Transistor) + 2개의 not gate
    • 10 Gate
    • 가장 큼
    • ACCESS 할수 있는 DATA 양 많음
  • SRAM :
    • 6개 Transistor
    • 중간
    • ACCESS 할 수 있는 DATA 양 제한적(DATA의 Data Width 만큼)
  • DRAM :
    • 가장 작음
    • ACCESS 할 수 있는 DATA 양 제한적(DATA의 Data Width 만큼)

Latency

  • Register
    • ACCESS 하는 순간 READ / Write 가능
    • Random Access Good
  • SRAM
    • ACCESS 후에 약 1cycle 후 data 사용 가능
    • Random Access 나쁘지 않음
  • DRAM
    • 외부에 존재하는 고집적 메모리로 ACCESS하려면 BUS가 김
    • Random Access에 제약이 존재

Interface(I/F)

  • Register
    • Variable(변수)
  • SRAM
    • Memory I/F
  • DRAM
    • DDR I/F
    • AXI

ASIC에서 SRAM사용 FPGA에서는 BRAM(Block Ram) 사용

TestBench 코드를 짜는 방법

그전에 어떤게 어디에 들어가냐면..

  • simulation을 돌리기 위해선 기본적으로 Design Source, TestBench(simulation Source), DUT가 필요함
  • Design Source는 실제로 하드웨어로 구현될 논리 회로를 정의하는 Verilog file -> FPGA에 실제로 들어갈 것
  • TestBench Code는 DUT, 시간별 대입 값등을 나타내며 실제 wave를 보기위해 짜는 것
  • DUT는 TestBench에서 인스턴스로 쓰일 것으로 보통 TestBench code를 넣으면 알아서 Design Source에서 가져옴 (simulation source 밑에 종속적으로 들어가짐) - 작은 프로젝트라면 Design Source = DUT가 될 수 있음

간단한 TESTBENCH 만들어 Simulation 해보기

AND GATE (Design Source == DUT인 경우)

  • Design Source
module and_gate (
    input wire a,
    input wire b,
    output wire y
);
    assign y = a & b;
endmodule
  • TestBench Code
`timescale 1ns / 1ps

module tb_and_gate;

    // DUT 신호 선언
    reg a;
    reg b;
    wire y;

    // DUT 인스턴스화
    and_gate dut (
        .a(a),
        .b(b),
        .y(y)
    );

    // 테스트 시퀀스
    initial begin
        a = 0;
        b = 0;
        #10;  // 10ns 대기
        a = 0;
        b = 1;
        #10;  // 10ns 대기
        a = 1;
        b = 0;
        #10;  // 10ns 대기
        a = 1;
        b = 1;
        #10;  // 10ns 대기
        // 시뮬레이션 종료
        $finish;
    end

    // 파형 출력
    initial begin
        $dumpfile("tb_and_gate.vcd");
        $dumpvars(0, tb_and_gate);
    end

endmodule

timescale 지시어의 형식

`timescale <time_unit> / <time_precision>
  • <time_unit>: 기본 시간 단위를 지정합니다. 예를 들어, 1ns는 1 나노초를 의미
  • <time_precision>: 시간 단위의 정밀도를 지정합니다. 예를 들어, 1ps는 1 피코초를 의미
  • 즉 Simultaion의 기본 시간 단위가 1ns, 시간 정밀도가 1ps라는 것

initial begin ... end

  • Simulation 시작시 한번 실행되는 블록임필수 요소
  • 초기화
  • 시뮬레이션 종료선택적 요소
  • 디스플레이 명령어
  • 파형 출력 설정
  • 조건문 및 반복문

많이 쓰는 reset

  • asynchronous reset(비동기식 reset)
    • clock과 상관없이 그냥 reset하고 싶을때 사용
always @ (posedge clk or posedge asy_reset) begin
    if(asy_reset)begin
        q<=0;
    end else begin
        q<=in;
    end
end
  • synchronous reset(동기식 reset)
    • Clock과 동기하여 reset하고 싶을 때 사용
always @ (posedge clk) begin
    if(sy_reset)begin
        q<=0;
    end else begin
        q<=in;
    end
end
  • _ n
    • 이게 뒤에 달리면 보통 0일때 reset하는 것
  • 복합 - 가장 많이 사용됨
always @ (posedge clk or posedge asy_reset) begin
    if(asy_reset)begin //비동기식
        q<=0;
    end else if(sy_reset) begin //동기식
        q<=0;
    end else begin
        q<=in;
    end
end

Event 제어 문법

  • @(posedge signal);
    • posedge까지 대기
  • @(negedge signal);
    • negedge까지 대기
  • @signal;
    • signal 값 변경될 때까지 대기
  • wait(expression)
    • expression이 참이 될 때까지 대기

'FPGA 공부' 카테고리의 다른 글

ZedBoard 뜯어보기  (0) 2024.09.20
# FPGA IP와 Verilog 활용 수업 요약  (0) 2024.09.09
Verilog file 단독 simultaion 해보기  (5) 2024.09.06
FPGA 구성 기본 요소  (0) 2024.09.03
Xilinx FPGA - PS, PL 영역  (0) 2024.08.27