이번 장에서는 디지털 회로의 핵심인 Clock을 설계해보겠습니다.
클럭신호는 논리상태1과0이 주기적으로 나타나는 신호를 뜻합니다. 디지털 회로에서 클럭이 중요한데 클럭 신호에 맞추어 신호의 처리를 하는 동기 처릴르 위해 사용합니다. 즉 사람과 비유하자면 심장 박동과 유사합니다. 클럭 신호의 요소 중 주기와 주파수가 있습니다.
주파수는 초당 클럭신호가 진동한 갯수를 뜻하는데 만약 1초동안 한번 진동했다면 1Hz가 됩니다. 이때의 주기는 1초동안 한번 진동했으므로 1s가 됩니다. 예를 들어 100MHz는 초당 100메가번 진동 즉, 1억번 진동한 것이고, 이때 주기는 10ns가 됩니다.
오버클럭(over clock)이라는 말을 들어보셨나요? 오버클럭은 컴퓨터 부품이 제조업체에 의해 설계된 것 보다 강제로 더 높은 클럭 속도(더 많은 진동)로 동작할 수 있게 만드는 과정을 뜻합니다. 개인적으로 컴퓨터 성능을 높이기 위해 클럭을 높이기도 합니다. 즉, 클럭은 컴퓨터의 성능과도 밀접한 관계가 있습니다.
자 이제 Verilog HDL를 활용해 클럭을 설계해보고 Xilinx Vivado tool에서 제대로 클럭이 설계되었는지 시뮬레이션 해봅시다.
`timescale 1ns / 1ps
module tb_clock_generator;
reg clk;
//clk gen
always
#5 clk = ~clk;
initial begin
$display("initialize value [%d]",$time);
clk = 0;
$display("Start! [%d]",$time);
#100
$display("Finish! [%d]",$time);
$finish;
end
endmodule
#은 시간 지연 단위 인데 #5는 5ns 시간지연을 의미합니다. 즉clk과 ~clk이 5ns씩 반복되어 출력됩니다.
initial 문에서 클럭의 초기값을 잡아주게 됩니다. 또한 100ns가 지난 뒤 프로그램이 종료됩니다.
결과.
Testbench와 DUT
우리가 모듈을 생성할때 모듈을 DUT라 부르고 이모듈을 검증할때 사용하는 모듈을 testbench라 합니다. 즉, DUT는 검증에 사용될 모듈입니다.
stimulus는 우리나라말 그대로 자극이라는 의미입니다. 어떤 자극이 있어야 반응이 있는것 처럼 어떠한 입력이 있어야 출력이 있을 것입니다. checker는 출력이라고 생각하면 됩니다. 그럼 Testbench와 DUT개념을 이용해 클럭게이팅을 설계해 봅시다.
DUT에 클럭 게이팅 모듈을 만들고 거기에 입출력을 정의해 준 다음 모듈의 연산을 코딩합시다.
module clock_gating_model(
input wire i_clk,
input wire i_clock_en,
output wire o_clk
);
assign o_clk = i_clk & i_clock_en;
endmodule
그 다음 이 모듈을 검증할 testbench를 만들어 봅시다.
- 클럭의 주기는 10ns로 설정합시다.
- input과 output으로 설정할 변수들을 선언합니다.
- clk과 clock_en값을 0으로 초기화 합니다. 그 후 지간 지연을 적당히 하여 0과1 출력해줍시다.
- testbench의 입출력과 DUT의 입출력을 매핑해 줍시다.
`timescale 1ns / 1ps
module tb_clock_generator;
reg clk;
reg clock_en;
wire o_clk;
// clk gen
always
#5 clk = ~clk;
initial begin
$display("initialize value [%d]", $time);
clk = 0;
clock_en = 0;
# 100
$display("Clock On! [%d]", $time);
clock_en = 1;
# 100
$display("Clock Off! [%d]", $time);
clock_en = 0;
# 100
$display("Finish! [%d]", $time);
$finish;
end
clock_gating_model DUT( // 여기서 DUT는 인스턴스 name입니다.
.i_clk (clk ),
.i_clock_en (clock_en ),
.o_clk (o_clk )
);
endmodule
결과.
clock_en이 1이 될때마다 클럭이 뛰는 것을 알 수 있습니다. 하지만 이러한 클럭게이팅은 저전력을 위한 설계에서 쓰여야 하며 세심하게 설계해야됩니다. 항상 클럭을 만질때는 조심해야 합니다.
'UVM & RTL > Verilog HDL' 카테고리의 다른 글
[8] Verilog HDL 사칙연산 실습 (0) | 2022.01.20 |
---|---|
[7] Verilog HDL D Filp-Flop 실습 (0) | 2022.01.20 |
[5] Verilog HDL 모듈, 테스트 벤치 (0) | 2022.01.15 |
[4] Verilog HDL 순차 회로 기술 (0) | 2022.01.15 |
[3] Verilog HDL 조합 회로 기술 (0) | 2022.01.15 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!