JAJSWO4 June 2025 DAC39RF20
ADVANCE INFORMATION
初期開始
int tries;
int arrival [];
// 起動手順に従ってリンクを開始します。RBD の値はどれでも構いません。
// RBD が無効になる可能性があるため、LINK_UP は設定されない場合があります。
startup_link();
// LANE_ARR_RDY が High になるまで待ちます
// 1000 回の試行後に放棄します。
tries = 0;
while(read_reg(LANE_ARR_RDY)==0 && tries<1000)
tries++;
// すべてのレーンの LANE_ARR を読み取ります
arrival = new [L];
foreach(arrival[i]) arrival[i] = read_reg(LANE_ARR[i]);
RBD = determine_RBD(arrival、K*F/8);
// この RBD 値を使用してリンクを再起動します
end
// この関数は、到着時刻の配列から RBD を計算します
function determine_RBD(
int arrival []、// A dynamic array of arrival times from LANE_ARR
int oneMF // Number of octa-bytes per multiframe/EMB
);
int spacing、max_spacing;
int latest、earliest;
int L、early_overwrite;
int AM、EB_size;
// バッファ サイズは最大 16 octa-bytes ですが、oneMF を超えることはありません
EB_size = oneMF > 16? 16 : oneMF;
// LANE_ARR のモジュロ値
AM = JENC? 32*E : 32;
// レーン数は、到着配列のサイズです
L = arrival.size;
// 到着リストを数字の昇順に並べ替えます
arrival.sort;
// 到着時間の最大間隔を検索します (サークル上)
max_spacing = 0;
for(int i = 0; i<L; i++) begin
spacing = arrival[(i+1)%L] – arrival[i] + (i==L-1)*AM;
if(spacing>max_spacing) begin
max_spacing = spacing;
latest = arrival[i];
earliest = arrival[(i+1)%L];
end
end
// 弾性バッファに対してレーン スキューが大きすぎないことを確認します
if ( (latest-earliest+AM)%AM >= EB_size ) begin
$display(“ERROR: Lane skew too large for elastic buffer”);
$display(“ Earliest=%0d Latest=%0d”);
return 0;
end
// 最新の到着レーン (+1) とその瞬間の中間に RBD を選択します
// 最初のレーンは弾性バッファを上書きし始めます。
early_overwrite = (earliest+EB_size)%AM;
if(early_overwrite < latest+1) early_overwrite += AM;
return (latest+1+early_overwrite)/2 % oneMF;
endfunction