본문 바로가기

전체 글

[UVM] Agent 에이전트는 드라이버, 모니터, 그리고 시퀀서 세 가지 주요 구성 요소로 이루어져 있다. 활성 모드에서는 시퀀서와 드라이버가 구성되고, 시퀀서를 통해 드라이버에 시퀀스 아이템을 전달하여 자극이 생성된다. 동시에 모니터는 핀 레벨 활동을 분석 트랜잭션으로 조립한다. 반면에 수동 모드에서는 오직 모니터만 구성되며, 이는 Active Agent와 같은 기능을 수행한다. 따라서 Passive Agent에서는 시퀀서가 필요 없다. 에이전트의 필요성에 대해 말하자면, 이는 필수적인 요소라기보다는 복잡성을 줄이고 재사용성을 높이는 도구로 볼 수 있다. 에이전트를 사용하지 않으면 환경 수준에서 개별 인스턴스화를 해야 하는데, 이는 불필요하게 복잡하게 만들 수 있다. 따라서 검증 환경에서 에이전트를 사용하지 않는 것은 드.. 더보기
[UVM] Drivers UVM Driver는 testbench에서 Transaction을 전송하는 형태이다. UVM Driver의 예제코드들은 대부분 아래와 같이 사용된다. 여기에 짝으로 UVM Monitor등을 달아서 트랜잭션이 제대로 전달되었는지를 확인한다. 이것 처음보다보면, 왜 이 지점에서 이런것들이 나오는지 이해하기가 쉽지 않은 면이 있다. 갑자기 uvm_config_db가 나오는 것도 그렇고, build_phase라든지, run_phase라든지, 처음보는 입장에서는 맥락없는 장치들이 다수 있다. 이것들은 UVM으로 merge되기전에 OVM이라든지 VMM이라든지 각 회사들의 철학이 녹아들어있던것을 UVM으로 merge하다보니 몇몇 부분에서는 설명이 메뉴얼에도 없고, 잘안되어 있는 부분들이 존재한다. 그래서 일단은 익숙.. 더보기
[UVM] virtual sequencer를 사용하는 목적 UVM(유니버설 검증 방법론)에서 sequencer는 일련의 트랜잭션을 생성하고, 이를 특정 driver로 보내는 역할을 수행한다. 각각의 트랜잭션은 데이터 패킷이나 버스 명령 등을 나타낼 수 있다. sequencer는 테스트 시나리오의 중요한 부분을 구성하며, driver가 수행하는 트랜잭션의 순서를 제어하고 실행 시간을 조절한다. Sequencer는 다음 두 가지 주요 메서드로 구성된다: start_item: 이 메서드는 새로운 트랜잭션을 시작한다. 이 메서드는 일반적으로 트랜잭션을 생성하고, 필요한 모든 데이터를 채우며, 이를 시작할 준비를 한다. finish_item: 이 메서드는 트랜잭션의 완료를 알린다. 이 메서드는 일반적으로 트랜잭션을 driver로 전송하고, driver가 트랜잭션을 수행할.. 더보기
[Rust] 제어문 If-else, while, do-while if statement 제어문, if-else 류는 문들은 보통 모든 언어들에 있는 구문이고, 여기서는 rust가 다른 언어들과 조금 다른 점들만 기술합니다. if [conditions] ... // condition은 boolean식만 들어갈 수 있다. “? : ” 와 같은 삼항 연산자 역시 제대로 동작합니다 특이한 점은 condition에 괄호() 가 필요 없다는점입니다. if condition { ... } else { ... } Conditional loop(while) while같은 conditional loop도 동일합니다. 조건이 만족하면 loop가 실행되고, 아니면 빠져나가는것입니다. do-while은 rust에서는 지원하지 않습니다만, 이것을 구현하는 방법은 존재합니다. let mut i.. 더보기
[Rust] string과 str의 차이점은? Rust에는 문자열 타입이 두가지 존재합니다. 언어 자체에서 지원하는 str과 표준 라이브러리에서 지원하는 String입니다 let s1: &str = "Hello,this is str"; let s2: String = String::from("Hello, this is String"); str은 보통 &str로 많이 사용합니다. String과 &str의 가장 큰 차이점은 String은 문자열 수정이 가능하지만 &str은 read-only입니. &str은 보통 문자열 리터럴이나 문자열 슬라이스를 저장하는데 사용됩니다. String은 동적 heap 문자열의 Vec으로 구현이 되어있습니다. 그래서 문자열 데이터를 확장시키거나, 수정할 때 사용합니다. str은 변경이 어렵습니다. c++과 비교해서 String.. 더보기
[Rust] 벡터 (Vector) Vector Vector는 컬렉션 타입이며 메모리에서 모든 값을 근처에 있는 단일 데이터 구조에 둘 이상의 값을 저장할 수 있습니다. 또, 벡터는 같은 유형의 값만 저장할 수 있습니다. 벡터는 컴파일 타임에 사이즈를 정할 필요는 없고, 동작중에 늘어나거나 줄어들 수 있습니다. 벡터는 scope밖으로 벗어날 경우 해제 됩니다 벡터 생성 벡터를 생성하려면 Vec::new() 함수 또는 vec! 매크로로 생성을 합니다. 초기 값으로 벡터를 생성하면 Rust는 값의 타입을 유추합니다. let v: Vec = Vec::new(); let v = vec![1, 2, 3]; Element 추가 push() 메소드를 사용하면 벡터에 element를 넣을 수 있습니다. let mut v = Vec::new(); v.pu.. 더보기
LLVM Hello world IR생성 LLVM Hello world입니다. clang으로 IR생성하는법을 적어봅니다. 먼저 add.c 파일을 아래와 같이 생성합니다 int globvar = 12; int add(int a) { return globvar + a; } 아래 명령어를 수행하면, (clang install해야합니다) clang -emit-llvm -c -S add.c 아래와 같이 add.ll 파일이 생성됩니다. ; ModuleID = 'add.c' source_filename = "add.c" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-pc-linux-gnu" @gl.. 더보기
[Rust] 타입 추론 (Type Inference) 러스트에서 변수의 타입은 타입에서 추론하거나 일반적으로 유추할 수 있습니다. 이러한 변수를 초기화하는 데 사용되는 표현식입니다. 다음과 같이 선언만 문장이 있습니다.: let number; 위와 같이하고 컴파일하면 에러가 발생합니다. 컴파일러는 그러한 변수에 데이터 유형을 할당할 수 없기 때문에 오류가 에러가 발생합니다. . 메시지는 다음과 같습니다. error[E0282]: type annotations needed 이 에러는 해당 변수의 타입이 지정되어야 함을 의미합니다. 아래와 같이 선언후에 어떤 타입인지를 명기해 주어야 합니다. let number:u32; 컴파일러가 어떤 유형의 변수인지 이해하면 해당 변수에 대한 모든 할당은 해당 타입의 표현식을 사용해야 합니다. 그렇지만, 타입을 추측할 수 있.. 더보기