2024.02.20
관련자료
01.02.07 Flow Control
[TOC] SystemVerilog의 sequential flow를 기술할 때, 특정 condition에 따라서 분기를 하거나, 특정 조건에 따라서 반복 작업을 하기위해 아래…
wikidocs.net
검증 엔지니어가 하는일
환경 setting(입력값 자동입력), simulation을 통한 출력값 확인(자동화)
**검증을 하기위해 System Verilog를 사용한다.
왜 System Verilog를 사용 하는가?
검증 시 bus단위로 검증을 주로 하게된다 그렇게 되면 입력값이 많아지게 된다.
입력값이 많아지면 기존에 예제와 다르게 한 개씩 값을 넣어서 확인하는것과 같이 검증이 어려워진다.
>>입력값이 많을 때 랜덤하게 값을 넣어 확인 가능한데 System verilog가 그 예이다.
그 밖의 사용하는 이유로는
- 객체지향언어(class포함) : 캡슐화, 상속화, 다형성을 갖춤
- UVM을 사용하기 위해
- 검증속도가 빠르다.(시간단축 > 비용절감)
- 재사용가능, 검증환경을 만들기 위한 시간 단축(비용절감)
- Randomized Stimulus >> 임의 값으로 DUT 입력이 가능하다.
* Randomized Stimulus : 랜덤 입력신호
**객체 지향언어의 특징
| 캡슐화(Capsulation)
c언어의 객체 느낌으로 관련되어 있는 것((변수-속성),(함수-동작))을 class를 이용하여 묶음으로 관리하는것
구조체 : 변수들의 묶음
class : ((변수-속성),(함수-동작)) - 객체느낌, 객체간의 상호 작용(caller)
|| 상속화(Inheritence) > Extend 확장
- 기존기능을 포함 하여 추가 기능 확장
- 부모class를 바탕으로 자식 class의 기능을 확장
- 부모class의 기능에 더 추가하여 사용하므로 재사용이 높다.
||| 다형성(Override)
System Verilog에서는 Overloadong을 크게 생각하지 않는다.
부모 class를 확장해서 자식 class를 생성시
부모 class에 존재하는 fuction을 자식 class에도 동일하게 선언 했을 때
자식 class에서 virtual task를 사용한다
Virtual task 사용하는 이유?
덮어 쓰는 것
상속받은 걸 해당 함수를 통해 덮어쓸 수 있다.
부모class에 있는걸 자식 class에서 바꿔서 사용할 때
Interface
- Verilog 에서 wire 선언들의 묶음이라고 생각하면 쉽다.
**Data type
2 - State : 0, 1만 사용, 읽기가능
4 - State : 0, 1, x, z
**logic : reg + wire 형태 (reg 대체, 4state 0, 1, x, z)이며,
assign과 같이 continuous assignment에도 사용될 수 있으며, unsigned다.
Event Data type
- string, enum, event type 사용된다.
- event type 많이 사용 >> c언어의 Flag와 비슷하다.
ADDER 실습
1.source file 생성
2. tb생성
tb 만들때 system Verilog 형태로 만든다.
1.tb 원래 방식
> 일일이 입력값을 넣을 때
-simulation
2.자동화 방식
randomized stimulus를 사용 하여 입력값을 자동으로 넣는다.
여기서 검증 엔지니어는 : 환경 setting 후 자동화를 통해 출력을 확인한다.(pass / fail)
DUT는 검증 엔지니어가 모를 수 있다.
- random 사용
- test는 class로 생성(합성 x - Software로 검증하기 때문이다.)
DUT - Module
- NEW : test class 실체화 후 reference(handler) 값 을 넣는다. (pointer 역할)
- Interface 연결 : interface는 H/W 연결하는 것이다.
여기서 진짜 interface와 가짜 interface를 구분하는게 중요..
- random 값을 넣음
- class 안에 function new는 생성자다. 안쓰게 된다면 function new가 default 가 된다.
- transaction - class
- trans - handler
- new 사용 해도 자동으로 clear 된다.
(garbage collection) C#이나 java와 비슷
new를 사용하므로 instence 해주는 것이다.
for을 사용하여 i값이 10이 될 때 까지 입력 받도록 설계함.
simulation 결과 waveform
10번의 random 값을 생성하여 10번 동안 입력을 받는 것을 확인,
carry 발생 시 동작됨 확인 >> 처음 이후 carry 발생이 안됨 clear 안됨 예상된다.
중복 값 발생함 >> 중복 값 제거
중복값 제거
- rand값에 c를 붙여 실행하면 이전 값이 중복해서 안나온다
simulation waveform
- System verilog 검증 기본구조
// generator와 driver 단 나누기
S/W를 H/W로 변경 > trasaction 값 전송 - driver
-Framework
generator와 driver가 직접적으로 연결하기 어려움
transection을 통해서 연결
mail box는 FIFO(First in First Out)형태
System verilog로 합성가능
/ code 구현
event 선언하여 generator단에서
random data 출력, 대기 후 / driver 단에서 10ns 마다 triger가 되도록 함.
>> 문제점 event선언 하니까 출력 x 그냥 10ns 대기하도록 수정 함