본문 바로가기

실전! Verilog HDL RTL Design

[Verilog HDL] 8. 순차논리 (Sequential Logic) Adder 설계

반응형

앞에서 배운 DFF 설계 기법을 활용하여 clock에 동기되어 동작하는 adder를 설계해 보자. 우선 완성된 source code는 아래와 같다.

module adder_seq (
    input clock,
    input resetn,
    input [7:0] a,
    input [7:0] b,
    output reg [7:0] y
);
reg [7:0] sum;

always@(*)
begin
    sum = a+b;
end

always @(posedge clock or negedge resetn)
begin
    if (!resetn)
        y <= 0;
    else
        y <= sum;
end

endmodule

DFF은 1bit 저장회로이고 이것을 여러 bit로 묶은 것을 레지스터(register)라고 한다. 8bit adder의 출력을 저장하기 위하여 DFF 8개 묶은 8bit register를 출력 변수 y로 선언한다. 아래 쪽에 y를 출력 하는 코드를 보면 DFF의 q 변수를 출력하는 것과 동일한 모양임을 알 수 있다. adder_seq module에서는 y에 sum을 할당하고 있고 sum은 8bit reg변수로 선언한 조합회로의 출력이다. 이렇든 레지스터 입력 부분은 조합회로로 구현하고 이 조합회로의 출력을 순차회로인 레지스터 입력으로 넣어 주는 것이 multi-bit 순차회로 구현의 기본적인 형태이다.

 

이를 간단한 개념도르 그리면 아래와 같다.

 

 

adder_seq회로를 테스트 할 수 있는 테스트벤치 code는 아래와 같다.

`timescale 1ns/1ns

module test;

// delare variables
reg clock;
reg resetn;
reg [7:0] a;
reg [7:0] b;

wire [7:0] y;

// clock generation
always #10 clock = ~clock;

// adder_seq instantiation
adder_seq u_adder_seq (
    .clock  (clock),
    .resetn (resetn),
    .a      (a),
    .b      (b),
    .y      (y)
);


// create wave dump file
initial
begin
    $dumpfile("adder_seq.vcd");
    $dumpvars(0, test);
end

// input stimulus
initial
begin
    a = 0;
    b = 0;
    clock = 0;
    resetn = 0;
    #100;
    resetn = 1;
    a = 2;
    b = 3;
    @(posedge clock);
    a = 4;
    b = 5;
    @(posedge clock);
    a = 10;
    b = 30;
    @(posedge clock);
    #100;
    $finish();
end

endmodule

각 입력 변수는 reg로 선언하고 출력변수는 wire로 선언한다. 테스트 하고자 하는 입력 변수를 설정하고 다음 clock까지 기다린 뒤에 다음 입력을 설정해 준다. adder_seq는 resetn이 '1'이어야 동작함을 기억하자.

 

결과 wave form은 아래와 같다.

wave form상에서 clock의 positive edge에 mark 선 (빨간선)을 위치시키면 출력값이 동일 시간에 변경된 것 처럼 보인다. 하지만 실제로는 delta delay이후에 값이 변화하게 되는데 이는 non-blocking assignment를 사용하였기 때문이다. 앞에서 기술한 바와 같이 이는 HW적인 동작을 simulator에서 구현하기 위한 것이다.

delta delay는 simulator에서 HW적으로 발생하는 delay를 모사하기 위한 가상의 delay라고 생각하면 된다. 실제로 시간을 소비하지 않지만 각 event 발생 순서를 정의한다.

반응형