현업으로 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에 데이터를 쓰기 위해서는 Board specific BIT I/F 중 하나를 사용한다.
-
채널 선택 및 데이터 준비:
- 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비트 데이터를 입력한다.
- BIT 인터페이스 0을 사용하는 경우:
-
모듈의 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인듯
내 프롬프트가 ㅄ인가 제미나이가 코드 분석도 잘하고 분석을 잘하니 문서로 훨씬 잘 써주네
댓글 0