ZHCSYD5 June 2025 DAC39RF20
ADVANCE INFORMATION
請(qǐng)參考 PDF 數(shù)據(jù)表獲取器件具體的封裝圖。
initial begin
int tries;
int arrival [];
// 根據(jù)啟動(dòng)程序啟動(dòng)鏈路。RBD 的任何值都正常。
// 請(qǐng)注意,不能設(shè)置 LINK_UP,因?yàn)?RBD 可能無(wú)效。
startup_link();
// 等待 LANE_ARR_RDY 變?yōu)楦唠娖?/p>
// 1000 次嘗試后放棄。
tries = 0;
while(read_reg(LANE_ARR_RDY)==0 && tries<1000)
tries++;
// 對(duì)所有通道讀取 LANE_ARR
arrival = new [L];
foreach(arrival[i]) arrival[i] = read_reg(LANE_ARR[i]);
RBD = determine_RBD(arrival, K*F/8);
// 使用此 RBD 值重新啟動(dòng)鏈路
end
// 此函數(shù)根據(jù)到達(dá)時(shí)間數(shù)組計(jì)算 RBD
function determine_RBD(
int arrival [], // 來(lái)自 LANE_ARR 的到達(dá)時(shí)間動(dòng)態(tài)數(shù)組
int oneMF // 每個(gè)多幀/EMB 的八字節(jié)數(shù)
);
int spacing, max_spacing;
int latest, earliest;
int L, early_overwrite;
int AM, EB_size;
// 緩沖區(qū)大小最多為 16 個(gè)八字節(jié),但不能超過(guò) oneMF
EB_size = oneMF > 16 ? 16 : oneMF;
// LANE_ARR 的模值
AM = JENC ? 32*E : 32;
// 通道數(shù)目是到達(dá)數(shù)組的大小
L = arrival.size;
// 按數(shù)字升序?qū)Φ竭_(dá)列表進(jìn)行排序
arrival.sort;
// 找到到達(dá)時(shí)間之間的最大間距(在圓上)
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
// 檢查通道偏斜,確認(rèn)其對(duì)于彈性緩沖器不會(huì)過(guò)大
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
// 選擇讓 RBD 位于最新到達(dá)通道 (+1) 和時(shí)刻之間的中間位置
// 最早的通道開始覆蓋彈性緩沖器。
early_overwrite = (earliest+EB_size)%AM;
if(early_overwrite < latest+1) early_overwrite += AM;
return (latest+1+early_overwrite)/2 % oneMF;
endfunction