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をクロックで同期化しただけの信号です。