組込みソフトウェア開発と生成AI その2 レジスタ禁止操作の抽出

# この記事は何?
以前に[組込みソフトウェア開発と生成AI その1 兼用端子設定](https://qiita.com/juraruming/items/5a841623ac0833795373)というテーマで記事を書きました。
組込みソフトウェア開発で生成AIを使い、作業を楽に・効率化することはできないか試してみます。

# テーマ
前回はマイコンの端子設定が生成AIでできないか確認しました。
今回はマイコンのマニュアルから**レジスタの禁止操作を抽出すること**を試します。
マイコンには多くのレジスタが存在し、設定禁止内容がマニュアルに書かれています。
生成AIでマイコンのマニュアルからレジスタ禁止操作を抽出・リスト化し、コードが禁止操作を実施していないか確認する時に使えないかと思ったので試してみます。


# 対象
## 生成AI
生成AIは以下を試しました。

* Gemini 2.0 Flash
* Gemini 2.5 (preview)
* ChatGPT o3

確認した結果、ChatGPT o3が一番期待値と近い結果となりました。

## 対象マイコン
対象マイコンはRenesasエレクトロニクス社のRX630とします。
仕事で使うことが多いのでこのマイコンを選択しました。

[RX630 USB、12 ビット A/Dなど周辺機能も強化した 32 ビットマイクロコントローラ](https://www.renesas.com/jp/ja/products/microcontrollers-microprocessors/rx-32-bit-performance-efficiency-mcus/rx630-32-bit-microcontroller-usb-12-bit-ad-and-other-enhanced-peripheral-functions)

## 対象テーマ
RX630には多数のレジスタがあります（RX630に限らずマイコン全般に言えると思います）。
今回は **CANモジュールの34.2.2 ビットコンフィグレーションレジスタ（BCR）の禁止操作を抽出できるか?** をテーマにしたいと思います。

具体的にはマニュアル [RX630グループ ユーザーズマニュアル ハードウェア編 Rev.1.60](https://www.renesas.com/jp/ja/document/mah/rx630-group-users-manual-hardware-rev160?r=1054431)の1289〜1290ページに書かれている34.2.2 ビットコンフィグレーションレジスタ（BCR）の表に禁止操作が書かれています。


## レジスタ禁止操作とは?
下図がマニュアルの対象レジスタの記載です。
例えば、つぎがレジスタの禁止操作に該当します。これらの記述を生成AIで一気に抽出できるか確認するのが目的です。

* ビット7 予約ビット -> 0を書くこと
* ビット10〜8 TSEG2TSEG2[2:0] -> 000bは設定しないこと
* ビット11 予約ビット -> 0を書くこと

### ■マニュアル 1289ページ 34.2.2 ビットコンフィグレーションレジスタ（BCR）〜その1〜
![RX630_BCR_register_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171866/05e9f6eb-a354-4eff-9fd9-8253dd2a6ecd.jpeg)

### ■マニュアル 1290ページ 34.2.2 ビットコンフィグレーションレジスタ（BCR）〜その2〜
![RX630_BCR_register_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171866/467e896b-1616-48a4-a1d8-a9aee56bc0d4.jpeg)

### ■マニュアル 1290ページ 34.2.2 ビットコンフィグレーションレジスタ（BCR）〜その3〜
![RX630_BCR_register_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171866/a65e42b0-1055-438e-a8e1-e7a145a1eaf3.jpeg)

# プロンプト
今回ChatGPT o3、Gemini 2.5 (preview)、Gemini 2.0 Flashの3つで試してみました。
3つの生成AIに入力したプロンプトは以下で共通としました。
プロンプトにはマイコンのマニュアル（PDFファイル）を添付しました。

```
添付ファイルはRX630のハードウェアマニュアルです。
1289、1290ページのビットコンフィグレーションレジスタ（BCR）の表で、
レジスタの読み、書きで禁止されている操作を抽出し、リスト化してください。
```

## ChatGPT o3

### 出力結果
以下が出力されました。

///// 出力ここから /////
BCR レジスタで禁止されている主な操作一覧

| #   | 禁止内容                                    | 具体的な対象ビット／状況         | 補足                                                                                                                    | 
| --- | ------------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | 
| 1   | TSEG1[3:0] に 0000b を設定                  | b31‑b28（TSEG1[3:0]）           | “0000b” は「設定しないでください」                                                                                    | 
| 2   | TSEG2[2:0] に 000b を設定                   | b10‑b8（TSEG2[2:0]）            | “000b” は「設定しないでください」                                                                                     | 
| 3   | BRP[9:0] を 0 または 1 に設定（条件付き）   | b25‑b16（BRP[9:0]）             | SCKCR3.CKSEL[2:0] が “010b”（メインクロック選択）の場合は “1 以下を設定しないでください”                            | 
| 4   | 予約ビットを書き換えて 0 以外にする         | b7, b11, b14‑b15, b26, b27 など | 予約ビットは “読むと 0、書く場合 0” が規定。0 以外を書き込むのは禁止                                                  | 
| 5   | 32 ビットアクセスで b0‑b7 を変更           | 32‑bit 書き込み時               | BCR は 24‑bit レジスタ。32‑bit アクセス時に下位 8&nbsp;bit（b0‑b7）を書き換えないこと                                | 
| 6   | CAN オペレーションモード中に BCR を書き換え | 動作モード                       | BCR の変更は「CAN リセットモードまたは CAN Halt モード」のみ許可。運転中（CAN オペレーションモード）での書き込みは禁止 | 
| 7   | TSEG1 と TSEG2 の大小関係違反               | TSEG1[3:0], TSEG2[2:0]          | TSEG2 は TSEG1 より小さい値にする必要あり。これに反する値は設定不可                                                     | 
| 8   | SJW[1:0] を TSEG2 より大きく設定            | b13‑b12（SJW[1:0]）             | SJW は “TSEG2 以下の値” を要求。超える設定は不可                                                                      | 

> 読み出しに関する注意
>・BCR の読み出しで禁止されている操作は特に示されていません。予約ビットを読んだ場合は常に “0” が返ります（仕様どおり）。

上表を守ることで、BCR への誤操作（無効値の設定や動作モード中の書き換え）による CAN 通信エラーや不定動作を防げます。
///// 出力ここまで /////


### 俺じゃなきゃ見逃しちゃうね
前回の記事に引き続き、漫画HUNTER×HUNTERの団長の手刀を見逃さなかった人のセリフがでました（このセリフを言いたかった）。

一見、出力結果は問題なさそうですが、レジスタ禁止操作に以下の2つの抽出漏れがありました。

* TSEG1[3:0] に 0001bを設定する。
* TSEG1[3:0] に 0010bを設定する。

### 追加のプロンプト
以下の追加のプロンプトを入力しました。

```
以下も禁止操作でしょうか?

・TSEG1[3:0] に 0001bを設定する。
・TSEG1[3:0] に 0010bを設定する。
```

出力結果は以下になりました。

///// 出力ここから /////
はい、どちらも 禁止 です。

マニュアルでは TSEG1[3:0] の値について

* 0000b（0 Tq）
* 0001b（1 Tq）
* 0010b（2 Tq）

の 3 種類を一括して「設定しないでください」と明示しています。許可されるのは 0011b（4 Tq）～1111b（16 Tq） の範囲です。

したがって、質問の

* TSEG1[3:0] = 0001b を設定する
* TSEG1[3:0] = 0010b を設定する

はいずれも BCR レジスタへの禁止操作に該当します。
///// 出力ここまで /////

ChatGPT o3は漏れていた2つのレジスタ禁止操作を正しく禁止操作と認識していました。
1回目のプロンプトで上記2つのレジスタ禁止操作を抽出しなかったのは理由がわからないですが、これでマニュアルに書いてあるビットコンフィグレーションレジスタ（BCR）のレジスタ禁止操作を全て抽出できました。

## Gemini 2.5 (preview)

### 出力結果
以下が出力されました。

///// 出力ここから /////

RX630 ビットコンフィグレーションレジスタ（BCR）における読み書き禁止操作
RX630マイクロコントローラのハードウェアマニュアル（REN_r01uh0040jj0160_rx630_MAH_20140509.pdf）の1289ページに記載されているビットコンフィグレーションレジスタ（BCR）において、読み書きが禁止されている操作は以下の通りです。

ビットコンフィグレーションレジスタ（BCR） 
  
アドレス：0009 0844h、0009 1844h、0009 2844h

書き込みが禁止されている操作：

以下のビットおよびビットフィールドは、CANリセットモード時のみ書き込み可能です。CANオペレーションモード、CAN Haltモード、CANスリープモード時の書き込みは禁止されています。    
* b1-b0 (CCLKS[1:0]): CANクロックソース選択ビット
* b15-b8 (TSEG2[2:0], TSEG1[3:0], SJW[1:0]): ビットタイミング関連ビット
* b19-b16 (BRP[3:0]): ビットレートプリスケーラビット
特定の書き込み値が要求される（禁止ではないが、指定値以外は不正）：

以下のビットは予約ビットであり、書き込む場合は"0"としてください。指定外の値を書き込んだ場合の動作は保証されません。    

* b7-b2: 予約ビット
* b31-b20: 予約ビット
なお、ご要望の1290ページに関する情報は、提供されたファイル内容からは確認できませんでした。上記の情報は1289ページに基づいています。

情報参照元:
REN_r01uh0040jj0160_rx630_MAH_20140509.pdf

///// 出力ここまで /////

### 出力結果の確認
レジスタの禁止操作が漏れなく抽出できませんでした。
例えば、ビット10-8 TSEG2[2:0]の禁止操作が抽出されていないようです。

また、
> なお、ご要望の1290ページに関する情報は、提供されたファイル内容からは確認できませんでした。上記の情報は1289ページに基づいています。

1290ページにレジスタの表はないと認識しているので、ビット31‑28（TSEG1[3:0]）の禁止操作の抽出が漏れています。


## Gemini 2.0 Flash

### 出力結果
以下が出力されました。

///// 出力ここから /////

1289、1290ページのビットコンフィグレーションレジスタ（BCR）の表から、レジスタの読み、書きで禁止されている操作を抽出しました。以下にリスト化します。

* b0: 0, 1 以外の値を設定しないでください。
* b3-b1: 読むと "0" が読めます。書き込む場合、"0" として下さい。
* b6-b5: 00, 01 以外は設定しないでください。
* b7: 読んだ場合、その値は不定。書き込みは無効になります。

///// 出力ここまで /////

### 出力結果の確認
レジスタの禁止操作が漏れなく抽出できませんでした。
また、間違ったビット割り当てとして解釈しているようです。
ビット3-1、ビット6-5は何もシンボルが割り当てられていないですが、禁止操作として抽出しています。
この生成AIモデルはレジスタの仕様が書いてある表を正しく認識できていないようです。

# 感想
今回は生成AIでマイコンのレジスタ禁止操作の抽出ができるか試してみました。
感想としてはつぎのとおりです。

## ChatGPT o3の出力結果が完璧に近かったことに驚いた
ChatGPT o3の出力結果が完璧に近かったことに驚きました。
出力結果とマニュアルの記述を比較し確認したところ2点禁止操作の抽出が漏れていましたが、完成度高い出力が得られることに感心しました。
ここまでレジスタ禁止操作を抽出しリスト化できれば、コードのレジスタ禁止操作実行箇所も調べられるかもしれないと思いました。

以前に仕事で**コードがマイコンのマニュアル禁止事項を実行していないかを確認すること**がありました。
そのときは以下のステップで作業していました。
* マイコンのマニュアルを人力で読み、禁止操作をExcelのリストに抽出する
* Excelのリストとコードを照らし合わせながら禁止操作を確認する

なかなかの苦行でそのときの辛かった経験が今回の生成AIを使った確認、記事を書くことにつながっています。
上の作業を人力でやると以下の不安があります。
* マイコンのマニュアルの禁止操作の抽出が漏れてしまい、不完全なリストになってしまう
* 不完全なリストでコードの実行箇所の確認を進めた結果、コードのマニュアル禁止操作の実行箇所が見つからない・漏れる可能性がある

この確認作業は作業者のスキルや体調によって検証結果が変わりそうです。

今回の生成AIを使った作業方法であれば、属人性が排除でき安定した検証結果となりそうです。

## 生成AI モデルの選定
今回は3つの生成AIモデルで確認をしました。
確認の順番は以下でした。

1. Gemini 2.0 Flash
2. Gemini 2.5 (preview)
3. ChatGPT o3

私は普段はChatGPT 4oを固定で使うことがほとんどです。
最初にGeminiを試したのはネットでドキュメントの認識がすごい、と見た記憶があったからです。

結果、Gemini 2.0 Flash、Gemini 2.5 (preview)では期待するレジスタ禁止操作の抽出ができませんでした。
今回、レジスタ仕様が書いてある表が2ページにまたがって書かれていましたが、Geminiでは2ページ目を認識できていないようでした。
また、レジスタのビット配置を正しく認識できませんでした。

Geminiの2モデルが正しくレジスタ禁止操作を抽出できない結果となり、つぎに試したのがChatGPT 3oでした。
ChatGPT o3は完璧に近い驚きの出力結果となりました。

普段使っているChatGPT 4oではなく、ChatGPT 3oを選択した理由は2025/5/13 Voicyのイケハヤさんの放送を聞いたからでした。

**ChatGPTは課金して使うべき！4o（無料）とo3（有料）は別物ですよ！ - イケハヤ**

https://r.voicy.jp/YQm4ELlQ92W

この放送を聞き、

ChatGPT 4oとChatGPT o3は別物なんだ・・・
　↓
ChatGPT o3はマルチモーダルなんだ・・・。じゃあ、使って試してみよう!

・・・という思考に至りました。

今回の試行で**生成AIモデルで何を使うかの選定が重要**だと感じました。
これからも各種生成AIの特徴をある程度理解したうえで試行していこうと思いました。

# 最後に
長文を最後まで読んでいただきありがとうございました🙇‍♀️
これからも組込みソフトウェア開発 × 生成AIの文脈でいろいろ試行してきたいと思います。