- 이 글은 "설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)"를 인프런에서 수강하고 정리하며 올린 글이다.
- 코드는 공부하며 따로 만들어본 것이며 맛비님의 코드는 아니다.
- https://www.inflearn.com/course/%EC%8B%A4%EC%A0%84-%EB%B2%A0%EB%A6%B4%EB%A1%9C%EA%B7%B8/dashboard
얻은 점
- 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 |