FPGA/Verilog

Verilog Simulation 1

장영현 2023. 6. 14. 10:10
728x90
  • Simulation

PFGA Verilog Code를 합성하여 SYNTHESIS (Netlist를 추출하고 Netlist를 Place & Routing) 하는데 시간이 오래걸리기 때문에, 먼저 Simulation을 해서 정확한 동작을 하는지 검증을 한다. 

 

`timescale 1ns / 1ps

module AND_GATE(
    input A,
    input B,
    output C
    );
    assign C = A&B;
endmodule

timing diagram

Simulation할 시 정상적으로 timing diagram이 생성되는 것을 확인할 수 있다.

 

  • Simulation with Modelsim

베릴로그를 사용하여 디지털 로직을 설계할 시 그림을 그린다고 표현.

자기가 원하는 디지털 로직의 연결과  게이트를 추가하여 입, 출력을 연결해준다.

시뮬레이션은 실제로는 없지만 가상으로 신호를 연결하여 출력을 확인하는 과정.

신호에 어떤 값을 입력할지에 따라 결과값이 달라진다.

초기 설계 시 입력 신호가 없기때문에 해당 입력신호를 테스트벤치를 통해 넣어준다.

 

  • Testbench

instance화 시켜줘야 한다. -> 객채화시켜주는 것.

 

initial문을 통해 초기 값을 설정해줄 수 있다.

테스트벤치 생성 예시

(instance화 시킬 하위 모듈 이름) (instance시킨 모듈 이름) (.하위모듈(상위모듈) ...)

 

  • OR GATE Simulation
`timescale 1ns / 1ps

module OR_GATE(
    input wire A,
    input wire B,
    output wire C
    );
    assign C = A | B;
    
endmodule
`timescale 1ns / 1ps

module GATE_TB();
    reg A;
    reg B;
    wire C;
    
    OR_GATE ex_or_gate (.A(A), .B(B), .C(C));
    initial begin
    A = 0; B = 0; #500;
    A = 0; B = 1; #500;
    A = 1; B = 0; #500;
    A = 1; B = 1; #500;
    A = 0; B = 0; 
    end

endmodule

테스트벤치의 module OR_GATE_TB();에서 sensitivity list를 공백으로 비워두는 이유는 테스트벤치가 가장 상위 모듈이어야 하기 때문이다. sensitivity list에 포트가 존재한다는 것은 해당 모듈이 외부와 입, 출력 포트가 존재한다는 것이다.

OR_GATE Simulation

베릴로그 코드에 맞게 정확히 출력이 나오는 것을 확인할 수 있다.

 

  • AND GATE Simulation
`timescale 1ns / 1ps

module AND_GATE(
    input A,
    input B,
    output C
    );
    assign C = A & B;
endmodule
`timescale 1ns / 1ps

module GATE_TB();
    reg A;
    reg B;
    wire C;
    
    AND_GATE ex_or_gate (.A(A), .B(B), .C(C));
    initial begin
    A = 0; B = 0; #500;
    A = 0; B = 1; #500;
    A = 1; B = 0; #500;
    A = 1; B = 1; #500;
    A = 0; B = 0; 
    end

endmodule

AND_GATE Simulation

 

  • NAND GATE Simulation
`timescale 1ns / 1ps

module NAND_GATE(
    input A,
    input B,
    output C
    );
    assign C = ~(A & B);
endmodule
`timescale 1ns / 1ps

module GATE_TB();
    reg A;
    reg B;
    wire C;
    
    NAND_GATE ex_or_gate (.A(A), .B(B), .C(C));
    initial begin
    A = 0; B = 0; #500;
    A = 0; B = 1; #500;
    A = 1; B = 0; #500;
    A = 1; B = 1; #500;
    A = 0; B = 0; 
    end

endmodule

NAND_GATE Simulation