論理合成が安定しない件

成功率が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 もかわりなく動いているようだ。

... 本当に大丈夫だろうか?