計(jì):從數(shù)據(jù)比對的驗(yàn)證核心到并發(fā)安全實(shí)現(xiàn))
1. 從“數(shù)據(jù)比對器”到驗(yàn)證核心理解UVM Scoreboard的本質(zhì)在芯片驗(yàn)證的日常里我們經(jīng)常聽到“Scoreboard”這個詞直譯過來是“記分牌”。很多剛接觸UVM驗(yàn)證方法學(xué)的朋友容易把它簡單地理解為一個“數(shù)據(jù)比對器”——DUT待測設(shè)計(jì)輸出一組數(shù)據(jù)Scoreboard里存著預(yù)期的數(shù)據(jù)兩邊一比對對了就過錯了就報。這種理解不能說錯但太淺了它只描述了Scoreboard最末端、最表象的功能完全沒觸及到它的核心價值和在驗(yàn)證環(huán)境中的戰(zhàn)略地位。我干了十多年芯片驗(yàn)證從早期的定向測試到現(xiàn)在的UVMScoreboard的設(shè)計(jì)和調(diào)試一直是驗(yàn)證環(huán)境搭建中最有挑戰(zhàn)性、也最能體現(xiàn)驗(yàn)證工程師功力的部分。一個設(shè)計(jì)精良的Scoreboard絕不僅僅是一個被動的比對工具。它更像是一個驗(yàn)證場景的“導(dǎo)演”和“裁判長”。導(dǎo)演是因?yàn)樗枰斫庹麄€數(shù)據(jù)流的“劇本”即協(xié)議或功能規(guī)范知道數(shù)據(jù)從哪里來、經(jīng)過什么變換、到哪里去裁判長是因?yàn)樗粌H要判斷對錯還要能解釋為什么錯是在哪個環(huán)節(jié)、因?yàn)槭裁匆?guī)則出了問題。最近在調(diào)試一個高速接口模塊時我就遇到了一個典型的Scoreboard問題日志里間歇性地出現(xiàn)[10-aug-2026 02:59:28] warning: failed to acquire scoreboard這類警告。這看起來是個簡單的“獲取失敗”但背后牽扯到的是Scoreboard與整個驗(yàn)證環(huán)境組件如Driver、Monitor、Sequence的同步機(jī)制、數(shù)據(jù)生命周期管理以及多線程競爭問題。如果只把它當(dāng)成比對器你可能永遠(yuǎn)找不到根因。所以在深入任何代碼細(xì)節(jié)之前我們必須先扭轉(zhuǎn)觀念UVM Scoreboard是一個用于實(shí)現(xiàn)“預(yù)測-檢查”機(jī)制的驗(yàn)證組件。它的核心任務(wù)是預(yù)測根據(jù)輸入激勵和設(shè)計(jì)規(guī)范計(jì)算出DUT應(yīng)有的輸出結(jié)果。檢查將預(yù)測的結(jié)果與實(shí)際監(jiān)測到的DUT輸出進(jìn)行比對并報告比對情況。覆蓋在比對過程中隱式或顯式地收集功能覆蓋點(diǎn)衡量驗(yàn)證是否充分。接下來我們就拆開揉碎了講一個高可用、高可靠的UVM Scoreboard到底該怎么建又會遇到哪些坑。2. 架構(gòu)與選型Scoreboard的三種經(jīng)典模式及其適用場景設(shè)計(jì)Scoreboard的第一步不是寫代碼而是選模式。模式選錯了后面代碼寫得再漂亮也可能事倍功半甚至無法滿足驗(yàn)證需求。根據(jù)預(yù)測模型的復(fù)雜度和數(shù)據(jù)流的特點(diǎn)我通常會把Scoreboard分為三種模式你可以根據(jù)手頭項(xiàng)目的特點(diǎn)來對號入座。2.1 直通比對模式簡單直接適用于線性流水線這是最基礎(chǔ)的模式適用于輸入到輸出的映射關(guān)系非常直接、幾乎無狀態(tài)或狀態(tài)變換簡單的設(shè)計(jì)。比如一個數(shù)據(jù)格式轉(zhuǎn)換模塊如AXI-Stream寬度轉(zhuǎn)換、一個簡單的CRC校驗(yàn)?zāi)K。工作原理輸入側(cè)Monitor將DUT的輸入事務(wù)transaction通過Analysis Port發(fā)送到Scoreboard。預(yù)測Scoreboard收到輸入事務(wù)后立即或在極短的延遲內(nèi)調(diào)用一個預(yù)測函數(shù)predictor根據(jù)輸入計(jì)算出預(yù)期的輸出事務(wù)。輸出側(cè)另一個Monitor將DUT的實(shí)際輸出事務(wù)發(fā)送到Scoreboard。比對Scoreboard將剛計(jì)算出的預(yù)期輸出與剛收到的實(shí)際輸出進(jìn)行比對。代碼結(jié)構(gòu)示意class simple_scoreboard extends uvm_scoreboard; uvm_component_utils(simple_scoreboard) uvm_analysis_imp_input #(input_trans, simple_scoreboard) input_imp; uvm_analysis_imp_output #(output_trans, simple_scoreboard) output_imp; // 用于臨時存放剛預(yù)測出的輸出事務(wù) output_trans predicted_output; function new(string name, uvm_component parent); super.new(name, parent); input_imp new(input_imp, this); output_imp new(output_imp, this); endfunction // 處理輸入事務(wù) virtual function void write_input(input_trans tr); // 預(yù)測根據(jù)輸入tr計(jì)算出預(yù)期的輸出 predicted_output predict_output(tr); endfunction // 處理輸出事務(wù) virtual function void write_output(output_trans tr); // 比對將預(yù)測輸出與實(shí)際輸出tr比較 if (!predicted_output.compare(tr)) begin uvm_error(SB_CMP, $sformatf(Mismatch! Expected: %0s, Got: %0s, predicted_output.convert2string(), tr.convert2string())) end // 比對后清空準(zhǔn)備下一次 predicted_output null; endfunction // 預(yù)測函數(shù) virtual function output_trans predict_output(input_trans in); output_trans out output_trans::type_id::create(out); // 這里實(shí)現(xiàn)具體的轉(zhuǎn)換邏輯例如 out.data in.data 2; // 假設(shè)是左移2位 out.addr in.addr 1; return out; endfunction endclass為什么這樣設(shè)計(jì)這種模式的核心是即時預(yù)測與比對。它假設(shè)輸入事務(wù)的處理延遲非常短且確定預(yù)測輸出可以立即生成并等待對應(yīng)的實(shí)際輸出。它的優(yōu)點(diǎn)是結(jié)構(gòu)清晰響應(yīng)快。但缺點(diǎn)也很明顯無法處理亂序、多拍延遲、或者輸入輸出非一一對應(yīng)的情況。比如一個帶緩沖的FIFO輸入和輸出順序可能因讀空寫滿而不同這種模式就無能為力了。2.2 參考模型模式功能復(fù)現(xiàn)適用于復(fù)雜算法或協(xié)議當(dāng)DUT實(shí)現(xiàn)的算法或協(xié)議邏輯比較復(fù)雜時比如一個圖像處理IP、一個加密解密模塊、一個復(fù)雜的通信協(xié)議棧我們會在Scoreboard內(nèi)部實(shí)例化一個參考模型。這個參考模型通常是用高級語言如C/C、SystemVerilog行為級描述實(shí)現(xiàn)的DUT功能的“黃金模型”它保證了功能的正確性。工作原理輸入側(cè)Monitor將輸入事務(wù)送給ScoreboardScoreboard將其轉(zhuǎn)發(fā)給內(nèi)部的參考模型。預(yù)測參考模型根據(jù)輸入模擬DUT內(nèi)部狀態(tài)機(jī)和數(shù)據(jù)路徑產(chǎn)生一系列預(yù)期的輸出事務(wù)。這些輸出可能不是立即產(chǎn)生的也可能有復(fù)雜的時序關(guān)系。輸出側(cè)DUT輸出Monitor將實(shí)際事務(wù)送給Scoreboard。比對Scoreboard從參考模型的輸出隊(duì)列中取出預(yù)期事務(wù)與實(shí)際事務(wù)進(jìn)行比對。這里的關(guān)鍵是匹配機(jī)制——如何確定哪個預(yù)期事務(wù)對應(yīng)哪個實(shí)際事務(wù)通常需要依靠事務(wù)中的唯一ID、序列號或時間戳。為什么這是更優(yōu)的選擇分離關(guān)注點(diǎn)驗(yàn)證工程師可以專注于驗(yàn)證環(huán)境的搭建和測試用例的編寫而算法專家可以獨(dú)立開發(fā)和維護(hù)高可靠性的參考模型。提前驗(yàn)證參考模型可以在RTL設(shè)計(jì)完成前就進(jìn)行開發(fā)和測試與系統(tǒng)級仿真或軟件模型進(jìn)行對接提前發(fā)現(xiàn)算法或協(xié)議理解上的歧義。處理復(fù)雜場景可以輕松應(yīng)對亂序、多對一、一對多、可變延遲等復(fù)雜數(shù)據(jù)流。參考模型內(nèi)部維護(hù)了完整的狀態(tài)能夠準(zhǔn)確預(yù)測在任何時間點(diǎn)、任何輸入歷史下DUT應(yīng)有的輸出。一個常見的坑模型同步參考模型通常是事務(wù)級或周期精確的模型而RTL是周期精確的。如何確保兩者在時間上對齊常見的做法是讓參考模型也掛接到同一個時鐘或復(fù)位信號上或者通過Scoreboard在特定相位如run_phase進(jìn)行同步調(diào)度。忽略同步可能會導(dǎo)致預(yù)期數(shù)據(jù)和實(shí)際數(shù)據(jù)在時間軸上錯位產(chǎn)生大量虛假誤報。2.3 記分板數(shù)組與隊(duì)列模式應(yīng)對亂序與并發(fā)這是最強(qiáng)大、也最常用的一種模式尤其適用于總線互連NoC, Crossbar、緩存一致性協(xié)議、多線程處理器等具有高度并發(fā)和亂序特性的設(shè)計(jì)。它不再依賴一個集中的參考模型來產(chǎn)生預(yù)期輸出而是將輸入事務(wù)按照某種規(guī)則如地址、ID分類存儲到不同的“記分板條目”中每個條目獨(dú)立管理其輸入和輸出的匹配。工作原理數(shù)據(jù)結(jié)構(gòu)Scoreboard內(nèi)部維護(hù)一個聯(lián)合數(shù)組associative array或隊(duì)列queue其索引key是事務(wù)的匹配鍵如AXI的id 緩存行的address值是一個結(jié)構(gòu)體包含該鍵對應(yīng)的所有已發(fā)送但未比對的輸入事務(wù)列表以及所有已預(yù)測但未匹配的輸出事務(wù)列表。輸入處理收到輸入事務(wù)后根據(jù)其匹配鍵找到對應(yīng)的記分板條目將該事務(wù)存入“已發(fā)送”列表。同時可以根據(jù)該輸入事務(wù)預(yù)測出一個或多個輸出事務(wù)存入同一記分板條目的“預(yù)期輸出”列表。預(yù)測邏輯可以很簡單如地址回射也可以很復(fù)雜集成一個小型參考模型。輸出處理收到輸出事務(wù)后同樣根據(jù)其匹配鍵找到記分板條目然后在該條目的“預(yù)期輸出”列表中查找與之匹配的事務(wù)。查找算法是關(guān)鍵可能需要進(jìn)行數(shù)據(jù)內(nèi)容、順序或時間窗口的匹配。清理匹配成功后從“已發(fā)送”和“預(yù)期輸出”列表中移除對應(yīng)項(xiàng)。通常還需要一個“看門狗”定時器或后臺進(jìn)程定期檢查是否有條目長期未被匹配即掛起這可能是DUT死鎖或驗(yàn)證環(huán)境bug的跡象。為什么這種模式成為主流因?yàn)樗昝赖爻橄罅耸聞?wù)的“生命周期”和“歸屬關(guān)系”。在復(fù)雜系統(tǒng)中一個請求如讀操作可能會產(chǎn)生多個響應(yīng)如多個數(shù)據(jù)beat且不同ID的請求/響應(yīng)可以完全亂序。記分板數(shù)組模式為每個獨(dú)立的“會話”由匹配鍵標(biāo)識建立了獨(dú)立的賬本清晰記錄了“我發(fā)出了什么”、“我應(yīng)該收到什么”、“我已經(jīng)收到了什么”。這種模式是解決文章開頭提到的failed to acquire scoreboard警告的關(guān)鍵因?yàn)椤矮@取失敗”往往就是在并發(fā)訪問這個共享的記分板數(shù)據(jù)結(jié)構(gòu)時發(fā)生了沖突。3. 核心實(shí)現(xiàn)細(xì)節(jié)從數(shù)據(jù)匹配到線程安全選好了模式我們就要進(jìn)入實(shí)現(xiàn)環(huán)節(jié)。這里有幾個細(xì)節(jié)教科書上可能一筆帶過但卻是項(xiàng)目實(shí)戰(zhàn)中決定成敗的關(guān)鍵。3.1 匹配鍵的設(shè)計(jì)精度與效率的權(quán)衡匹配鍵是記分板數(shù)組模式的靈魂。設(shè)計(jì)得好匹配高效準(zhǔn)確設(shè)計(jì)得不好要么無法正確匹配要么性能低下。單一鍵最簡單如AXI事務(wù)的awid/arid。適用于通道內(nèi)保序的場景。復(fù)合鍵由多個字段組成如{address[31:4], id}將地址高位與ID結(jié)合。這適用于緩存系統(tǒng)同一緩存行相同地址高位的不同ID請求需要區(qū)分。動態(tài)鍵鍵值在事務(wù)傳輸過程中可能改變。例如在某個協(xié)議中請求事務(wù)的ID在穿過某個橋接器時會被重映射。這時Scoreboard需要知道這個映射關(guān)系或者在事務(wù)中攜帶原始ID信息。實(shí)操心得匹配鍵的設(shè)計(jì)一定要和設(shè)計(jì)規(guī)范Spec中的事務(wù)標(biāo)識方式對齊。最好在項(xiàng)目初期驗(yàn)證團(tuán)隊(duì)和設(shè)計(jì)團(tuán)隊(duì)就共同定義好事務(wù)的“唯一標(biāo)識符”是什么。一個常見的坑是設(shè)計(jì)在某個層級合并或拆分了一些ID但驗(yàn)證環(huán)境不知道這個規(guī)則導(dǎo)致Scoreboard永遠(yuǎn)匹配不上。3.2 匹配算法不僅僅是compare找到對應(yīng)的記分板條目后如何從預(yù)期輸出列表中找到匹配項(xiàng)最簡單的當(dāng)然是遍歷列表調(diào)用事務(wù)的compare()方法。但對于高性能仿真這可能成為瓶頸。精確匹配要求事務(wù)的所有關(guān)鍵字段數(shù)據(jù)、地址、屬性完全一致。這是最嚴(yán)格的。模糊匹配允許某些字段存在“不關(guān)心”don‘t care值。例如在測試某些錯誤注入場景時預(yù)期輸出的錯誤碼可能是一個范圍而不是固定值。可以在事務(wù)類中重載compare()函數(shù)或?qū)崿F(xiàn)一個自定義的match()函數(shù)。順序匹配 vs 亂序匹配順序匹配對于同一個匹配鍵假定輸出順序與輸入順序一致。匹配時只需檢查列表中的第一個預(yù)期事務(wù)。效率高但僅適用于保序通道。亂序匹配需要遍歷整個預(yù)期列表找到第一個能匹配上的事務(wù)。這更通用但更耗時。為了優(yōu)化可以為預(yù)期列表建立基于某個子字段如數(shù)據(jù)包序號的索引。// 一個簡單的亂序匹配示例在記分板條目類內(nèi)部 function output_trans find_and_remove_match(input actual_output); foreach (expected_queue[i]) begin if (is_match(expected_queue[i], actual_output)) begin output_trans matched expected_queue[i]; expected_queue.delete(i); // 刪除已匹配項(xiàng) return matched; end end return null; // 未找到匹配項(xiàng) endfunction3.3 線程安全與同步破解“failed to acquire”警告這是最容易出問題的地方也是開頭那個警告的根源。UVM環(huán)境是并發(fā)的run_phase中多個組件Driver, Monitor的進(jìn)程在同時運(yùn)行。Scoreboard的write方法由Monitor調(diào)用和內(nèi)部的數(shù)據(jù)處理/清理線程可能會同時訪問同一個記分板數(shù)據(jù)結(jié)構(gòu)如那個聯(lián)合數(shù)組或隊(duì)列。SystemVerilog中對同一變量的非原子性并發(fā)讀寫會導(dǎo)致數(shù)據(jù)競爭Data Race結(jié)果不可預(yù)測。failed to acquire scoreboard這個警告可能來自自定義的鎖獲取失敗日志就是并發(fā)控制機(jī)制在報警。解決方案使用進(jìn)程間同步原語SystemVerilog Semaphore信號量 這是最常用的輕量級鎖。你可以創(chuàng)建一個信號量在任何一個需要讀寫共享記分板數(shù)據(jù)結(jié)構(gòu)的方法開始時“獲取”get鑰匙在方法結(jié)束時“放回”put鑰匙。class concurrent_scoreboard extends uvm_scoreboard; semaphore sb_sem; // 聲明一個信號量 function new(string name, uvm_component parent); super.new(name, parent); sb_sem new(1); // 初始鑰匙數(shù)為1即互斥鎖 endfunction virtual function void write_input(input_trans tr); sb_sem.get(1); // 獲取鑰匙 // ... 操作共享數(shù)據(jù)結(jié)構(gòu) ... sb_sem.put(1); // 放回鑰匙 endfunction virtual function void write_output(output_trans tr); if (!sb_sem.try_get(1)) begin // 嘗試獲取非阻塞 uvm_warning(SB_LOCK, $sformatf([%t] Failed to acquire scoreboard for output write, $time)) // 可以選擇將事務(wù)暫存到另一個隊(duì)列稍后重試 return; end // ... 操作共享數(shù)據(jù)結(jié)構(gòu) ... sb_sem.put(1); endfunction endclasstry_get()是非阻塞的獲取失敗時不會掛起進(jìn)程非常適合在write方法中使用可以避免整個驗(yàn)證環(huán)境因?yàn)橐粋€組件拿不到鎖而卡死。這很可能就是解決那個警告的直接方法。Mailbox郵箱 更高級的用法是引入“生產(chǎn)者-消費(fèi)者”模型。Monitor作為生產(chǎn)者將事務(wù)放入一個MailboxScoreboard內(nèi)部啟動一個獨(dú)立的進(jìn)程作為消費(fèi)者從Mailbox中取出事務(wù)進(jìn)行處理。這樣對共享數(shù)據(jù)結(jié)構(gòu)的訪問就集中在了單個消費(fèi)者進(jìn)程中自然避免了競爭。不過這增加了架構(gòu)的復(fù)雜性。踩坑實(shí)錄我曾經(jīng)在一個項(xiàng)目中Scoreboard的比對邏輯里用了一個foreach循環(huán)遍歷隊(duì)列。同時輸入Monitor的write方法也在向同一個隊(duì)列尾部添加新事務(wù)。仿真器在某個時刻就會報出詭異的內(nèi)存訪問錯誤或者比對結(jié)果時對時錯。加上信號量鎖之后問題立刻消失。所以只要有多于一個進(jìn)程可能訪問Scoreboard的內(nèi)部數(shù)據(jù)第一反應(yīng)就應(yīng)該是加鎖。3.4 超時與內(nèi)存泄漏清理記分板條目如果只有“添加”邏輯沒有“清理”邏輯那么仿真運(yùn)行一段時間后內(nèi)存就會被永遠(yuǎn)無法匹配的“僵尸”條目占滿導(dǎo)致仿真速度變慢甚至崩潰。清理策略成功匹配后刪除這是最理想的。超時強(qiáng)制清理在記分板條目中記錄時間戳。在Scoreboard中啟動一個后臺定時任務(wù)例如在run_phase中每N個時間單位檢查一次清理那些存在時間超過閾值的條目。清理時需要報告錯誤或警告因?yàn)檫@意味著DUT沒有在預(yù)期時間內(nèi)響應(yīng)或者匹配邏輯有bug。測試結(jié)束統(tǒng)一清理在extract_phase或report_phase中檢查所有未完成的條目并報錯。這能確保每個測試用例結(jié)束時所有發(fā)出的事務(wù)都有回應(yīng)。4. 高級技巧與調(diào)試讓Scoreboard成為調(diào)試?yán)饕粋€成熟的Scoreboard不僅是檢查工具更是強(qiáng)大的調(diào)試助手。4.1 分層與可配置的比對策略不要對所有事務(wù)類型都使用一種比對強(qiáng)度。可以通過配置UVM Configuration DB來控制比對級別COMPARE_LEVEL_FULL: 全字段嚴(yán)格比對。COMPARE_LEVEL_DATA_ONLY: 只比對數(shù)據(jù)載荷忽略地址或ID適用于某些廣播場景。COMPARE_LEVEL_NONE: 不比對僅做數(shù)據(jù)中轉(zhuǎn)或覆蓋點(diǎn)收集。在Scoreboard的check函數(shù)中根據(jù)配置決定調(diào)用哪種比對方法。4.2 豐富的調(diào)試信息與事務(wù)記錄當(dāng)比對失敗時僅僅打印一個“Mismatch”是遠(yuǎn)遠(yuǎn)不夠的。應(yīng)該自動記錄并輸出失敗事務(wù)的完整內(nèi)容使用convert2string。預(yù)期值與實(shí)際值的并排對比。該事務(wù)相關(guān)的上下文例如是哪個測試用例、哪個序列產(chǎn)生的這個事務(wù)的匹配鍵是什么它對應(yīng)的輸入事務(wù)是什么如果記分板記錄了的話時間信息事務(wù)發(fā)生時的仿真時間。更進(jìn)階的做法是將所有的比對活動成功和失敗都按照一定格式如CSV、自定義日志記錄下來形成事務(wù)追蹤文件。在調(diào)試復(fù)雜問題時可以用腳本可視化這個追蹤文件清晰地看到數(shù)據(jù)流的走向和在哪里斷掉。4.3 與功能覆蓋率的聯(lián)動Scoreboard是收集功能覆蓋率的最佳地點(diǎn)之一因?yàn)樗莆樟恕笆裁幢患盍恕币约啊笆裁幢徽_響應(yīng)了”的全部信息。在write_input中可以采樣輸入空間的覆蓋點(diǎn)如各種命令組合、地址范圍、數(shù)據(jù)模式。在成功匹配的write_output中可以采樣輸出場景的覆蓋點(diǎn)如各種響應(yīng)類型、錯誤碼。更重要的是可以采樣交叉覆蓋點(diǎn)例如“當(dāng)輸入為A類命令且地址落在某范圍時是否得到了B類響應(yīng)”。這種覆蓋點(diǎn)對于驗(yàn)證狀態(tài)機(jī)或協(xié)議交互至關(guān)重要。4.4 應(yīng)對Scoreboard自身的驗(yàn)證誰又來驗(yàn)證Scoreboard的正確性呢這是一個“自舉”問題。我的策略是單元測試為Scoreboard的預(yù)測函數(shù)、匹配函數(shù)編寫?yīng)毩⒌膯卧獪y試使用已知的輸入輸出向量進(jìn)行驗(yàn)證。注入測試在驗(yàn)證環(huán)境中引入一個“黃金參考”BFMBus Functional Model或VIPVerification IP它能夠產(chǎn)生絕對正確的響應(yīng)。讓Scoreboard同時比對DUT的輸出和黃金參考的輸出。在測試初期大量運(yùn)行這種測試確保Scoreboard的預(yù)測邏輯與黃金參考100%一致。反向檢查設(shè)計(jì)一些“非法”場景確保Scoreboard能正確報錯。例如發(fā)送一個協(xié)議不允許的命令組合看Scoreboard是否會預(yù)測出一個錯誤響應(yīng)并檢查DUT是否實(shí)際產(chǎn)生了這個錯誤。5. 從理論到實(shí)戰(zhàn)一個AXI4總線Scoreboard的實(shí)現(xiàn)要點(diǎn)讓我們以一個具體的例子——AXI4總線驗(yàn)證的Scoreboard來串聯(lián)前面講的所有概念。AXI4有讀、寫通道支持亂序和交織是檢驗(yàn)Scoreboard能力的絕佳場景。5.1 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)首先我們需要兩個主要的記分板數(shù)組寫地址通道記分板以awid為鍵。存儲awaddr,awlen,awsize等信息并預(yù)測即將到來的寫數(shù)據(jù)wdata數(shù)量和寫響應(yīng)bresp。讀地址通道記分板以arid為鍵。存儲araddr,arlen,arsize等信息并預(yù)測即將返回的讀數(shù)據(jù)rdata序列。每個記分板條目需要包含輸入事務(wù)隊(duì)列已發(fā)送的地址信息。預(yù)期輸出事務(wù)隊(duì)列對于讀是預(yù)期的rdata和rresp列表對于寫是預(yù)期的wdata列表和最終的bresp。狀態(tài)標(biāo)志如“等待數(shù)據(jù)”、“完成”。時間戳。5.2 預(yù)測邏輯實(shí)現(xiàn)寫事務(wù)收到AW事務(wù)后根據(jù)awaddr和awlen預(yù)測出awlen1個WDATA的預(yù)期數(shù)據(jù)。預(yù)期數(shù)據(jù)可以基于固定的模式如遞增數(shù)、隨機(jī)數(shù)、或從更高層次的參考模型獲取。創(chuàng)建一個預(yù)期WDATA隊(duì)列。收到實(shí)際的WDATA時從隊(duì)列中按順序wlast標(biāo)志或根據(jù)wid如果支持寫數(shù)據(jù)交織進(jìn)行匹配和比對。所有WDATA匹配完成后預(yù)測一個BRESP通常是OKAY除非模擬錯誤場景。等待實(shí)際的B響應(yīng)進(jìn)行比對。讀事務(wù)收到AR事務(wù)后根據(jù)araddr和arlen預(yù)測出arlen1個RDATA的預(yù)期數(shù)據(jù)。預(yù)期數(shù)據(jù)需要模擬從該地址讀取內(nèi)存模型如果集成了的話應(yīng)返回的值。創(chuàng)建一個預(yù)期RDATA隊(duì)列。收到實(shí)際的RDATA時根據(jù)rid找到對應(yīng)條目從預(yù)期隊(duì)列中按順序rlast標(biāo)志進(jìn)行匹配和比對。AXI讀通道支持亂序返回所以這里必須是亂序匹配算法。5.3 線程安全與鎖的細(xì)化AXI有5個獨(dú)立的通道AW, W, B, AR, R每個通道的Monitor都在并發(fā)地向Scoreboard發(fā)送事務(wù)。如果整個Scoreboard只用一把大鎖semaphore并發(fā)度會很低容易成為瓶頸。優(yōu)化方案使用細(xì)粒度鎖為每個id或一組id分配獨(dú)立的鎖。這樣不同id的事務(wù)就可以并行處理只有相同id的事務(wù)才需要互斥。這需要更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)管理但能極大提升性能。// 偽代碼基于id的鎖數(shù)組 semaphore id_locks[int unsigned]; function semaphore get_lock_for_id(int unsigned id); if (!id_locks.exists(id)) begin id_locks[id] new(1); end return id_locks[id]; endfunction5.4 調(diào)試與錯誤定位當(dāng)AXI Scoreboard報錯時信息必須極其詳盡。例如讀數(shù)據(jù)不匹配的錯誤信息應(yīng)該包含不匹配的rid。是這批數(shù)據(jù)的第幾個beatrlast信號。預(yù)期的數(shù)據(jù)值rdata和實(shí)際值。產(chǎn)生這個讀請求的原始AR事務(wù)信息地址、長度等??赡艿膬?nèi)存模型在該地址的值如果集成了。這樣的信息能讓設(shè)計(jì)工程師一眼就定位到是DUT的哪個部分、在哪個時間點(diǎn)、處理哪筆交易時出了錯將調(diào)試時間從數(shù)小時縮短到數(shù)分鐘。構(gòu)建一個健壯的UVM Scoreboard遠(yuǎn)不止是實(shí)現(xiàn)一個compare函數(shù)。它要求驗(yàn)證工程師深刻理解被驗(yàn)證的設(shè)計(jì)協(xié)議具備良好的軟件架構(gòu)思維設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)、算法、并發(fā)控制并擁有嚴(yán)謹(jǐn)?shù)恼{(diào)試能力。它從驗(yàn)證環(huán)境的“數(shù)據(jù)比對器”成長為整個驗(yàn)證過程的“質(zhì)量守門員”和“調(diào)試導(dǎo)航儀”。當(dāng)你不再被failed to acquire scoreboard這類問題困擾當(dāng)你設(shè)計(jì)的Scoreboard能清晰指出DUT最深層的bug時你會真正體會到驗(yàn)證工作的價值和樂趣。