JINTBEAT Design Life

C언어 구조체(struct)와 공동체(union) — 개념부터 시뮬레이션 활용까지 본문

🖥️ - C language

C언어 구조체(struct)와 공동체(union) — 개념부터 시뮬레이션 활용까지

jintbeat_design 2025. 5. 30. 21:24
반응형

 

시스템을 설계하거나 시뮬레이션용 레지스터를 구성할 때, 다양한 변수들을 하나의 단위로 묶어 관리할 수 있다면 훨씬 더 직관적이고 유지보수도 쉬워진다. C언어에서는 바로 이럴 때 구조체(struct)와 공동체(union)를 사용할 수 있다.

 

괸련 내용을 기초부터 정리해보려고 한다.

 

🧩 구조체(struct)란?

구조체는 서로 다른 자료형의 변수를 하나의 묶음으로 정의할 수 있도록 해주는 기능이다. 즉, 새로운 자료형을 만드는 것이라 볼 수 있다.

struct Pixel {
    int x;
    int y;
    char color;
};

 

위 코드는 Pixel이라는 새로운 자료형을 만든 것이다. 이 구조체를 사용하면 다음처럼 변수를 선언하고 사용할 수 있다. 

 

struct Pixel p1;
p1.x = 100;
p1.y = 200;
p1.color = 'R';

 

🎯 핵심 요약

  • struct 구조체이름 { 멤버들 };
  • 선언된 구조체는 일반 변수처럼 사용 가능
  • 구조체 멤버에는 점(.) 연산자를 통해 접근

 

🔍 typedef로 더 간단하게 쓰기

 

typedef를 이용하면 struct 키워드 없이 간결하게 사용할 수 있다.

typedef struct {
    int x;
    int y;
    char color;
} Pixel;

Pixel p1;

 

💡 구조체 안에 배열과 포인터가 들어있다면?

typedef struct {
    int id;
    char name[16];
    int* value_ptr;
} Sensor;

 

  • 배열(name[])은 배열처럼 sensor.name[0] 형태로 접근
  • 포인터(value_ptr)는 일반 포인터처럼 *(sensor.value_ptr) 방식으로 사용

🧪 구조체의 시뮬레이션 활용 예

typedef struct {
    uint32_t CTRL;
    uint32_t STATUS;
    uint32_t DATA;
} RegMap;

RegMap reg;

reg.CTRL = 0x1;
reg.DATA = 0xABCD1234;

 

➡️ 하드웨어의 레지스터 뱅크를 시뮬레이션할 때 구조체를 활용하면 실물에 가까운 형태로 데이터를 모델링할 수 있다.

 

🌀 공동체(union)란?

공동체는 구조체와 비슷하지만 모든 멤버가 같은 메모리 공간을 공유한다.  즉, 하나의 값만 저장되며, 서로 다른 방식으로 해석할 수 있다.

union U32 {
    uint32_t word;
    struct {
        uint8_t b0, b1, b2, b3;
    } bytes;
};

union U32 u;
u.word = 0x12345678;
printf("%X", u.bytes.b0);  // 출력: 78 (리틀엔디안 기준)

🎯 핵심 요약

  • memory reinterpretation에 유용 (예: 32비트를 바이트 단위로 분석)
  • RTL 시뮬레이션에서 byte-level access를 구현할 때 적합

🧠 구조체와 union을 결합한 고급 사용

typedef union {
    uint32_t value;
    struct {
        uint8_t mode : 3;
        uint8_t enable : 1;
        uint8_t channel : 4;
    } bits;
} RegByte;

typedef struct {
    RegByte config;
    uint32_t data;
} MyIP;

 

  • config.value로 전체 1바이트 접근
  • config.bits.mode로 개별 필드 접근
  • 시뮬레이션용 C 코드에서 비트 필드 레지스터를 편리하게 다룰 수 있음

🧭 마무리 요약

구분 STRUCT UNION
메모리 각각 독립적인 메모리 사용 모든 멤버가 하나의 메모리 공유
사용 목적 여러 데이터를 그룹으로 묶기 하나의 값을 여러 방식으로 해석
시뮬레이션 레지스터 뱅크, 구조화된 데이터 표현 레지스터의 바이트/비트 해석 처리

 

 

📌 Tip: RTL 시뮬레이션에서 구조체를 쓰면 IP별 상태 레지스터, 데이터 버스, bit mask 처리 등을 더 직관적으로 구성할 수 있습니다. 그리고 공동체를 함께 쓰면 바이트 접근이나 필드 마스크를 구현하기도 쉬워집니다.

반응형