> 비메모리 설계 엔지니어는 직접 메모리를 만들지는 않는 경우가 많습니다.

이미 만들어져 있는 메모리를 사용하여 메모리 컨트롤러 등을 설계하게 됩니다.

그래서, 상황에 필요한 적당한 메모리를 잘 고를 수 있는 능력이 설계 엔지니어의 역량이라고 생각합니다.

 

1. 1bit Size

  • SRAM (Static RAM): 1비트는 6개의 트랜지스터(6T)를 사용하여 저장됩니다. 셀 구조가 복잡하고 면적이 크지만, 데이터 저장이 전력 공급 시 지속적으로 이루어집니다. 셀 크기가 크기 때문에 고밀도 집적이 어렵습니다.
  • DRAM (Dynamic RAM): 1비트는 1개의 트랜지스터와 1개의 캐패시터(1T1C)를 사용해 저장됩니다. 캐패시터를 통해 데이터를 저장하는데, 시간이 지남에 따라 충전 상태가 변하므로 주기적인 리프레시가 필요합니다. DRAM의 셀 크기는 SRAM보다 작아 고밀도 집적이 가능합니다.
  • 레지스터 (Register): 레지스터는 1비트를 저장하기 위해 D 플립플롭(D Flip-Flop)을 사용합니다. 플립플롭은 4~6개의 트랜지스터로 구성되며, SRAM보다 크기는 작지만, 고속 데이터를 저장하는데 주로 사용됩니다. CPU 내에서 매우 가까운 위치에 있으며, 속도가 가장 빠릅니다. 실제 현업에서는 보통 D F/F gates == 10 gates

>> F/F만으로 설계를 할 경우 AREA의 손해를 많이 볼 수 있습니다. 여러 메모리는 사용하여 직접도를 높혀야합니다.

2. Data Access

  • SRAM: 데이터를 읽고 쓰는 과정이 매우 빠릅니다. 별도의 리프레시 과정이 필요 없으며, 클럭 사이클 동안 데이터를 유지합니다. 메모리 셀에 직접 접근할 수 있는 구조를 가지고 있습니다.
  • DRAM: DRAM은 데이터를 캐패시터에 저장하므로, 데이터를 읽기 전에 리프레시가 필요할 수 있습니다. 메모리에 접근하기 위해선 캐패시터의 충전 상태를 확인하는 과정을 거치며, 이로 인해 SRAM보다 데이터 접근 시간이 상대적으로 깁니다.
  • 레지스터: 레지스터는 CPU 내에서 매우 가까운 위치에 있으며, 데이터 접근 시간이 거의 실시간에 가깝습니다. 매우 짧은 대기 시간으로 인해 레지스터에서 데이터 접근이 가장 빠릅니다.

3. Latency

  • SRAM: 대기 시간이 매우 짧습니다. 전기 신호가 바로 메모리 셀에 전달되기 때문에 데이터 접근 속도가 빠릅니다.
  • DRAM: DRAM은 리프레시 과정과 셀에 접근하는 추가적인 단계가 있어, SRAM보다 대기 시간이 길지만 여전히 빠른 응답을 제공합니다.
  • 레지스터: 레지스터의 대기 시간은 SRAM과 DRAM보다 훨씬 짧습니다. CPU 바로 옆에서 데이터 접근이 이루어지므로, 명령 실행 시 즉각적으로 데이터를 가져올 수 있습니다.

4. Random Access Performance

  • SRAM: 랜덤 접근 성능이 매우 뛰어납니다. 메모리 셀에 직접 접근할 수 있기 때문에 주소에 관계없이 빠른 랜덤 접근이 가능합니다.
  • DRAM: DRAM의 랜덤 접근 성능은 SRAM보다 떨어집니다. 메모리 뱅크 내에서 데이터 접근이 일어나며, 대기 시간이 있어 연속적인 데이터 접근에 유리합니다.
  • 레지스터: 레지스터는 CPU 내에서 동작하는 가장 빠른 메모리이므로, 랜덤 접근 성능도 매우 뛰어납니다. 데이터를 즉시 읽거나 쓸 수 있습니다.

5. Interface

  • SRAM: SRAM은 일반적으로 고속 캐시 메모리나 버퍼로 사용됩니다. CPU와 메모리 사이의 인터페이스는 매우 빠르고, 별도의 복잡한 제어 없이 동작할 수 있습니다.
  • DRAM: DRAM은 메모리 컨트롤러와 함께 동작하며, 외부 인터페이스를 통해 데이터를 교환합니다. 리프레시, 프리차지, 접근 타이밍을 제어하는 복잡한 인터페이스를 필요로 합니다.
  • 레지스터: 레지스터는 CPU 내부에 직접 연결된 가장 가까운 메모리로, 데이터 인터페이스가 매우 단순합니다. CPU의 연산 과정 중에 바로 접근하여 사용됩니다.

요약

  • SRAM: 빠른 속도, 낮은 대기 시간, 높은 랜덤 접근 성능, 그러나 큰 셀 크기와 낮은 집적도.
  • DRAM: 고밀도, 리프레시 필요, 상대적으로 긴 대기 시간, 연속적 데이터 접근에 유리.
  • 레지스터: CPU 내에서 가장 빠르고 직접적인 데이터 접근이 가능하지만, 용량이 매우 작고 고가.

각 메모리는 성능, 비용, 용도에 따라 선택이 달라지며, SRAM은 캐시 메모리, DRAM은 주 메모리, 레지스터는 CPU 내부의 임시 저장 공간으로 사용됩니다.

FSM + Counter

  1. Core가 IDLE인지 확인합니다.
  2. i_run신호와 counting 할  숫자를 core에 전달합니다.
  3. DONE이 될때까지 기다립니다.

 

 

- Verilog Code

* https://github.com/Vamosssss/Basic/tree/main/07.%20FSM/02.%20FSM%20%2B%20Counter


FSM(Traffic Light)

  1. RED will go to YELLOW after 30 cycles.
  2. YELLOW will go to GREEN after 5 cycles.
  3. GREEN will go RED after 20 cycles.
  4. The light color will be output.

 

- Verilog Code

* https://github.com/Vamosssss/Basic/tree/main/07.%20FSM/03.%20FSM(Traffic%20Light)

FSM(Finite State Machine) 로직에서 삼항 연산자(ternary operator)의 중요성은 가독성과 간결함, 효율성을 제공하는 데 있습니다. 삼항 연산자는 특히 상태 변화나 출력 로직을 간결하게 표현할 수 있어 FSM 설계에서 자주 활용됩니다.

 

삼항 연산자(ternary operator)는 세 개의 피연산자를 가지는 연산자로, 주로 조건에 따라 다른 값을 선택할 때 사용됩니다. 조건식 ? 참일 때 값 : 거짓일 때 값 의 형태로 쓰이며, 조건이 참일 때는 첫 번째 값을 반환하고, 거짓일 때는 두 번째 값을 반환합니다. 삼항 연산자는 간단한 조건부 로직을 한 줄로 표현할 수 있어 코드의 간결함과 가독성을 높이는 데 유용합니다.

삼항 연산자의 구조

삼항 연산자는 다음과 같은 형태로 작성됩니다:

- verilog
 
조건식 ? 참일 때의 값 : 거짓일 때의 값;

Verilog에서의 삼항 연산자 예시

-verilog
 
assign result = (a > b) ? a : b;
 

위 코드에서 a가 b보다 클 경우 result는 a의 값을 가지게 되고, 그렇지 않으면 b의 값을 가집니다. 즉, 조건 a > b가 참이면 a가 선택되고, 거짓이면 b가 선택되는 것입니다.

주요 특징

  1. 간결성: if-else 구문으로 표현할 수 있는 조건부 논리를 한 줄로 간결하게 표현할 수 있습니다.
    • if-else 버전:
      - verilog
       
      if (a > b) begin
         result = a;
      end else begin
         result = b;
      end
       
    • 삼항 연산자 사용:
      - verilog
       
      assign result = (a > b) ? a : b;
  2. 가독성: 간단한 조건일 경우 삼항 연산자를 사용하면 코드를 더 직관적이고 읽기 쉽게 만들 수 있습니다.
  3. 효율성: 짧은 논리를 처리할 때는 삼항 연산자가 더 효율적일 수 있으며, 이를 통해 리소스를 절약하고 하드웨어 회로 최적화에도 도움을 줄 수 있습니다.

 

위 그림 처럼 여러 state가 있는 경우에 case문을 활용한 삼항연산자가 if-else문을 활용한 것 보다 유용 할  수 있습니다.

 

-  Verilog Code

https://github.com/Vamosssss/HDLbits_Solutions/blob/main/3.%20Circuit/2.Sequential%20Logic/05.%20FSM/12.%20Lemmings3.v

1. 상태 전이를 분리한 코드

  • 상태 전이 로직이 별도의 always @(*) 블록에서 처리됩니다.
    • always @(*) 블록에서 상태 전이를 계산하고, 그 결과를 next_state에 저장한 후, 클럭 신호와 비동기 리셋 신호에 따라 state 값이 업데이트됩니다.

2. 상태 전이를 통합한 코드

  • 상태 전이 로직이 상태 저장 블록인 always @(posedge clk, posedge areset) 내부에서 처리됩니다.
    • state 값이 조건에 따라 직접 업데이트되며, 상태 전이와 상태 저장이 한 블록에서 이루어집니다.

3. 코드 구조 차이

  • 상태 전이를 분리한 코드에서는 상태 전이와 상태 저장이 각각의 블록에서 독립적으로 처리됩니다.
    • always @(*) 블록에서 상태 전이를 결정하고, 그 이후 클럭 신호에 따라 state가 업데이트되는 2단계 구조입니다.
  • 상태 전이를 통합한 코드는 상태 전이와 상태 저장이 하나의 블록에서 이루어집니다.
    • 전이 및 상태 저장이 동시에 처리되어 더 간결한 형태입니다.

4. 장단점 비교

  • 상태 전이를 분리한 코드의 장점은 상태 전이와 상태 저장이 분리되어 있어 가독성이 좋고, 복잡한 상태 전이 로직을 다룰 때 유지보수하기 용이하다는 점입니다. 상태 전이와 저장이 각각 독립적으로 이루어져 명확한 구조를 가지고 있습니다.
  • 상태 전이를 통합한 코드의 장점은 코드가 더 간단하고 짧다는 점입니다. 단순한 상태 전이를 표현할 때는 더 효율적이고, 필요 없는 복잡성을 줄여줍니다.

5. 어떤 코드가 더 나은가?

  • 복잡한 상태 전이 로직이 필요한 경우에는 상태 전이를 분리한 코드가 더 적합합니다. 상태 전이와 저장이 명확히 구분되어 있어 복잡한 FSM을 구현하거나 유지보수하기에 용이합니다.
  • 단순한 상태 전이 로직이 필요한 경우에는 상태 전이를 통합한 코드가 더 적합합니다. 코드가 간결해지고, 이해하기 쉬운 것이 장점입니다.

결론적으로, 상태 전이가 단순하다면 상태 전이를 통합한 코드, 복잡한 상태 전이를 처리해야 한다면 상태 전이를 분리한 코드가 더 적합합니다.

 


- Verilog Code

https://github.com/Vamosssss/HDLbits_Solutions/tree/main/3.%20Circuit/2.Sequential%20Logic/05.%20FSM

SM 로직 설계를 할 때 일반적으로 상태 선언, 상태 전이, 다음 상태 결정 로직, 출력 로직으로 나누어 설계합니다. 아래에서 각 부분을 설명하고, Verilog로 구현한 코드를 예시로 보여드리겠습니다.

1. 상태 선언 (State Declaration)

FSM에서 사용할 상태를 정의합니다. 상태는 보통 localparam으로 선언하여, 가독성과 유지보수성을 높입니다. 각 상태는 고유한 값을 가집니다.

localparam S0 = 2'b00, S1 = 2'b01, S2 = 2'b10;

2. 상태 전이 (State Transition)

현재 상태에서 다음 상태로의 전이를 클럭 신호에 맞추어 업데이트하는 부분입니다. 플립플롭(flip-flop)을 사용하여 현재 상태를 저장합니다.

 
always @(posedge clk or posedge reset) begin
if (reset) begin present_state <= S0; // 리셋 시 초기 상태로 설정
end else begin present_state <= next_state; // 다음 상태로 전이
end
end

3. 다음 상태 결정 로직 (Next State Logic)

현재 상태와 입력에 따라 다음 상태를 결정하는 조합 논리입니다. always @(*) 블록을 사용하여 현재 상태와 입력 신호에 따라 다음 상태를 계산합니다.

 
always @(*) begin
case (present_state)
S0: if (in) next_state = S1; else next_state = S0;
S1: if (in) next_state = S2; else next_state = S0;
S2: if (in) next_state = S0; else next_state = S1;
default: next_state = S0; // 기본 상태
endcase
end

4. 출력 로직 (Output Logic)

출력 로직은 Moore FSM과 Mealy FSM에 따라 달라집니다. 여기서는 Moore FSM을 기준으로, 출력은 현재 상태에만 의존합니다.

 
always @(*) begin
case (present_state)
S0: out = 0;
S1: out = 1;
S2: out = 0;
default: out = 0;
endcase
end
 
  • 상태 선언: S0, S1, S2 세 가지 상태가 localparam으로 선언되었습니다.
  • 상태 전이: 현재 상태는 클럭 신호에 맞추어 업데이트됩니다. 리셋 신호가 들어오면 FSM은 기본 상태(S0)로 돌아갑니다.
  • 다음 상태 결정 로직: 현재 상태와 입력 신호 in에 따라 다음 상태를 결정합니다.
  • 출력 로직: 출력은 현재 상태에 따라 결정됩니다. Moore FSM에서는 출력이 상태에만 의존하므로, 상태에 따른 출력값을 정의합니다.

* Coding Style

  • next_state is complemented by case statements, combinational logic
  • curr_state is F/F output of next_state
  • Above 2 things can be combined into one procedure block
  • localparam(parameter) is used for state encoding

 

 

- Verilog code

* https://github.com/Vamosssss/Basic/tree/main/07.%20FSM/01-1.%20FSM%202%20Design%20Style

'Verilog HDL > Basics' 카테고리의 다른 글

09-3. FSM(Finite State Machine) Transition통합, 분리  (0) 2024.10.07
09-2. FSM(Finite State Machine) Typiclal Design  (0) 2024.10.07
09. FSM (Finite State Machine)  (2) 2024.10.06
08. Pipeline  (1) 2024.10.06
07. Counter  (0) 2024.10.06

FSM(Finite State Machine, 유한 상태 기계)은 시스템이 일정한 개수의 상태를 가지며, 현재 상태와 입력 신호에 따라 상태가 변화하고, 그에 따라 출력을 결정하는 논리 구조를 말합니다. FSM은 주로 디지털 시스템 설계에서 사용되며, 복잡한 동작을 간단하게 설계하고 분석할 수 있도록 합니다.

 

> FSM을 사용하면 비교적  쉽게 Controller를 설계 할 수 있습니다.

참고로 FSM을 사용하지 않고 if else 분기문을 통하여 간단한 control 설계는 가능하지만, HW는 동시성의 개념 때문에  if else 문을 많이 사용하게되면 control이 꼬이게 될 수 있다.

 

한 번에 오로지 하나의 상태만을 가지게 되며, 현재 상태(Current State)란 임의의 주어진 시간의 상태를 칭한다.

이러한 기계는 어떠한 사건(Event)에 의해 한 상태에서 다른상태로 변화할 수 있으며, 이를 전이(Transition)이라한다.

 

IDLE >> (i_run==1) >> RUN >> (is_done?) >> DONE >> IDLE 

 

위와 같은  FSM Logic이 있다면 State는 IDEL, RUN, DONE 이렇게 세개가 존재합니다. 

현재 상태가 IDLE이고 (i_run==1)일때 RUN State로 전이(Transition)되고, 여기서 (i_run==1)이 Event가 됩니다.

 

Mealy & Moore Machine

  • Moore FSM: 출력이 현재 상태에만 의존하는 구조입니다. 즉, 현재 어떤 상태인지에 따라 출력이 결정됩니다.
  • Mealy FSM: 출력이 현재 상태와 입력 신호에 모두 의존하는 구조입니다. 즉, 입력에 따라 같은 상태에서 다른 출력을 만들 수 있습니다.

> Mealy Machine은 State와 Input 까지 보기 때문에, 출력값에 Timing을 손해보게됩니다.(Delay)

특히 output이 나갈때, F/F을 거치지 않고 나간다면, Noise나 Glitch와 같은 오동작 원인이 유발할 수 있습니다.

Moore는 input을 안보기 때문에, 단방향으로 Data가 흘러가는 시스템에서 사용할 수 있습니다.

Ready/Valid 등 양방향 Handshake interface등을 사용하게 된다면 Mealy Machine을 이용하여 설계해야 합니다.

이처럼 설계의 경험치가 쌓이면서 각각의 장단을 고려해 설계해야 합니다.

 


 

실습) Core를 Control하기 위한 FSM설계

IDLE >> (i_run==1) >> RUN >> (is_done?) >> DONE >> IDLE 

  • 처음 Reset이 입력되면 IDLE상태가 됩니다. 그리고 i_run신호를 '1'로 Set하기 전까지 대기합니다.
  • i_run신호가 '1'로 Set되면, IDLE에서 RUN으로 Transition이 발생합니다. is_done이 '1'이 될때 까지 유지합니다.
  • is_done이 '1'이 되면 DONE 상태가 되고, 1Cycle뒤에 IDLE로 돌아옵니다.

 

- Verilog Code

* https://github.com/Vamosssss/Basic/tree/main/07.%20FSM/01.FSM%20Basic

 

 

 

 

 

'Verilog HDL > Basics' 카테고리의 다른 글

09-2. FSM(Finite State Machine) Typiclal Design  (0) 2024.10.07
09-1 . FSM(Finite State Machine) Coding Style  (0) 2024.10.07
08. Pipeline  (1) 2024.10.06
07. Counter  (0) 2024.10.06
06. Combination Logic  (0) 2024.10.06

한 데이터 처리 단계의 출력이 다음 단계의 입력으로 이어지는 형태로 연결된 구조를 가리킨다. 이렇게 연결된 데이터 처리 단계는 한 여러 단계가 서로 동시에, 또는 병렬적으로 수행될 수 있어 효율성의 향상을 꾀할 수 있다. 각 단계 사이의 입출력을 중계하기 위해 Buffer가 사용될 수 있다.

* https://ko.wikipedia.org/wiki/%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8_(%EC%BB%B4%ED%93%A8%ED%8C%85)

Pipeline은 여러 작업 단계를 동시에 처리하여 성능을 향상시키는 기법입니다.

  • 레이턴시 (Latency): 작업이 완료되기까지 걸리는 시간으로, 초기에는 길지만 파이프라인이 가동되면 각 클럭 사이클마다 새로운 작업이 완료되어 상대적으로 낮아집니다.
  • 처리량 (Throughput): 일정 시간 동안 처리할 수 있는 작업의 양으로, 파이프라인 구조로 인해 작업 흐름이 원활해져 증가합니다.

Hw에서의 Pipeline의 장점

 

  • 성능 향상: 여러 작업을 동시에 처리함으로써 CPU의 자원을 효율적으로 활용하여 전체 성능을 크게 향상시킵니다.
  • 자원 활용 극대화: 각 단계가 독립적으로 작동하여 동일한 하드웨어 자원을 더 효과적으로 사용할 수 있습니다. 이를 통해 성능 향상 및 비용 절감이 가능합니다.
  • 작업 병렬 처리: 여러 명령어를 동시에 실행할 수 있어 CPU의 처리 능력을 극대화하고, Latency를 줄입니다.
  • Throughput 증가: 파이프라인이 완전히 가동되면 매 클럭 사이클마다 작업이 완료되므로, 시스템의 전반적인 처리량이 증가합니다.

 

이러한 이유로 CPU혹은 GPU등의 Architecture 에서 Pipeline을 많이 사용합니다.

 

 


실습) Power of 8 Operation

  • Latency : 3 Cycle
  • Throughput : 1 Cycle

 

 

 

- Verilog Code

* https://github.com/Vamosssss/Basic/tree/main/06.Pipeline

 

> SW는 Sequential하기 때문에 Loop가 끝나기 전까지 새로운 입력을 받아서 계산이 불가능합니다.

반면, HW에서는 F/F이라는 Buffer가 있기 때문에 매 Cycle마다 새로운 입력을 받아서 계산이 가능합니다.

예를 들어, HW의 clock이 1GHz라고 한다면, 100번 연산을 하는데 102Cycle이 필요합니다

그에 반해, SW에서는 CPU가 3GHz 라고 하고, 3Cycle마다 결과가 나온다 하더라고 300Cycle이 필요하게 됩니다.

그래서 AI처럼 단순하면서도 많은 연산을 필요로 할 땐 HW를 사용할  수 밖에 없습니다.

그리고, Pipeline을 잘 유지하도록 설계가 되어야 Performance를 잘 끌어 올릴 수 있습니다.

 

'Verilog HDL > Basics' 카테고리의 다른 글

09-1 . FSM(Finite State Machine) Coding Style  (0) 2024.10.07
09. FSM (Finite State Machine)  (2) 2024.10.06
07. Counter  (0) 2024.10.06
06. Combination Logic  (0) 2024.10.06
05. D Flip-Flop & Reset(실습)  (0) 2024.10.06

+ Recent posts