ぱたへね!

はてなダイアリーはrustの色分けができないのでこっちに来た

s1_coreのリセットとクロック 続き

s1_coreのリセットの続きです。

sparc core内のリセットとクロック

リセット回路とクロックをもう一階層下って整理しました。

gclk、cluster_cken、cmp_grst_l、cmp_grst_lが、bw_clk_cl_sparc_cmpに入って、rclkとspc_grst_lを作っています。回路のブロックを眺めていると、キャッシュやMMUがごっそり削られてるのが分かります。もとのT1に比べると動作が追いやすくなっているはずです。

bw_clk_cl_sparc_cmp

bw_clk_cl_sparc_cmp内部で、cluster_header が呼び出されています。

 cluster_header I0 (/*AUTOINST*/
                      // Outputs
                      .dbginit_l           (dbginit_l),
                      .cluster_grst_l      (cluster_grst_l),
                      .rclk                (rclk),
                      .so                  (so),
                      // Inputs
                      .gclk                (gclk),
                      .cluster_cken        (cluster_cken),
                      .arst_l              (arst_l),
                      .grst_l              (grst_l),
                      .adbginit_l          (adbginit_l),
                      .gdbginit_l          (gdbginit_l),
                      .si                  (si),
                      .se                  (se));

さらにcluster_headerの中でrclkとgclkが直結しています。

assign #10 rclk = gclk;

#10はシミュレーションでは有効ですが、合成時には無視されます。上の接続図を見る限り、gclkを使っているところは、bw_clk_cl_sparc_cmpのみです。直結しても大丈夫そうですがシミュレーション動作後のTODOにしておきます。もし、rclkとgclkの位相ずらしが必要な場合は、FPGA内蔵PLLで対応することになります。

cluster_headerの中でgrst_lをrclkで1回叩いてcluster_grst_lに入れています。

always @(negedge rclk) begin
  dbginit_l <= gdbginit_l;
  cluster_grst_l <= grst_l;
end

sparc.vで .cluster_grst_l(spc_grst_l)と接続されているので、spc_grst_lはgrst_lをクロックで同期化しただけの信号です。