MITOUJTAGのJTAGスクリプトでレジスタを直接操作できるように拡張中
MITOUJTAGの今後のバージョンアップ方針の第一はJTAGスクリプトの拡張です。
今日はJTAGスクリプトのこれまでのマイナーなアップデートで何を更新してきたのかを整理して、JTAGデバイスのプライベート命令を発行したり、プライベートレジスタを操作したりできるよう、機能の拡張を図っています。
まずは、以下のようなコードを実行できるようにすることを考えました。
chain->devices[0]->ir->set("EXTEST");
chain->devices[1]->ir->send("BYPASS");
chain->devices[0]->dr->setlen(122);
chain->devices[1]->dr->setlen(1);
chain->devices[0]->dr->set(0x55,100,8);
chain->devices[0]->dr->send(0,0,12);
まぁ、JTAGの操作が間違いなくできそうな感じのコードです。
ただ、いかにもC++の書き方で、chainとかdevicesとか毎回書くのも煩わしいです。
スクリプトというからにはもっと簡単にしたいですね。
JTAGスクリプトは、=でレジスタの値のセット、<=でセットとシフト(入出力)という規則で動いていたので、以下のような文法でできないかどうかを考察してみます。
IR[1] = "BYPASS"; // 2番目のデバイスのIRにBYPASSをセットすることを予約
IR[0] <= 0x01; // 1番目のデバイスのIRに0x01をセットし、IR SHIFT
DR[0].len = 122; // 1番目のデバイスのDRの長さを122に変更
DR[1].len = 1; // 2番目のデバイスのDRの長さを1に変更
DR[0](107 downto 100) = 0x55; // 1番目のデバイスのDRの[107:100]に0x55をセット
DR[0] <= 12; // 1番目のデバイスのDRの下位32bitに0x12をセット
関数でsetとsendを使い分けるよりも見やすくなります。N+1番目のJTAGデバイスのレジスタにDR[N]とIR[N]でアクセスできるようにするのも、いいと思います。
このような文法でうまくいきそうな気がしたのですが、JTAGのデータレジスタの長さは任意長でだいたい長いんですよね。デバイスごとにみんな違いますが、100ビットとかざらにある。それに対してC++だと扱える整数は32bitとか64bitだから、どうしても、どこからどこまでのレジスタに値をセットするかという機能が簡単に使えないと、使いにくい言語になってしまいます。
別の考えをしてみます。JRegというJTAGレジスタ型のクラスがあったとして、
JReg dr = DR[0]; // 最初のデバイスのデータレジスタ
これをどう考えるかです。=をオーバーロードするのは当然として、データの実体をコピーするのか、実体は元のオブジェクトに残して参照するだけにするのか。
また、データレジスタの操作は
dr[100] = 1; // データレジスタのbit 100を1にする。
のように1ビットだけ操作する場合もあるのですが、たいていは長いビット列を設定する場合です。
任意の長さのビットを操作するための簡潔な記述ってどうやればいいのでしょう。
dr(200 downto 100) = 0; // bit100~200までの101ビットを操作 (downtoを,に#defineで置換)
dr(200,100) = 0; // bit100~200までの101ビットを操作
dr(200) = 0; // bit200のみ1ビット操作
dr = 0; // 全ビットを操作
この書き方のほうがいいかもしれませんね。
そうして、
JReg tmp(64); // 64bitのレジスタを作成
tmp = 0x12345678;
tmp(63,32) = 0xaabbccdd; // tmpに0xaabbccdd12345678をセット
dr(200) = tmp; // bit263..200にtmpの値を代入
うん。いいかも。
切り出しは、
JReg slice = dr(200,100);
で、101bitのレジスタができる。
このようなことができるJReg型を作ればよさそうですね。
| 固定リンク
コメント