(System)Verilog 시스템 베릴로그(11)
-
[Verilog/SystemVerilog] SystemVerilog Fork-Join: 프로세스와 스레드의 동시 실행
SystemVerilog에서 fork와 join은 여러 개의 병렬 프로세스를 제어하는데 사용되는 중요한 키워드입니다. 이를 이해하기 위해서는 먼저 프로세스와 스레드에 대한 개념을 짚어볼 필요가 있습니다.프로세스 (Process)실행 중인 프로그램 자체를 의미합니다. 하나의 독립된 작업 단위로, 프로그램의 실행 흐름을 담당합니다.스레드 (Thread)프로세스 내에서 실행되는 작업의 흐름을 뜻하며, 하나의 프로세스 안에 여러 스레드가 존재할 수 있습니다.fork와 join의 기본 개념1. Forkfork는 병렬로 여러 프로세스를 동시에 실행시키는 키워드입니다. fork 블록 내의 모든 문장은 동일한 시점에 병렬적으로 시작됩니다.2. Joinfork로 생성된 병렬 프로세스들이 종료될 때까지 기다리는 키워드입니..
2024.10.20 -
[Verilog/SystemVerilog] 베릴로그와 시스템베릴로그의 차이(2) | 모듈 포트 vs 인터페이스 : 특징과 예시
베릴로그와 시스템베릴로그의 차이에 대한 이전 편2024.05.11 - [컴퓨터언어/(System)Verilog 시스템 베릴로그] - [Verilog/SystemVerilog] 베릴로그와 시스템베릴로그의 차이(1) | 문자 값 할당 | 데이터 타입, 오브젝트 타입 [Verilog/SystemVerilog] 베릴로그와 시스템베릴로그의 차이(1) | 문자 값 할당 | 데이터 타입, 오브젝트문자값 할당Verilog 언어는 Vector에 모두 0, X, Z를 넣는 것이 쉽다.parameter SIZE = 64;reg [SIZE -1 :0] data;data = 0; // 모든 비트를 0으로 채움data = 'bz; // 모든 비트를 Z로 채움data = 'bx; // 모든 비트를 X로 채움wolleyneerg.t..
2024.08.11 -
[Verilog/SystemVerilog] 베릴로그와 시스템베릴로그의 차이(1) | 문자 값 할당 | 데이터 타입, 오브젝트 타입
문자값 할당Verilog 언어는 Vector에 모두 0, X, Z를 넣는 것이 쉽다.parameter SIZE = 64;reg [SIZE -1 :0] data;data = 0; // 모든 비트를 0으로 채움data = 'bz; // 모든 비트를 Z로 채움data = 'bx; // 모든 비트를 X로 채움 위 코드예제는 확장/축소가 가능하며, SIZE 파라미터값이 128로 재정의 된다면 자동으로 data에 새로운 크기를 적용해 확장한다. 그러나 모든 비트에 1을 넣는 쉬운 방법이 제공되지 않는다.모든 비트를 1로 채우기 위해서는 정해진 크기를 사용해야 한다.data = 64'hffffffffffffffff;위 코드는 확장/축소가 불가능하며 size를 128로 수정해도 그 크기에 맞게 수동으로 수정해주지 ..
2024.08.11 -
[SystemVerilog] 시스템 베릴로그의 이벤트, 세마포어 사용법 | @event, wait, semaphore
event 서로 다른 스레드를 테스트벤치의 이벤트 핸들을 통해 동기화 Verilog에서 "이벤트"는 시간의 흐름을 트리거하는 데 사용되는 특별한 상황을 나타내며, 시뮬레이션 동작을 트리거하거나 조절하는 데 사용된다. (주로 posedge 또는 negedge를 사용한다.) 이벤트의 기초내용을 설명하자면,event event_a; // 이벤트 "a" 선언// 트리거.해당 이벤트를 발생시킬 때 사용.->event_a; // "->" 연산자를 사용하여 트리거. // a 이벤트가 발생할 때까지 대기@event_a; // "@" 연산자를 사용하여 이벤트 waitwait (event_a.triggered); // 위와 같이 event wait (차이점 아래 설명)@와 .triggered의 차이점: triggere..
2024.06.20 -
[SystemVerilog] 다이나믹 캐스팅 (dynamic casting) 이란? | $cast(), 캐스팅 반환 값
시스템 베릴로그는 하드웨어 설계와 검증을 위한 강력한 언어로 다양한 기능을 제공하는데, 그중 다이나믹 캐스팅 (dynamic casting)은 객체 지향 프로그래밍(OOP)에서 중요한 역할을 한다. 다이나믹 캐스팅이란?다이나믹 캐스팅 (dynamic casting)은 객체 지향 프로그래밍에서 객체를 하나의 타입에서 다른 타입으로 변환하는 방법이다.시스템 베릴로그에서 다이나믹 캐스팅은 주로 클래스의 상속 관계에서 부모 클래스의 포인터를 자식 클래스의 포인터로 변환할때 사용된다. 다이나믹 캐스팅이 중요한 이유유연성 : 상속 관계에 있는 클래스 간의 타입 변환을 가능하게 해 코드의 유연성을 높임안전성 : 런타임에 타입을 확인하고 변환하여 잘못된 타입 변환을 방지 다이나믹 캐스팅의 기본 구문- $cast(..
2024.05.30 -
[SystemVerilog] 시스템베릴로그의 Queue : 동적 데이터 구조 이해하기 | push_back, push_front, pop_back, pop_front | queue와 FIFO
Queue는 시스템베릴로그에서 중요한 동적 데이터 구조로, 데이터의 삽입과 삭제가 용이하여 하드웨어 설계와 검증에서 자주 사용된다. 이 글에서는 Queue의 선언, 삽입, 삭제, 크기 확인, 인덱싱 및 활용 예시를 다루었다. Queue를 잘 활용하면 보다 효율적이고 유연한 하드웨어 설계가 가능하다. Queue란?queue는 순차적으로 데이터를 저장하는 동적 배열로, 먼저 들어간 데이터가 가장 먼저 삭제되는 FIFO (First-In, First-Out) 방식이다. 즉, 선입선출로 동작하는 대기열이다. queue 정의- queue는 동적 크기를 가지기 때문에 선언할 때 크기를 지정하지 않다.- 기본적으로 [$]를 사용하여 선언한다.int queue_name[$]; 그림 예시로 보면 이해가 쉽다.0 ..
2024.05.30 -
[Verilog/SystemVerilog] 베릴로그 기초 | 베릴로그의 기본 문법과 예제
모든 베릴로그 설계는 모듈(Module)로 시작하며, 모듈은 하드웨어의 기본 단위로, 입력과 출력 포트를 포함한다. 기본 모듈의 예시)module module_name ( input wire input1, input wire input2, output wire output1); // 모듈 내부 내용 endmodule 데이터 타입 (Data Type)wire : 조합 논리 신호 (지속적으로 구동되어야하는 조건)reg : 레지스터 신호 (동기식 논리, 변수와 같은 값을 유지) wire my_wire;reg my_reg; 연산자논리 연산자 : & (AND), | (OR), ~ (NOT)비교 연산자 : == (같음), != 다름산술 연산자 : + (덧셈), - (뺄셈), * (곱셈..
2024.05.28 -
[SystemVerilog] 시스템 베릴로그의 할당 연산자, 산술 시프트 (<<<=, >>>=)
SystemVerilog는 Verilog의 연산자에 몇 가지 할당 타입을 추가했다. *우항 : RHS (Right-Hand Side)*좌항 : LHS (Left-Hand Side)+=RHS를 LHS에 더하고 할당한다.-=RHS를 LHS에 빼고 할당한다.*=RHS를 LHS에 곱하고 할당한다./=RHS를 LHS에 나누고 할당한다.%=RHS를 LHS에 더하고 나머지를 할당한다.&=RHS와 LHS를 비트연산 AND 하고 할당한다.|=RHS와 LHS를 비트연산 OR 하고 할당한다.^=RHS와 LHS를 비트연산 XOR 하고 할당한다.RHS 만큼 LHS를 왼쪽 비트 시프트하고 할당한다.>>=RHS 만큼 LHS를 오른쪽 비트 시프트하고 할당한다.RHS 만큼 LHS를 왼쪽 산술 시프트하고 할당한다.>>>=RHS 만큼 L..
2024.05.13