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

Tcl 기반 VHDL 코드락 모듈 테스트벤치 만들기

대부분 VHDL 시뮬레이터는 Tcl(Tool Command Language)을 주 스크립팅 인터페이스로 노출합니다. 시뮬레이터 콘솔에 명령어를 입력하면 Tcl을 쓰는 것이고, VHDL 설계를 구동하고 관찰하는 스크립트도 작성 가능합니다.

이 글은 간단한 코드락 모듈의 동작을 VHDL이 아닌 Tcl로 검증하는 자가 검사 테스트벤치 구축 과정을 안내합니다. 결과는 VHDL 재컴파일 없이 실행, 수정, 재사용 가능한 명확하고 유지보수하기 쉬운 테스트 하네스입니다.

참고:

아래에서 코드와 ModelSim 프로젝트 파일 다운로드.

DUT: VHDL 코드락 모듈

테스트벤치 들어가기 전 DUT(시험 대상 장치) 복습. 올바른 숫자 시퀀스를 PIN 패드에 입력하면 금고가 열리는 단순한 잠금 장치 모방.

많은 이들이 '조합 자물쇠'라 부르지만, 숫자 순서가 중요하므로 정확한 용어는 '순열 자물쇠'입니다. 명확히 하기 위해 코드락이라 부르겠습니다.

Tcl 기반 VHDL 코드락 모듈 테스트벤치 만들기
일반적인 호텔 금고. 단순화를 위해 숫자 키만 사용, CLEAR와 LOCK 버튼 생략.

코드락 모듈 동작 원리

락은 잠긴 상태에서 시작. 사용자가 비밀 PIN과 일치하는 네 자리 숫자를 연속 입력하면 잠금 해제. 잘못된 시퀀스 입력 시 다시 잠금. 이 동작은 VHDL의 간단한 시퀀스 디텍터로 구현.

Tcl 기반 VHDL 코드락 모듈 테스트벤치 만들기

파형은 모듈 타이밍 보여줌. 클럭과 리셋 외에 두 입력: input_digit(정수 0~9), input_enable(std_logic). DUT는 인에이블이 하이일 때 라이징 클럭 에지에서 디짓 샘플링.

출력은 unlock 하나뿐. 네 연속 디짓이 정확한 PIN과 일치할 때만 하이. 예제에서 패스코드는 1234.

엔티티

다음 엔티티 정의는 제네릭으로 비밀 PIN을 하드코딩. 각 제네릭은 0~9 범위 정수로 BCD 디짓 표현.

entity code_lock is generic (pin0, pin1, pin2, pin3 : integer range 0 to 9); port ( clk : in std_logic; rst : in std_logic; input_digit : in integer range 0 to 9; input_enable : in std_logic; unlock : out std_logic ); end code_lock;

선언부

모듈은 단일 내부 신호(최근 입력된 디짓 저장하는 4비트 시프트 레지스터) 사용. 레지스터가 -1~9 값 보유 허용. 특수 값 -1은 리셋 상태용으로, PIN이 0000일 때 기본값으로 잠금 해제되지 않게 함.

type pins_type is array (0 to 3) of integer range -1 to 9; signal pins : pins_type;

구현

아키텍처는 시프트 레지스터가 제네릭 PIN 값과 일치할 때 unlock을 하이로 구동하는 조합 할당 포함. pins가 클럭킹되므로 unlock은 라이징 클럭 에지에서만 변경.

unlock <= '1' when pins = (pin3, pin2, pin1, pin0) else '0';

다음 프로세스가 시프트 레지스터 구현. 리셋 시 모든 엔트리 -1로 설정. 라이징 에지에서 input_enable 하이면 현재 디짓을 위치 0에 저장, 이전 디짓들 오른쪽으로 시프트.

PINS_PROC : process(clk) begin if rising_edge(clk) then if rst = '1' then pins <= (others => -1); else if input_enable = '1' then pins(0) <= input_digit; pins(1 to 3) <= pins(0 to 2); end if; end if; end if; end process;

VHDL 테스트벤치

검증 로직은 Tcl로 하지만 클럭과 리셋 신호 생성을 위한 기본 VHDL 테스트벤치 필요. 아래 완전한 VHDL 테스트벤치 파일.

library ieee; use ieee.std_logic_1164.all; entity code_lock_tb is end code_lock_tb; architecture sim of code_lock_tb is constant clk_hz : integer := 100e6; constant clock_period : time := 1 sec / clk_hz; signal clk : std_logic := '1'; signal rst : std_logic := '1'; signal input_digit : integer range 0 to 9; signal input_enable : std_logic := '0'; signal unlock : std_logic; begin clk <= not clk after clock_period; DUT : entity work.code_lock(rtl) generic map (1,2,3,4) port map ( clk => clk, rst => rst, input_digit => input_digit, input_enable => input_enable, unlock => unlock ); end architecture;

Tcl 테스트벤치

아래는 ModelSim 내부에서 실행되는 Tcl 스크립트. Vivado나 다른 시뮬레이터 쓰면 일부 명령어는 시뮬레이터별로 달라 미세 조정 필요. 자세한 건 ModelSim Command Reference Manual 참조.

아래 양식으로 예제 프로젝트 다운로드.

네임스페이스 사용

스크립트를 네임스페이스로 캡슐화해 전역 변수와 의도치 않은 충돌 방지. 모든 Tcl 코드는 codelocktb 네임스페이스 내에.

namespace eval ::codelocktb { # All Tcl code here }

시뮬레이션 초기화

vsim으로 시뮬레이션 시작, 파형 파일 있으면 로드.

# Load the simulation vsim work.code_lock_tb # Load the waveform if {[file exists wave.do]} { do wave.do }

VHDL 값을 Tcl로 가져오기

ModelSim의 examine 명령으로 clock_period 상수와 PIN 제네릭 읽기. 다음 스니펫으로 숫자 값과 시간 단위 추출.

variable clockPeriod [examine clock_period] variable clockPeriod [string trim $clockPeriod "{}"] variable timeUnits [lindex $clockPeriod 1] variable clockPeriod [lindex $clockPeriod 0] variable pinCode [examine dut.pin0 dut.pin1 dut.pin2 dut.pin3]

errorCount 변수 초기화로 실패 추적.

variable errorCount 0

타임스탬프付き 출력

echo 명령으로 ModelSim 콘솔에 메시지 표시(전 플랫폼). 현재 시뮬레이션 시간 접두사로 붙이는 프로시저.

proc printMsg { msg } { global now variable timeUnits echo $now $timeUnits: $msg }

지정된 클럭 사이클 수만큼 실행

DUT가 클럭 민감하므로 시간을 클럭 주기 배수로 전진.

proc runClockCycles { count } { variable clockPeriod variable timeUnits set t [expr {$clockPeriod * $count}] run $t $timeUnits }

신호 값 검사

checkSignal 프로시저로 VHDL 신호를 기대값과 비교, 다를 시 에러 리포트.

proc checkSignal { signalName expectedVal } { variable errorCount set val [examine $signalName] if {$val != $expectedVal} { printMsg "ERROR: $signalName=$val (expected=$expectedVal)" incr errorCount } }

PIN 입력 시뮬레이션

이 프로시저로 DUT 입력 구동해 사용자가 4자리 PIN 입력하는 것 시뮬레이션. 네 디짓 모두 적용 후 unlock 출력 검사.

proc tryPin { digits } { variable pinCode set pinStatus "incorrect" if { $digits == $pinCode } { set pinStatus "correct" } printMsg "Entering $pinStatus PIN code: $digits" foreach i $digits { force input_digit $i -deposit force input_enable 1 -deposit runClockCycles 1 force input_enable 0 -deposit runClockCycles 1 } if { $pinStatus == "correct" } { checkSignal unlock 1 } else { checkSignal unlock 0 } }

테스트 시퀀스와 결과 리포트

짧은 초기화 후 리셋 해제, 여러 테스트 케이스 실행: 두 코너 케이스(0000, 9999), 올바른 PIN, 역순 PIN 시퀀스. 전체 결과 리포트.

runClockCycles 10 force rst '0' -deposit runClockCycles 1 printMsg "Checking reset value" checkSignal unlock 0 tryPin {0 0 0 0} tryPin {9 9 9 9} tryPin $pinCode tryPin [lreverse $pinCode] if { $errorCount == 0 } { printMsg "Test: OK" } else { printMsg "Test: Failure ($errorCount errors)" }

테스트벤치 실행

ModelSim 내부에서 다음 명령으로 스크립트 실행:

source code_lock/code_lock_tb.tcl

성공적 실행 시 타임스탬프와 함께 아래 같은 출력:

VSIM> source code_lock/code_lock_tb.tcl # vsim # 110 ns: Checking reset value # 110 ns: Entering incorrect PIN code: 0 0 0 0 # 190 ns: Entering incorrect PIN code: 9 9 9 9 # 270 ns: Entering correct PIN code: 1 2 3 4 # 350 ns: Entering incorrect PIN code: 4 3 2 1 # 430 ns: Test: OK

DUT에 결함 있으면(예: unlock 할당 오타) 스크립트가 실패와 에러 카운트 리포트:

VSIM> source code_lock/code_lock_tb.tcl # vsim # 110 ns: Checking reset value # 110 ns: Entering incorrect PIN code: 0 0 0 0 # 190 ns: Entering incorrect PIN code: 9 9 9 9 # 270 ns: Entering correct PIN code: 1 2 3 4 # 350 ns: ERROR: unlock=0 (expected=1) # 350 ns: Entering incorrect PIN code: 4 3 2 1 # 430 ns: Test: Failure (1 errors)

마무리

경력 동안 수많은 Tcl 기반 테스트벤치 작성. 독특한 장점: 대화형 테스트, 테스트 하네스 수정 시 재컴파일 불필요, 설계와 테스트벤치 양쪽 버그 방지하는 추가 검증 계층.

트레이드오프도 존재. Tcl 스크립트는 순수 VHDL 테스트벤치보다 현저히 느리고, 언어가 취약해 에러 조기 포착 어렵고 디버깅이 Python 같은 고급 언어보다 덜 직관적.

그럼에도 Tcl은 FPGA 툴링과 시뮬레이션의 사실상 표준 글루 언어. Xilinx Vivado, Intel Quartus, Mentor Graphics Questa 쓰면 Tcl 마스터가 배당금 됩니다. 댓글로 경험 공유해 주세요.

VHDL

  1. VHDL 문자열 리스트 구현: 모범 사례와 예제
  2. VHDL 테스트벤치 시뮬레이션 우아하게 종료하기
  3. VHDL PWM 컨트롤러 구현: 설계, 시뮬레이션, FPGA 데모
  4. 블록 RAM에서 견고한 VHDL 링 버퍼 FIFO 설계하기
  5. Tcl 기반 인터랙티브 테스트벤치로 하드웨어 검증 강화하기
  6. VHDL 자가 검증 테스트벤치 구축 실전 가이드
  7. VHDL에서 보호 타입과 액세스 포인터로 동적 링크드 리스트 구현하기
  8. VHDL 비순수 함수 활용: FSM 가독성과 유지보수성 높이기
  9. VHDL 함수 마스터하기: 효율적 설계를 위한 실전 가이드
  10. 무료 VHDL 시뮬레이터 & 에디터 설정: 학생 가이드