상세 컨텐츠

본문 제목

System Verilog

카테고리 없음

by 썽심 2024. 2. 20. 03:07

본문

728x90

2024.02.20

 

관련자료

https://wikidocs.net/170326

 

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 대기하도록 수정 함

 

 

728x90