산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> verilog

신뢰할 수 있는 RTL 검증을 위한 Verilog 시뮬레이션 기법

Verilog는 하드웨어 기술 언어이며, 설계자가 RTL 설계를 시뮬레이션하여 로직 게이트로 변환할 수 있어야 한다는 요구사항은 없습니다. 그렇다면 왜 시뮬레이션을 해야 할까요?

시뮬레이션은 설계에 서로 다른 시간에 다양한 입력 자극을 가하여 RTL 코드가 의도한 대로 동작하는지 확인하는 기법입니다. 본질적으로 시뮬레이션은 설계의 견고성을 검증하는 잘 정립된 기법입니다. 또한 제작된 칩이 실제 세계에서 어떻게 사용되고 다양한 입력에 어떻게 반응할지와 유사합니다.

예를 들어, 위 설계는 클럭과 신호 입력을 가진 양의 에지 검출기로, 주기적으로 평가되어 출력 pe를 찾습니다. 시뮬레이션을 통해 관련 신호의 타이밍 다이어그램을 보고 Verilog의 설계 기술이 실제로 어떻게 동작하는지 이해할 수 있습니다.

설계에 대한 다양한 입력에 대해 출력을 계산할 수 있는 시뮬레이터를 개발하는 여러 EDA 회사가 있습니다. Verilog는 이산 이벤트 실행 모델로 정의되며, 다른 시뮬레이터는 사용자에게 일관된 결과 세트를 제공하기 위해 다른 알고리즘을 자유롭게 사용할 수 있습니다. Verilog 코드는 여러 프로세스와 스레드로 나뉘며, 시뮬레이션 과정에서 다른 시간에 평가될 수 있습니다.

예제

테스트벤치 tb는 설계 모듈을 담는 컨테이너입니다. 하지만 이 예제에서는 설계 인스턴스를 사용하지 않았습니다. 특정 시간에 특정 값이 할당될 수 있는 두 개의 변수 또는 신호가 있습니다. clk는 테스트벤치 내에서 생성되는 클럭을 나타냅니다. 이는 always 문으로 5ns마다 클럭 값을 번갈아 가며 수행됩니다. initial 블록에는 두 신호에 서로 다른 시간에 다른 값을 할당하는 문장 집합이 포함됩니다.

module tb;
  reg clk;
  reg sig;
  // 클럭 생성
  // 프로세스는 0ns에서 시작하여 5ns마다 루프
  always #5 clk = ~clk;
  // Initial 블록: 프로세스는 0ns에서 시작
  initial begin
    // 이 시스템 태스크는 신호 값이 바뀔 때마다 출력
    $monitor("Time = %0t clk = %0d sig = %0d", $time, clk, sig);
    // 자극(stimulus)이라고도 함, 단순히 변수에 시뮬레이션 "지연" 후 다른 값 할당
    sig = 0;
    #5 clk = 0; // 5ns에 clk을 0으로 할당
    #15 sig = 1; // 20ns에 sig를 1로 할당 (#5 + #15)
    #20 sig = 0; // 40ns에 sig를 0으로 할당 (#5 + #15 + #20)
    #15 sig = 1; // 55ns에 sig를 1로 할당 (#5 + #15 + #20 + #15)
    #10 sig = 0; // 65ns에 sig를 0으로 할당 (#5 + #15 + #20 + #15 + #10)
    #20 $finish; // 85ns에 시뮬레이션 종료
  end
endmodule

시뮬레이터는 위 테스트벤치 실행 후 다음 출력을 제공합니다.

시뮬레이션 로그

ncsim> run
Time = 0 clk = x sig = 0
Time = 5 clk = 0 sig = 0
Time = 10 clk = 1 sig = 0
Time = 15 clk = 0 sig = 0
Time = 20 clk = 1 sig = 1
Time = 25 clk = 0 sig = 1
Time = 30 clk = 1 sig = 1
Time = 35 clk = 0 sig = 1
Time = 40 clk = 1 sig = 0
Time = 45 clk = 0 sig = 0
Time = 50 clk = 1 sig = 0
Time = 55 clk = 0 sig = 1
Time = 60 clk = 1 sig = 1
Time = 65 clk = 0 sig = 0
Time = 70 clk = 1 sig = 0
Time = 75 clk = 0 sig = 0
Time = 80 clk = 1 sig = 0
Simulation complete via $finish(1) at time 85 NS + 0

시뮬레이션 파형이란?

시뮬레이션을 통해 설계와 테스트벤치 신호를 파형으로 덤프할 수 있으며, 이는 그래픽으로 표현되어 RTL 설계의 기능을 분석하고 디버깅하는 데 사용됩니다. 아래 파형은 EDA 도구에서 얻은 것으로, 각 신호의 시간 대비 진행을 보여주며 앞서 본 타이밍 다이어그램과 동일합니다.

변수나 넷의 값이 변경될 때마다 업데이트 이벤트(update event)라고 합니다. 그리고 프로세스는 업데이트 이벤트에 민감하여 업데이트 이벤트가 발생할 때마다 평가되며 이를 평가 이벤트(evaluation event)라고 합니다. 여러 프로세스가 임의로 평가될 가능성이 있으므로, 변경 순서는 이벤트 큐(event queue)라는 것으로 추적해야 합니다.

자연스럽게 시뮬레이션 시간으로 정렬됩니다. 큐에 새 이벤트를 배치하는 것을 스케줄링(scheduling)이라고 합니다. 시뮬레이션 시간은 시뮬레이터가 유지하는 시간 값으로, 시뮬레이션 중인 회로가 실제 걸리는 시간을 모델링하는 데 사용됩니다. 위 예제의 시간 값은 타이밍 다이어그램에서 나노초 ns로 표시됩니다.

module des;
  wire abc;
  wire a, b, c;
  assign abc = a & b | c; // abc는 a, b, c 중 하나가 변경될 때마다 assign 문(프로세스)을 통해 업데이트됨 -> 업데이트 이벤트
endmodule

Verilog 복습하고 예제 보기!

이벤트 큐의 영역 (Regions in Event Queue)

Verilog 이벤트 큐는 논리적으로 다섯 영역으로 나뉘며, 이벤트는 어느 영역에든 추가될 수 있습니다. 하지만 활성(active) 영역에서만 제거될 수 있습니다.

이벤트 설명
활성 (Active) 현재 시뮬레이션 시간에 발생하며, 어떤 순서로든 처리될 수 있음
비활성 (Inactive) 현재 시뮬레이션 시간에 발생하지만, 모든 활성 이벤트 처리 후 처리됨
비차단 (Nonblocking) 이전에 평가되었지만, 활성 및 비활성 이벤트 처리 후 현재 시뮬레이션 시간에 할당됨
모니터 (Monitor) 모든 활성, 비활성, 비차단 할당 완료 후 처리됨
미래 (Future) 미래의 어느 시뮬레이션 시간에 발생함

시뮬레이션 사이클은 모든 활성 이벤트가 처리되는 과정입니다. 표준은 몇 가지 예외를 제외하고 특정 스케줄링 순서를 보장합니다. 예를 들어, begin-end 블록 안의 문장들은 나타나는 순서대로만 실행됩니다.

module tb;
  reg [3:0] a;
  reg [3:0] b;
  initial begin
    // 문장들은 적절한 시뮬레이션 시간에 순차적으로 실행됨
    a = 5; // 0ns에 a에 5 할당
    b = 2; // 같은 시뮬레이션 스텝(0ns)에 b에 2 할당
    #10 a = 7; // 시뮬레이션이 10ns로 진행되면 a에 7 할당
  end
endmodule

이벤트 큐는 b에 대한 할당이 a에 대한 할당 이후에 일어나야 함을 정의합니다.

verilog

  1. 버릴로그(Verilog) 입문: 디지털 회로 설계를 위한 하드웨어 기술 언어
  2. Verilog 결합(Concatenation) & 복제(Replication) 연산자 실전 가이드
  3. Verilog 할당문 이해: 유형, 문법, 모범 사례
  4. Verilog 차단 vs 비차단 할당: 핵심 차이점 완벽 이해
  5. Verilog 함수 마스터하기: 효율적인 RTL 설계를 위한 활용법
  6. Verilog 태스크 이해: 함수와의 차이점, 문법, 활용법
  7. Verilog `ifdef: 조건부 컴파일 완벽 가이드
  8. Verilog 스케줄링 의미론 이해: 타이밍, 이벤트, 실행 순서
  9. Verilog 클럭 생성기: 설계 및 구현 가이드
  10. Verilog 디스플레이 태스크 마스터하기: 효율적인 디버깅 및 로깅