현업으로 FPGA RTL 개발하고 있는 개발자인데 


제미나이 2.5 프로 랑 클로드 4 소넷 둘다 구독해서 같은 프롬프트(gem, 프로젝트)로 설계 문서 작성해보고 느낀 내용임


FPGA 분야 자체가 모델이 학습할만한 데이터가 적기는 한데 제미나이 프로가 넘사벽 수준으로 문서를 잘 작성해주는 거 같다


간단한 코드로 시험해 봤는데 보안 이슈 때문에 모델 응답 일부만 발췌함


----- 사용 프롬프트 ------


# RTL 설계 문서 생성기


너는 FPGA RTL 개발자다, 너의 역할은 제공된 코드의 설계 문서를 작성하는 것이다


## 설계 문서의 구조:

1. 모듈 개요

    - 기능 설명

    - 인터페이스

    - 성능 사양

2. 모듈 인터페이스

    - 입출력 신호

    - 타이밍 다이어그램

    - 제어 절차

    - 레지스터 맵

    - 개별 레지스터

3. 내부 구조

    - 서브 모듈 구성

    - 상태 머신

    - 주요 신호 흐름

4. 동작 원리

    - 알고리즘 설명

    - 제어 로직

    - 데이터 처리 과정

5. 설계 고려사항

    - 타이밍 제약

    - 리소스 사용량 추정

6. 시뮬레이션 결과

    - 테스트 시나리오

    - 파형 분석

    - 검증 결과


## 문서 구조의 각 항목에 대한 상세 지시사항은 다음과 같다:

    - 인터페이스 : 인터페이스 단위로 설명 한다

    - 입출력 신호 : 표 형식 (신호 그룹, 신호명, 타입, 비트 폭(크기), 설명)

    ### 제어 절차 :

        - 해당시, 기능 사용을 위해 사용자에게 요구되는 제어 절차, 레지스터 제어 등

        - 사용자 제어 절차 중 모듈의 동작에 대한 설명이 포함될 경우 사용자의 제어 절차에 대한 내용과 혼동을 피하기 위해 '모듈이 ~' 같은 표현을 사용

        - 제어를 위해 사용되는 인터페이스의 각 신호에 필요한 제어값 포함

        - 예제 : 메모리 주소 신호에 원하는 주소를 넣고 활성화 신호에 1 사이클 동안 '1'을 입력한다

    - 레지스터 맵 : 해당시, 표 형식(주소 오프셋, 레지스터명, 타입(RO,WO,R/W), 초기값, 설명)

    - 개별 레지스터 : 해당시, 항목명은 레지스터 이름을 사용, 개별 레지스터(워드)에 대한 설명, 표 형식(비트, 기능명, 타입(RO,WO,R/W), 초기값, 설명)

    - 서브 모듈 구성 : 해당시, 표 형식(모듈 이름, 이름, 설명)

    ### 상태 머신 :

        - 해당시, 표 형식(상태, 기능, 다음 상태 조건)

        - 각 상태별로 간단명료하게 작성한다


## 작성 규칙:

    - 설계 의도에 대한 해석보다 명확한 사실을 기반으로한 설명을 선호한다

    - 명시된 설계 문서의 구조의 모든 구조를 포함하되 제공된 코드에 해당하지 않는 항목은 '해당 사항 없음'으로 쓴다

    - 각기 다른 여러 요청(다른 채팅에서도)에 대해 답변의 형식과 톤, 용어에서 일관성을 유지해야 한다 (low temperature)

    ### 전문 용어는 다음 규칙에 따라 사용한다:

        - 영어를 선호하나 문화권에서 영어보다 사용 빈도가 높은 외래어가 있을 경우 외래어를 사용한다

        - 같은 맥락 내에서 번역어, 외래어, 영어의 혼용을 피한다

        #### 번역어와 외래어의 조합은 피한다

            - '활성 하이' : 'active high'

    - 작성된 문서는 '니다' 같은 표현보다 '다', '이다' 같은 표현을 사용한다


----- 제미나이 모듈 기능 설명 -----


모듈은 EEPROM으로부터 하드웨어 버전 정보를 읽어오고, 데이터의 유효성을 검증하기 위한 체크섬 계산을 수행한다. 또한, 두 개의 독립적인 Board Specific Built-In Test (BIT) 인터페이스를 통해 EEPROM에 데이터를 쓸 수 있는 기능을 제공한다. EEPROM에서 읽은 데이터의 체크섬이 유효할 경우, 하드웨어 버전 정보를 출력하고, 오류 발생 시 에러 플래그를 설정한다.



----- 클로드 모듈 기능 설명 -----


모듈은 EEPROM에 저장된 하드웨어 버전 정보를 읽어서 체크섬을 검증하고, I2C 인터페이스를 통한 EEPROM 쓰기 동작을 제어하는 역할을 한다. 이 모듈은 EEPROM에서 160비트 데이터를 읽어 체크섬을 계산하고, 검증이 성공하면 128비트 하드웨어 버전 정보를 출력한다.



----- 제미나이 제어 절차 설명 -----


EEPROM 쓰기 절차

EEPROM에 데이터를 쓰기 위해서는 Board specific BIT I/F 중 하나를 사용한다.

  1. 채널 선택 및 데이터 준비:

    • BIT 인터페이스 0을 사용하는 경우:
      • i2c_ram_wr_en_0_i 신호에 '1'을 입력한다.
      • i2c_ram_addr_0_i 신호에 쓰고자 하는 I2C RAM 주소를 입력한다.
      • i2c_ram_wr_data_0_i 신호에 쓰고자 하는 8비트 데이터를 입력한다.
    • BIT 인터페이스 1을 사용하는 경우:
      • i2c_ram_wr_en_0_i 신호에 '0'을 입력하고, i2c_ram_wr_en_1_i 신호에 '1'을 입력한다.
      • i2c_ram_addr_1_i 신호에 쓰고자 하는 I2C RAM 주소를 입력한다.
      • i2c_ram_wr_data_1_i 신호에 쓰고자 하는 8비트 데이터를 입력한다.
  2. 모듈의 EEPROM 쓰기 동작:

    • 사용자가 i2c_ram_wr_en_0_i 또는 i2c_ram_wr_en_1_i를 '1'로 설정하면, 모듈은 선택된 채널의 i2c_ram_addr_x_i 값을 내부 i_i2c_ram_addr_mux로 전달한다.
    • 모듈이 i_i2c_ram_addr_mux 값이 다음 범위 중 하나에 해당하면 eeprom_wr_en_o 신호를 '1'로 활성화한다:
      • x"0028" 부터 x"0037" 까지
      • x"003C" 부터 x"003F" 까지
    • 위 조건에 해당하지 않으면 eeprom_wr_en_o는 '0'이 된다.
    • eeprom_wr_addr_o 신호값은 다음과 같이 계산된 내부 16비트 주소 i_eeprom_wr_addr의 하위 8비트이다:
      • i_i2c_ram_addr_mux가 x"0028" ~ x"0037" 범위일 경우: i_eeprom_wr_addr = i_i2c_ram_addr_mux - 40 (결과적으로 EEPROM 주소 x"00" ~ x"0F"에 해당).
      • i_i2c_ram_addr_mux가 x"003C" ~ x"003F" 범위일 경우: i_eeprom_wr_addr = i_i2c_ram_addr_mux - (60 - 16) (결과적으로 EEPROM 주소 x"10" ~ x"13"에 해당).
    • eeprom_wr_data_o 신호에는 선택된 채널의 i2c_ram_wr_data_x_i 값이 전달된다.


----- 클로드 제어 절차 설명 -----

EEPROM 쓰기 동작
  • I2C RAM 인터페이스를 통해 주소 0x00280x0037 또는 0x003C0x003F 범위에 쓰기를 시도할 때 EEPROM 쓰기가 활성화된다
  • i2c_ram_wr_en_0_i 또는 i2c_ram_wr_en_1_i를 '1'로 설정하고 해당 주소와 데이터를 입력한다
  • 모듈이 자동으로 EEPROM 주소로 변환하여 쓰기 동작을 수행한다

하드웨어 버전 읽기
  • 모듈이 리셋 해제 후 자동으로 EEPROM 데이터를 읽어 체크섬을 계산한다
  • 체크섬이 유효하면 hw_ver_o에 128비트 하드웨어 버전이 출력된다
  • 체크섬이 유효하지 않으면 chk_sum_err_o가 '1'로 설정된다


일부만 봐도 사용하는 표현이나 문장 구성, 제미나이가 goat인듯


내 프롬프트가 ㅄ인가 제미나이가 코드 분석도 잘하고 분석을 잘하니 문서로 훨씬 잘 써주네