LDとST動いたよ。
自作CPU pmeteoの方は、LDとSTが良い感じで動くようになった。最新のソースはここ。ST命令でフラグが変わるかどうかで混乱したが、CASLの本を読んで変わらないことを確認。
試験一覧をIdeaTreeでまとめないと。
自作CPU pmeteoの方は、LDとSTが良い感じで動くようになった。最新のソースはここ。ST命令でフラグが変わるかどうかで混乱したが、CASLの本を読んで変わらないことを確認。
試験一覧をIdeaTreeでまとめないと。
思い出したように、自作CPUの動作確認開始。
まずは、メモリの表現を、
reg [15:0] mem00, mem01, mem02, mem03, mem04, mem05, mem06, mem07;
というベタなFFに変換。これで何とかiverilogでシミュレーション可能。
LD命令もバグがあり、さくさく直す。ストアもバグがあり、デバッグをしなくては。一命令に一個バグがあるな。
なぜかPeggyProのリビジョン管理機能が上手く動かない。RCSでチェックインしようとすると、
C:\Documents and Settings\Natu\Local Settings\Temp\$AP29.tmp と C:\home\pmeteo\verilog\pmeteo_core.v を比較中...
Usage: diff.exe [-beiw] [-c[1-9]] file1 file2
比較に失敗しました.
コマンドが正しく実行できませんでした.
とエラーがでる。
コマンドラインから、ciコマンドを実行しても同じ。
LXからDIFF.exeを取ってきたらそれっぽく動いた。謎
クマーとワルツは第4章まで読みました。日本語だと5分くらいで読めるんだけどね・・
自作CPUの方を思い出したように再開。CPUに一番近いところのメモリの設計って難しいな。遅くても良いのなら何とでもなるんだけど、パフォーマンスを出しつつ、柔軟なウェイトを入れるようにするのはちょっと面倒。SH見たいに、メモリコントローラ側は立ち下がり動作って言うのは理にかなっている。ライトは何とでもなるけど、リードっていうか、命令フェッチの部分はCPUパフォーマンスの生命線だ。マイクロプロセッサ・アーキテクチャ入門にも書いてあるが、CPUのCLKよりもフェッチの性能をもっと重要視するべきだと思う。Xtensaは、フェッチとライトの部分を変更することでパイプラインを5~7に変更できるが、フェッチの部分を改良する事でパイプラインの段数が増えても、結果的にパフォーマンスが上がることは十分考えられる。面白い。
iverilogの方だが、メモリのシミューレーションが上手く行かない。
mem[adr]みたいなアクセスで、読み出す値が不定にになる。adrが
0、1、2までは読めてるんだけど、3以上になると不定が読める。
微妙だ。4以上ならちょっとはわかるんだが・・・。
会社のModelsimとか使えればもう少し切り分けできるんだが。
というわけで、ハマリ気味。まあ、面白いな。
単にCPU_ENが1になってなかっただけなので、1にしたら無事動きました。
動いたファイルはここ
今日のメモ
iverilogでは繋がっていない信号はエラーでなく0扱いっぽい。
pmeteo再開。シミュレーション用のテストベンチを作成し、iverilogでコンパイル
C:\home\pmeteo\verilog>iverilog ram.v rom.v pmeteo_core.v commet.v commet_tb.v -o a.exe
こんなエラーが出て、ダメになる。
C:\home\pmeteo\verilog>a.exe
プログラムが大きすぎてメモリに入りません.
googleでも情報無し
とりあえず,usモードに切り替えて
C:\home\pmeteo\verilog>a.exe
Program too big to fit in memory
これでも情報見つからない
ここをみてわかった。a.exeをじっこうするんじゃないんだ。
普通に、a.outを作って、
vvp a.out
でシミュレーションできたーー。
500 0 0 0 00000000000000000000000000000000000000000
1000 1 0 0 00000000000000000000000000000000000000000
1500 0 0 0 00000000000000000000000000000000000000000
2000 1 0 0 00000000000000000000000000000000000000000
2500 0 0 0 00000000000000000000000000000000000000000
3000 1 0 0 00000000000000000000000000000000000000000
3500 0 0 0 00000000000000000000000000000000000000000
4000 1 0 0 00000000000000000000000000000000000000000
4500 0 1 0 00000000000000000000000000000000000000000
5000 1 1 0 00000000000000000000000000000000000000000
5500 0 1 0 00000000000000000000000000000000000000000
上手く動いてないけど、CLK発振して、リセットが解除されている。
そして、GTKwaveも無事動く。ステートマシーンが止まってるな。
しかし、フリーでこれだけできるなんてすごいや。
pmetoはVHDLからVerilogへのソースの変換終了。iverilogでもとりあえずエラー無し。WebPackか、なにかで一回くらい論理合成したいが、すぐ動く環境がないので、GWくらいに挑戦。
明日から、メモリのモデルつないで、テストベンチ作成。
CPU作成の方は、符号付き演算で混乱。
CASL2では、ADDA,SUBA,ADDL,SUBLの4つの算術命令がある。それぞれ、算術加算、算術減算、論理加算、論理減算。別の言い方をすると、符号付き加算、符号付き減算、符号無し加算、符号無し減算と。
符号付きと符号無しって、データの表現方法の違いだけで演算器って共通じゃなかったっけ?ヘネパタの本と、まとめたノートは会社なので、さっとわからない。
4bitで考えてみよう。
符号なしだと、表せる範囲は0~15、符号付きだと、-8~7。
16進 符号なし 符号あり
F 15 -1
8 8 -8
7 7 7
1 1 1
0 0 0
F+8 は符号無しだと、17hなので答えは7(0111)とOF。これは普通に足すだけ。符号付きだと、-9hなので、7(0111)とOF。これは符号付き、符号無しで一緒。
同様に、計算してみる。
F+7:符号無しで16(0110)でOF。符号付きで6(0110)でOF無し。
8+7:符号無しで15(1111)でOF無し。符号付きだと-1(1111)でOF無し。
F+1:符号無しで0でOF。符号無しで0でOF無し。
7+1:符号無しで8(1000)でOF無し。符号無しで、-8(1000)でOF有り。
計算結果が同じで、オーバーフローかどうかの判断が変わるだけですね。明日会社のヘネパタで確認しよう。
日記:
つるきソバを食べた。ソバよりも、うどんよりも天ぷらが美味しかった。
ゲイツの本は、10個のうち8個まで読めた。あと法則2つ。月曜の出張中に読み切れるか。
ようやくPMETEO仕様書がちょっとできました。
こんなの仕事だったら一日で書けちゃう量だけど、なかなか時間がかかった。
明日からVerilog書き始めよう。
iverilogがちゃんとうごいてくれるだろうか。