ここのところは論理回路の設計をやっているのだが、
古い設計のモジュールがあって、ある種のマイコンとのインターフェースになっている。
かなり奇妙な設計のモジュールなのだが、それもこれも設計が本当に古いから。
重要性が低く、古い設計のままでも機能的に問題がないということで再設計のタイミングを逸してしまったというのが実情なのかなと。
それで、古くさい設計のモジュールAに関係する新しい機能を実装することになった。
関係する機能なんだから、モジュールAに新たに組み込んだ方がよくない?と提案したのだが、
いろいろな事情があって、他のモジュールの機能として組み込むことになった。
機能の実装ができたので、シミュレーションで動作確認してみようということで、
新機能のユースケースに沿って、テストシナリオを書こうとしたのだが……
そのユースケースはこんなのだった。
- 新しく追加したレジスタに書き込みを行い、新機能を作動させる
- モジュールAからマイコンをリセットする
- リセット解除後、マイコンは新機能へアクセスする
ということで、1, 2と順番にやって、リセット解除時点でマイコンから新機能へのアクセスが想定通りに動くか確認すればよい。
ここで2のリセットのために、モジュールAの関連レジスタ一覧を見たのだが、リセット機能に紐付いたものがない。
でもRTL見る限りはなんらかのレジスタを叩くとリセットできそうなんだけどなぁ。
と思って詳しく見ると、枠外に「リセットは xxxxxxxx番地に0x00をライト、リセット解除は0x80をライトする」という記述があった。
この記述を見ると、レジスタに紐付いていない特定のアドレスに書き込みを行うとリセットできると読めるが、
いやいや、それって書き込み専用のレジスタって言うんじゃないの?
このモジュールを設計した人がそこまで意識していたかは知らないけど、実態はそうだと思うんだよね。
確かにこのモジュールに関連する他のレジスタはどれもリードもライトもできるもので、
それとはかなり違う構造なので、別扱いをしたんだろうなと思ったんだけど、それが不親切だと。
レジスタには読み出し専用のもの、読み書きできるもの、書き込み専用のものがある。
読み出し専用のレジスタは状態を表示するレジスタ、例えばタイマのカウント値を表示したり、外部ピンの入力値を表示したり。
読み書きどちらもできるレジスタは状態の設定に使われることが多い。設定鎮の書き込みと確認ができると。
あと、リセットだけできるレジスタというのもあって、エラーログレジスタとかがそうなんだけど、
エラー発生時に値が設定され、レジスタリードで値を確認し、確認したらレジスタライトでリセットするというような使い方をする。
任意の値を書き込める必要はないレジスタだと、こういうやり方はよく行われている気がする。
こういうのはわかりやすいのだが、書き込みしかできないレジスタというのは特殊だよね。
値を書き込んだのに、リードしても書き込んだ値が確認出来ないということで、ちょっと不思議なレジスタだ。
このシステムでの書き込み専用レジスタの代表例がリセットレジスタだ。
マジックワードを書き込むとリセットが行われるようになっている。
書き込みだけできて読み出しができないのは、現状態を確認できる必要がないからだろう。
読み出せるようにしたところで、マジックワードを書き込む→リセット発生→リセット完了後にマジックワードが自動的に消える ってなるだけでしょうから。
というわけで、この問題提起をきっかけにして、モジュールAのリセット機能は書き込み専用レジスタという形で仕様書に記載されることになりそうだ。
xxxxxxxx番地にリセットレジスタがあって、このレジスタは書き込み専用で、7bit目が0のときリセット、1のときリセット解除という形で書かれるのかなと。
もともと書き込み専用レジスタだと思って作り込まれていないのでちょっと怪しい造りなのだが、
外部仕様としてはこれがわかりやすいでしょうからね。