論理合成が安定しない件
成功率が1/6ぐらいになってきて待ち時間がひどくなってきたが、タイミング解析で critical warning がでないからわからん。 諦め気味に、1つ古めの Quartus II が残ってたので論理合成した。結果は同じだが、 critial warning もでて悪い配線もわかった。
やはりというか、 CPU のクロック入力に問題があった。いままでは CPU の clock は PLL から出る 3.5795x4 MHz に近い値を reg と always で4分周して渡していた。経験上これが悪いということも知っていたのだが、下記の問題があって対処が思いつかなかった。
- PLL が出せる一番遅い周波数が 9.375 MHz で PLL の出力を直接 clock に渡すと CPU が早く動くから ROM からのデータを取りこぼす。
- clock の特定タイミングを有効にする cke が CPU コアにない
いろいろ悩んで、tv80 コアに cke 入力を無理矢理付けることにした。該当する always の中を直すだけ。
always @(posedge clk) begin if(reset) begin ..... end else begin ..... end end
end else に if(cke) をつける。すでに end else if(naninani) の場合は if(cke && naninani) にする。という感じで、ソースの中身をあまり考えずにやったら、論理合成は安定したし、CPU もかわりなく動いているようだ。
... 本当に大丈夫だろうか?