アダルト・ヴァイオリン May the force be with you..

2008年6月30日

SN/Xパイプライン化 その2

Filed under: Weblog — い~ぐる @ 2:22 PM

パルテノン研究会のASICデザインコンテストの発表が土曜日に行われた。
このコンテストの規定課題は初心者向き課題としてSN/Xの例題パッケージをベースとした課題を出している。

参加者はかなり高度なことを行うようになったので、前回のパイプラインパッチに続き、多少の情報追加をブログベースで行っていく。

今回は、前回のパイプラインよりも、パイプラインストール条件をもう少し厳密にチェックするバージョンのSN/Xパッチファイルを用意した。(前回のパッチは、ロード命令がきたら無条件でストールさせるというかなり乱暴なものだったのだ)
本来は、ロード命令のターゲットを使わない演算はとめる必要がないのだが、もうひとつ、考慮すべきところとして、リソース競合がある。ロードはレジスタ書込みがR型命令に比べ1クロック遅いので、後続命令のレジスタ書込みがロードのレジスタ書込みとぶつかるケースがあるのだ。

SN/X 1.4.2版から1.4.2p1版へのパッチ

対策としては、ぶつからないケースだけを実行するというのもありだが、Eステージの後ろでレジスタに書き込まない命令は少数なので、汎用レジスタを2R2W型にすることで、競合ケースを解消でき、もっと性能向上する。

もちろん、2Wのレジスタポートは多少性能に悪影響が与えられるので、トレードオフを考えて採否を決めるべきである。

本質的なデータハザード(ロード命令の結果を本当に必要とする演算命令によるストール)は避けようがないので、これらの対策を行うと、ハードウェア上の性能向上策としては、コントロールハザードの低減に目を向けるのが正しい。

Drawソフト

Filed under: Weblog — い~ぐる @ 1:04 PM

普段、UNIX環境で絵を描くときには、Tgifを使用している。
これでほとんど問題なく利用できているが、Windows環境では相当するDrawソフトがなく、Windowsで仕事を強いられるときには苦しい思いをさせられていた。
Cygwin+XでTgifを動かしていたときもあるが、この環境では使い勝手がいまひとつだったのだ。

TgifはMacDrawとよく似た操作性で、軽快に詳細な図を描く気になるソフトであるが、私の要求は、まともなEPSファイルが出せるDrawソフトで、操作性がまともだったら何でもよいという敷居の低い要件なのに、Windowsで対応するソフトがないのはどういうわけだろう?と不思議に思いながら、そのままにしていた。

再び、Windows環境で絵を描く必要があって、さすがに、もうちょっと何とかしたいと検索したら、どうやらInkscapeというのが良いらしい。

まだダウンロード中で、これから使うつもりだが、使い物になるといいなぁ・・

2008年6月29日

sfl2vh不具合

Filed under: Weblog — い~ぐる @ 9:47 PM

NES on FPGAのpgate1氏より、FM音源のVHDLのIPコアとリンクするために、sfl2vhでVHDLコードに変換したところ、状態変数の状態値が重複しているとの指摘がきた。
VHDLは私自身が全く使わないので、sfl2vh側のコードはあまりデバッグしていないが、こんな単純なミスが今まで残っているのは・・(いくらなんでもチェック不足だろ ;-p)

ビットマスクを取って、バイナリに変換するところで、
1>>i とするところ、1>>1 となっていた(汗)

一文字の修正だけだが、ソースコードを書いているときに気が付かないとは、かなり問題ありですね~ ⇒ 自分

2008年6月18日

SN/Xのパイプライン化

Filed under: Weblog — い~ぐる @ 5:27 PM

SN/Xはごく僅かの書き換えでパイプラインプロセッサになる。
ただ、パイプラインプロセッサにすると、LiveCygwinのテストベンチを動かす、IcarusVerilogのバグにあたるようで、テストベンチがうまく動かない。
そこで、テストベンチを少し手直しした。
パイプラインプロセッサを snxp.sfl として作成し、
テストベンチを mainp.v としておけば、
make P=p sim1
となどとして、合成からシミュレーションまでを実行可能。

main.v ⇒ mainp.v のもっとも大きな違いは、always @(negedge m_clock) のブロックの中に、複数のif文を入れいていたのを、1ブロック1if文に修正したことだ。
Icarusは、elseなしで、複数の同時実行対象のif文があると、どうも扱いがまずいらしい。参考までに、パッチファイルを上げておこう。

2008年6月5日

m65のバグ修正

Filed under: Weblog — い~ぐる @ 11:42 PM

AppleIのモニタを動かしていて、なんだか動作がおかしいところがあったので、
調べたら、m65にバグがあった。SBC命令のボローを無視して計算していたのだ。
(おそらく、SFLらしい記述に変更中に入り込んだバグだろう。)

*** m65.sfl.old Wed May 14 17:37:12 2008
--- m65.sfl     Thu Jun  5 21:07:39 2008
*************** module m65 {
*** 698,704 ****
mimm | ex.S4: par {
read();
if(RDY) par {
!         alu.sbc(RA,dbi,0b1);
if(opc<5>) par {
RA := alu.out;
fv := alu.v;
--- 698,704 ----
mimm | ex.S4: par {
read();
if(RDY) par {
!         alu.sbc(RA,dbi,^opc<5>|fc);
if(opc<5>) par {
RA := alu.out;
fv := alu.v;

Powered by WordPress