位流驗(yàn)證,對(duì)于芯片研發(fā)是一個(gè)非常重要的測(cè)試手段,對(duì)于純軟件開發(fā)人員,最難理解的就是位流驗(yàn)證。在FPGA芯片研發(fā)中,位流驗(yàn)證是在做什么,在哪些階段需要做位流驗(yàn)證,如何做?都是問題。
我們先整體的說一下:
首先:在硬件設(shè)計(jì)階段,位流驗(yàn)證是設(shè)計(jì)驗(yàn)證部的重要工作,它是為了驗(yàn)證硬件設(shè)計(jì)的數(shù)字電路部分的合理性,對(duì)于FPGA芯片,主要就是對(duì)標(biāo)準(zhǔn)的架構(gòu)組件進(jìn)行驗(yàn)證。如果相應(yīng)的EDA軟件未成形之前,相應(yīng)的位流需要通過手工單獨(dú)生成。
然后:在FPGA配套的EDA軟件開發(fā)階段,位流驗(yàn)證也非常重要。因?yàn)镋DA軟件的最大目標(biāo)就是生成正確的位流,位流輸出是否符合預(yù)期,關(guān)系到軟件各個(gè)環(huán)節(jié)的正確性。所以,一般會(huì)將位流驗(yàn)證做為重要的回歸測(cè)試手段,一方面,可以持續(xù)驗(yàn)證最新輸出軟件的正確性,另外,如果芯片的底層架構(gòu)發(fā)生變化,模型變更,仿真庫(kù)變更,也可以通過位流驗(yàn)證,保證架構(gòu)更改的正確性(架構(gòu)主要是按照硬件設(shè)計(jì)對(duì)應(yīng)的軟件模型,而硬件設(shè)計(jì)的這些模型,都會(huì)有對(duì)應(yīng)的仿真庫(kù)和參考模型,用于驗(yàn)證)。
最后:在生產(chǎn)測(cè)試階段,位流驗(yàn)證同樣是非常好的測(cè)試手段,它可以測(cè)試位流寫入芯片后上板上芯片的效果,確認(rèn)芯片實(shí)際的運(yùn)行情況。在軟件中只是保證了邏輯上的正確,實(shí)際結(jié)合電氣特性和各種不同環(huán)境是否能正??煽窟\(yùn)行,可能通過位流加載后的效果進(jìn)行驗(yàn)證。加載到實(shí)際板上的效果,也可以通過驅(qū)動(dòng)程序取出,與預(yù)期參老模型的結(jié)果做對(duì)比,驗(yàn)證其準(zhǔn)確性。
當(dāng)然,位流驗(yàn)證可能并不僅限于上面的三種情況(限于我了解的內(nèi)容有限),但通過上面的描述,你可以發(fā)現(xiàn),位流驗(yàn)證本身是就是會(huì)跨多個(gè)部門的比較特殊的手段,在不同部門做驗(yàn)證時(shí),一定會(huì)存在配合,和一些有相似的工作。但是,因?yàn)楦髯缘哪康牟煌?,發(fā)現(xiàn)錯(cuò)誤后,定位和糾錯(cuò)的方向也很不一樣。反以,反過來(lái)說,選擇的相應(yīng)示例也會(huì)有些不同。
今天,我們只講在EDA軟件如何利用位流驗(yàn)證,完成對(duì)EDA軟件的重要回歸測(cè)試。
大概的講法是:
:我們會(huì)講解位流驗(yàn)證依賴的框架UVM
:會(huì)講一下UVM的實(shí)現(xiàn)平臺(tái)。
:會(huì)講一下針對(duì)EDA軟件的驗(yàn)證,會(huì)對(duì)哪些部分進(jìn)行驗(yàn)證,會(huì)使用什么樣的示例 。
:發(fā)現(xiàn)問題后,會(huì)如何通過輸出去定位錯(cuò)誤。
:因?yàn)橛糜谧詣?dòng)化回歸,也講一下相應(yīng)的自動(dòng)化平臺(tái)應(yīng)該如何拱建。
首先,我們還是得再來(lái)理解一下位流驗(yàn)證需要用到的UVM框架。
一:UVM框架
1.1:理論
Universal Verifacation Methodology:是一套基于SystemVerilog的標(biāo)準(zhǔn)驗(yàn)證方法學(xué)。它提供了一套完整的框架,用于構(gòu)建復(fù)雜的驗(yàn)證環(huán)境,應(yīng)用于芯片設(shè)計(jì)領(lǐng)域的功能驗(yàn)證。旨在提高驗(yàn)證的可重復(fù)性、可重用性和自動(dòng)化程度。應(yīng)該說,對(duì)于硬件設(shè)計(jì)的驗(yàn)證,UVM是最基礎(chǔ),最常用的平臺(tái),離不開它。
2.1.1:DUT
待測(cè)設(shè)計(jì)——Design Under Test,就是你要驗(yàn)證的設(shè)計(jì)單元。
如果你是要驗(yàn)證/測(cè)試一顆 FPGA 芯片,DUT 一般會(huì)分為三種,一種是單Tile的設(shè)計(jì),一種是多Tile的設(shè)計(jì),還有就是整個(gè)芯片的設(shè)計(jì)。
注意這里我加了個(gè)bitstream,這并不是UVM必須的,加上bitstream是和我們今天要講的位流驗(yàn)證扣題,也就是我們?cè)隍?yàn)證時(shí),使用FPGA的位流文件,來(lái)形成DUT的功能。
env:Testbenc Environment ,除了DUT,其它就是UVM的驗(yàn)證環(huán)境了,它包含了一大堆東西,后面一個(gè)一個(gè)介紹。
Sequencer:測(cè)試數(shù)據(jù)序列,因?yàn)闇y(cè)試時(shí)需要很多的輸入數(shù)據(jù),我們按序列提供。
Driver:如何數(shù)據(jù)輸入DUT的過程,可以理解為激勵(lì)的過程。
Monitor:監(jiān)控DUT的輸入/輸出信號(hào)
Reference Model:參考模型,對(duì)應(yīng)DUT的設(shè)計(jì),提供相同行為的給果。
這里參考模型的運(yùn)行,一般我們會(huì)使用仿真工具的內(nèi)置實(shí)現(xiàn)來(lái)完成。
Compare:比較DUT的輸出和參考模型的輸出,判斷是否匹配。
2.1.2:Sequencer
Sitmulus:生成測(cè)試數(shù)據(jù)序列。我們需要基于測(cè)試的需求,產(chǎn)生數(shù)據(jù),交給Driver來(lái)驅(qū)動(dòng)到DUT。比如:你要測(cè)試DSP的乘法,那就是提供相應(yīng)的輸入數(shù)值對(duì)。
class my_sequence extends uvm_sequence #(my_transaction);
`uvm_object_utils(my_sequence)
task body();
my_transaction tr;
foreach (tr.data[i]) begin
tr.data[i] = $urandom_range(0, 255); // 隨機(jī)生成 8 位數(shù)據(jù)
start_item(tr); // 發(fā)送數(shù)據(jù)
finish_item(tr);
end
endtask
endclass
2.1.3:Driver
接收Sequencer的測(cè)試數(shù)據(jù)并將其轉(zhuǎn)換為DUT的輸入信號(hào)。
這里可能需要模擬時(shí)序,比如:時(shí)鐘的同步,握手協(xié)議等。
class my_driver extends uvm_driver #(my_transaction);
`uvm_component_utils(my_driver)
task run_phase(uvm_phase phase);
forever begin
seq_item_port.get_next_item(req); // 接收 sequencer 的數(shù)據(jù)
@(posedge clk); // 時(shí)鐘同步
dut_input = req.data; // 將數(shù)據(jù)驅(qū)動(dòng)到 DUT
seq_item_port.item_done();
end
endtask
endclass
2.1.4:Monitor
實(shí)時(shí)監(jiān)控DUT的輸入和輸出信號(hào),將監(jiān)控到的數(shù)據(jù)送出到比較系統(tǒng)Compare,進(jìn)行輸出分析。
class my_monitor extends uvm_monitor #(my_transaction);
`uvm_component_utils(my_monitor)
task run_phase(uvm_phase phase);
forever begin
@(posedge clk);
tr.data = dut_output; // 采集 DUT 的輸出數(shù)據(jù)
analysis_port.write(tr); // 將數(shù)據(jù)發(fā)送給 Scoreboard
end
endtask
endclass
2.1.5:Reference Model
參考模型,用于生成和DUT相同邏輯功能的輸出(Golden Model)。
基于相同的輸入激勵(lì)信號(hào),獲得理想的輸出。
function bit [7:0] ref_model(input bit [7:0] data);
return data + 1; // 示例:參考模型輸出為輸入加 1
endfunction
2.1.6:Compare
這里的Compare,可能是簡(jiǎn)單的比較結(jié)果的輸出,也可能是比較復(fù)雜的Scoreboard(一個(gè)記錄數(shù)據(jù)表)。根據(jù)比較結(jié)果,輸出不匹配的情況,并輸出報(bào)告。
class my_scoreboard extends uvm_scoreboard;
`uvm_component_utils(my_scoreboard)
task run_phase(uvm_phase phase);
my_transaction ref_tr, dut_tr;
forever begin
ref_tr = ref_fifo.get(); // 從參考模型接收預(yù)期數(shù)據(jù)
dut_tr = dut_fifo.get(); // 從 DUT 獲取實(shí)際輸出
if (ref_tr.data !== dut_tr.data)
`uvm_error("Mismatch", $sformatf("Expected: %0h, Got: %0h", ref_tr.data, dut_tr.data));
end
endtask
endclass
2.1.7:示例
我們?cè)賮?lái)一個(gè)完整的示例,說明一下各部分做的事情。
DUT設(shè)計(jì)—— 一個(gè)簡(jiǎn)單的8位加法器。
DUT代碼:(對(duì)于位流驗(yàn)證,輸入不是這個(gè),后面會(huì)舉例說明)
module adder(
input logic [7:0] a,
input logic [7:0] b,
output logic [7:0] sum
);
assign sum = a + b;
endmodule
UVM環(huán)境:
這里需要定義一個(gè)Transaction,因?yàn)槊看渭?lì)的執(zhí)行都是不同的事務(wù),事務(wù)標(biāo)明輸入和輸出。
Transaction 定義:
class my_transaction extends uvm_sequence_item;
rand bit [7:0] a, b; // 輸入信號(hào)
bit [7:0] expected_sum; // 參考模型生成的期望輸出
`uvm_object_utils(my_transaction)
// 構(gòu)造函數(shù)
function new(string name = "my_transaction");
super.new(name);
endfunction
endclass
Sequencer:
class my_sequence extends uvm_sequence #(my_transaction);
`uvm_object_utils(my_sequence)
task body();
my_transaction tr;
repeat (10) begin
tr = my_transaction::create("tr");
tr.a = $urandom_range(0, 255); // 隨機(jī)生成輸入 a
tr.b = $urandom_range(0, 255); // 隨機(jī)生成輸入 b
start_item(tr); // 開始傳輸數(shù)據(jù)
finish_item(tr); // 結(jié)束傳輸數(shù)據(jù)
end
endtask
endclass
Driver:
class my_driver extends uvm_driver #(my_transaction);
`uvm_component_utils(my_driver)
// DUT 的接口
virtual adder_if dut_if;
// 構(gòu)造函數(shù)
function new(string name = "my_driver", uvm_component parent);
super.new(name, parent);
endfunction
// 運(yùn)行階段
task run_phase(uvm_phase phase);
forever begin
seq_item_port.get_next_item(req); // 從 Sequencer 獲取數(shù)據(jù)
@(posedge dut_if.clk); // 等待時(shí)鐘上升沿
dut_if.a = req.a; // 驅(qū)動(dòng) DUT 輸入 a
dut_if.b = req.b; // 驅(qū)動(dòng) DUT 輸入 b
seq_item_port.item_done(); // 標(biāo)記數(shù)據(jù)已完成
end
endtask
endclass
Monitor:
輸入監(jiān)控
class input_monitor extends uvm_monitor;
`uvm_component_utils(input_monitor)
// DUT 接口
virtual adder_if dut_if;
uvm_analysis_port #(my_transaction) analysis_port; // 分析端口
function new(string name = "input_monitor", uvm_component parent);
super.new(name, parent);
endfunction
// 運(yùn)行階段
task run_phase(uvm_phase phase);
forever begin
@(posedge dut_if.clk); // 等待時(shí)鐘上升沿
my_transaction tr = my_transaction::create("tr");
tr.a = dut_if.a; // 采集 DUT 輸入 a
tr.b = dut_if.b; // 采集 DUT 輸入 b
analysis_port.write(tr); // 將交易數(shù)據(jù)發(fā)送給分析端口
end
endtask
endclass
輸出監(jiān)控:
class output_monitor extends uvm_monitor;
`uvm_component_utils(output_monitor)
// DUT 接口
virtual adder_if dut_if;
uvm_analysis_port #(my_transaction) analysis_port; // 分析端口
function new(string name = "output_monitor", uvm_component parent);
super.new(name, parent);
endfunction
// 運(yùn)行階段
task run_phase(uvm_phase phase);
forever begin
@(posedge dut_if.clk); // 等待時(shí)鐘上升沿
my_transaction tr = my_transaction::create("tr");
tr.expected_sum = dut_if.sum; // 獲取 DUT 輸出 sum
analysis_port.write(tr); // 發(fā)送到分析端口
end
endtask
endclass
Compare:
class my_scoreboard extends uvm_scoreboard;
`uvm_component_utils(my_scoreboard)
uvm_analysis_imp #(my_transaction, my_scoreboard) input_analysis_imp;
uvm_analysis_imp #(my_transaction, my_scoreboard) output_analysis_imp;
my_transaction expected_tr, actual_tr;
function new(string name = "my_scoreboard", uvm_component parent);
super.new(name, parent);
input_analysis_imp = uvm_analysis_imp #(my_transaction, my_scoreboard)
::create("input_analysis_imp", this);
output_analysis_imp = uvm_analysis_imp #(my_transaction, my_scoreboard)
::create("output_analysis_imp", this);
endfunction
// 輸入數(shù)據(jù)分析
function void write(input my_transaction tr);
expected_tr = tr;
expected_tr.expected_sum = expected_tr.a + expected_tr.b; // 參考模型
endfunction
// 輸出數(shù)據(jù)分析
function void write(output my_transaction tr);
actual_tr = tr;
// 比較 DUT 輸出和參考模型的期望值
if (actual_tr.expected_sum !== expected_tr.expected_sum) begin
`uvm_error("Mismatch", $sformatf("Expected: %0d, Got: %0d",
expected_tr.expected_sum, actual_tr.expected_sum));
end
endfunction
endclass
2.1.8:位流驗(yàn)證
那對(duì)于位流驗(yàn)證,UVM是如何使用的呢?
1:首先,必須準(zhǔn)備好你的FPGA的EDA軟件(準(zhǔn)備好運(yùn)行時(shí)需要的 Flow 的tcl命令)。給出你的芯片仿真時(shí)需要的Primitve仿真庫(kù)。
2:針對(duì)你要測(cè)試的全芯片或者部分tile,選擇你要測(cè)試的設(shè)計(jì)用例(需要有一定的代表性噢,可以是N多,需要有一定覆蓋度),用 flow 生成仿真用的門級(jí)網(wǎng)表文件,并輸出用例的route結(jié)果,輸出最終的bitstream。
3:開始對(duì)要測(cè)試的用例,編寫參考模型(也是另外一種實(shí)現(xiàn)方案)。
4:編寫激勵(lì)(測(cè)試)程序,提供相應(yīng)的激勵(lì)數(shù)據(jù)序列。
5:在TestBench上,針對(duì) DUT 的 RefModel模型進(jìn)行仿真,驗(yàn)證兩者輸出是否一致,如果一致,說明位流測(cè)試正常。比較的方法,要看測(cè)試用例的功能。
6:如果測(cè)試不正常,可以利用中間輸出,日志輸出,波形輸出等信息進(jìn)行定位,查看出錯(cuò)原因。
好了,那UVM框架是如何實(shí)現(xiàn)的呢?有什么支撐平臺(tái)和工具嗎?
1.2:支撐
那UVM這種框架是如何通平臺(tái)來(lái)支撐它的呢?我們以Synopsys的VCS為例,來(lái)說明它是如何支持的(當(dāng)然,也可以使用Mentor提供的QuestaSim)。
1.2.1:工具
VCS(Verlog Compiler Simulator)是業(yè)界領(lǐng)先的仿真工具,原生支持UVM,它提供了一系列的工具和功能,全而覆蓋了UVM測(cè)試平臺(tái)中的各項(xiàng)工作。
UVM 組件 | VCS 支持工具/功能 |
---|---|
Sequence | SystemVerilog 編譯器直接支持 UVM sequence 的隨機(jī)生成和調(diào)試。 |
Driver | 通過 VCS 的時(shí)鐘精確仿真,支持 UVM driver 精確地驅(qū)動(dòng) DUT 信號(hào)。 |
Monitor | UVM 信號(hào)分析器,與 DVE 圖形工具集成,監(jiān)控信號(hào)流。 |
Compare Scoreboard |
與覆蓋率分析工具集成,支持寄存器覆蓋率和功能覆蓋率的檢查。 |
Debug | 提供圖形化的 UVM Phase 調(diào)試工具,支持動(dòng)態(tài)調(diào)試和波形交互分析。 |
Verification | 集成 DVE 和 Verdi 工具,查看波形和調(diào)試測(cè)試平臺(tái)的運(yùn)行時(shí)行為。 |
基于VCS的功能,要實(shí)現(xiàn)UVM平臺(tái),還需要封裝一些標(biāo)準(zhǔn)的命令,達(dá)成常見的功能。
1.2.2:平臺(tái)
為了實(shí)現(xiàn)UVM的基礎(chǔ)功能,我們需要提供一些封裝功能,我們稱之為平臺(tái)。因?yàn)閂CS并不是直接針對(duì)UVM的,所以,我們需要針對(duì)它做一些封裝,然后我們基于封裝來(lái)使用,這樣,看起來(lái)就更像是一個(gè)針對(duì)UVM實(shí)現(xiàn)的平臺(tái)了。
基本功能如下:(封裝方法可以使用Python或其它腳本語(yǔ)言來(lái)實(shí)現(xiàn))
平臺(tái)初始化:
確認(rèn) 測(cè)試平臺(tái)的主目錄,測(cè)試工程目錄,測(cè)試用例目錄,工具目錄,輸出目錄……
設(shè)置重要參數(shù):
測(cè)試的代碼列表庫(kù)
測(cè)試用例的分組
運(yùn)行次數(shù)
是否調(diào)試模式:提供更多l(xiāng)og輸出
提供隨機(jī)種子數(shù):用于控制輸入?yún)?shù)的隨機(jī)種子,控制測(cè)試數(shù)據(jù)的生成。
……
編譯/構(gòu)建:
我們的testbench的代碼還是相對(duì)比較復(fù)雜的,另外,它也依賴于背后的仿真平臺(tái)提供的大量的庫(kù)文件,所以,我們一般需要對(duì)testbench的代碼進(jìn)行構(gòu)建,輸出各種我們需要的環(huán)境。
首先要對(duì)DUT代碼進(jìn)行編譯,一般是SystemVerilog代碼。
一般會(huì)使用 Makefile,需要編寫相應(yīng)的makefile,主要是需要將用到的UVM的動(dòng)態(tài)庫(kù)和引用資源進(jìn)行構(gòu)建。VCS有一些針對(duì)UVM的支撐庫(kù)。
仿真:
直接調(diào)用VCS的仿真,有低功耗的仿真模式可選
波形分析:
輸出波形,用于Verdi波形調(diào)試
代碼覆蓋率統(tǒng)計(jì):
統(tǒng)計(jì)測(cè)試的代碼覆蓋率
……
1.2.3:運(yùn)行
在運(yùn)行期,為了保證示例可以并行執(zhí)行,一般會(huì)使用HPC集群環(huán)境。我們可以使用LSF集群管理,通過 bsub 來(lái)將相應(yīng)的任務(wù),提交到HPC中運(yùn)行。
比如:
‘一般會(huì)把任務(wù)分為多條,按順序?qū)⑷蝿?wù)放入同一個(gè)隊(duì)列,保證先后次序
bsub -n 1 -M 20480 -q dv_test -Is "上面封裝的命令,完成編譯或仿真或波形分析的功能"
以上是運(yùn)算支撐最基本的要求。詳細(xì)的實(shí)現(xiàn),我們后面會(huì)展開給個(gè)實(shí)例來(lái)講。
二:位流驗(yàn)證
對(duì)于位流驗(yàn)證,我們今天要講的主要是 FPGA的EDA工具測(cè)試,在EDA工具的Flow已基本成形的情況下,就可以開始搭建位流驗(yàn)證平臺(tái)了,用于回歸/驗(yàn)證EDA工具的功能。
2.1:流程圖
我們先來(lái)解釋一下上面的典型流程:
測(cè)試用例RTL文件
使用FPGA的器件的用例。測(cè)試用例文件,一般是DeviceModel提供的一些適合于驗(yàn)證功能的標(biāo)準(zhǔn)用例。作為待測(cè)用例。(這些用例,一般是由簡(jiǎn)到繁)
EDA Flow
FPGA的軟件工具的運(yùn)行flow,在自動(dòng)化運(yùn)行時(shí),一般是采用無(wú)界面的tcl命令來(lái)執(zhí)行。
這里需要保留多個(gè)輸出:
綜合/映射后的網(wǎng)表:這是針對(duì)所有Primitve的電路實(shí)現(xiàn),可以理解為羅列出,我們的設(shè)計(jì)最終實(shí)際用到了哪些邏輯的實(shí)例。就是可以看到設(shè)計(jì)最終使用的Instance,有明確的標(biāo)識(shí)名稱。
Route后輸出的路由文件:這個(gè)用來(lái)定位所有實(shí)例Instance在芯片中實(shí)際的物理位置。也就是Impl后,實(shí)際上物理芯片上使用的邏輯塊和相應(yīng)的布線。結(jié)合上一步的輸出,可以明確查到實(shí)例具體的位置,以及走線的路徑。
Bitstream 位流:這個(gè)是生成的bitstream,這個(gè)作為Dut的輸入,直接加載到測(cè)試平臺(tái)(如:VCS),加上提前準(zhǔn)備好的芯片的原生的仿真庫(kù),仿真平臺(tái)可以實(shí)際的模擬芯片的運(yùn)行,并且得到相應(yīng)的運(yùn)行中結(jié)果和中間輸出。
用例的TestBench
根據(jù)實(shí)際情況,生成的tb文件。包含激勵(lì),定位,比較的邏輯。
測(cè)試用例表:原始的測(cè)試用例
Primitive行為模型:明確這個(gè)Primitive的行為是什么,在尋找參考模型時(shí),需要找到對(duì)應(yīng)的參考實(shí)現(xiàn)。
解析輸入/輸出管腳:找出輸入IO 和 輸出IO,這個(gè)可以在Route 中找到。
編寫用例參考模型:根據(jù)Primitive的行為和你的設(shè)計(jì)用例,寫等價(jià)的功能。注意,這里的等價(jià)模型,一般是仿真平臺(tái)直接執(zhí)行出結(jié)果(并不是基于FPGA的邏輯電路來(lái)執(zhí)行)。
設(shè)計(jì)輸入的激勵(lì)信號(hào):設(shè)計(jì)測(cè)試的輸入數(shù)據(jù)和相應(yīng)的序列。
編寫比較函數(shù):看如何比較兩者的輸出。對(duì)于返回值 ,可以簡(jiǎn)單比較輸出。對(duì)于時(shí)序,可能需要檢查波形,一般是選擇幾個(gè)關(guān)鍵的點(diǎn),不可能全部檢查。
位流測(cè)試平臺(tái)
結(jié)合位流文件,仿真庫(kù),testbech ,使用UVM平臺(tái)進(jìn)行實(shí)際的運(yùn)行。完成代碼的編譯,構(gòu)建,仿真,結(jié)果比較的功能。
測(cè)試結(jié)果
實(shí)際比較結(jié)果,將結(jié)果輸出到指定位置,并形成報(bào)告。
對(duì)于失敗的報(bào)告,還可以通過查看其它輸出(日志,波形等),具體進(jìn)行問題定位。
對(duì)于覆蓋度的統(tǒng)計(jì),可以查看目前回歸用例的覆蓋度,進(jìn)而逐漸提升。
2.2:驗(yàn)證的問題
如果2.1驗(yàn)證出問題,那可能有哪些問題呢?我們可以看看。
文件的問題
可能是測(cè)試用例的問題,route輸出的問題(net丟失之類),postmap輸出的問題……
IOPackage的問題
可能是IO Pad的錯(cuò)誤,這可能是IO Package的問題??赡苁禽斎隤ad,也可能是輸出Pad不對(duì)。IO配置不對(duì),配置信號(hào)不對(duì),綁定約束的處理問題。
路由的問題
提供的switch box 的連接不對(duì)。
邏輯單元不對(duì)
模塊的配置有問題,配置問題導(dǎo)致功能出錯(cuò),模塊到Switch box的連線問題
其它
DeviceModel建模的問題,也有可能是Primitive實(shí)現(xiàn)的問題(硬件方面的)
具體的定位,可以通過源代碼,PostMap文件,route文件來(lái)查到具體的實(shí)例,然后在VCS的仿真器上,查看具體時(shí)點(diǎn)的輸出,這里可能是需要使用工具查看波形。
route文件,postmap文件(這個(gè)一般是打平的flattern文件)的具體格式就不方便給出樣例了,這個(gè)每家FPGA的格式會(huì)有所不同。
三:FPGA芯片驗(yàn)證方法
我們?cè)O(shè)計(jì)出來(lái)的FPGA芯片,是否能滿足預(yù)期。我們要保證我們提供給用戶的FPGA上每一個(gè)器件的功能是符合預(yù)期的,也就是單個(gè)tile的功能,以及Tile之間的連接,整體芯片的邏輯是完全正常的。
所以,我們需要針對(duì)單Tile,多Tile,fullchip做位流驗(yàn)證。方法就是使用上面的位流驗(yàn)證平臺(tái)。針對(duì)這三種方法,我們分別來(lái)說明,說明應(yīng)該如何設(shè)計(jì)樣例 ,來(lái)達(dá)成相應(yīng)的結(jié)果。
3.1:?jiǎn)蜹ile位流驗(yàn)證
對(duì)于每一種Tile做單獨(dú)的測(cè)試(所有的Primitive),比如:CLB(LUT,CLA,DFF,SFTR……),CMT,IO,DSP,BRAM,EMRAM,F(xiàn)IFO,OBUF,IBUF,IOBUF,……
并且也包括Tile內(nèi)部的連接信號(hào)路由的驗(yàn)證。
我們以CLB為例:
對(duì)于CLB,里面主要涉及不同的LUT,DFF,CLA,SFTR,需要設(shè)計(jì)一系列的用例,去覆蓋相關(guān)的器件使用。
我們以最簡(jiǎn)單的 Lut2為例,來(lái)看看如何構(gòu)建測(cè)試用例,參考用例,激勵(lì)數(shù)據(jù),結(jié)果比較。
3.1.1:CLB —— LUT2
首先,我們要了解Lut2的原理,它是由2輸入1輸出組成,可以完成 2個(gè)單bit輸入1個(gè)輸出的任何邏輯。比如:a & b,a | b , a xor b。
一般來(lái)說,廠商會(huì)提供 LUT2的Primitive IP,我們假如提供的IP就叫做 YY_LUT2。
那么,對(duì)于Dut,那就很簡(jiǎn)單了。注意 a & b 的真值 表是 1000b 也就是 h8
Dut的設(shè)計(jì)代碼:
moudule And2(
input a,
input b,
output result
);
YY_LUT2 #(.INIT(4'h8)) lut2(.Io(a), .I1(b), .O(result));
end module
將該代碼使用 eda flow 執(zhí)行,生成 bitstream。
我們來(lái)看一下參考用例的寫法:
module RefModel(input A,
input B,
output Y);
assign Y = A & B ; // 參考模型的布爾函數(shù)
endmodule
以上的代碼,仿真工具在運(yùn)行時(shí),會(huì)在每個(gè)仿真周期,根據(jù)輸入數(shù)據(jù)的變化來(lái)重新輸出結(jié)果。對(duì)應(yīng)的邏輯表達(dá)式的運(yùn)算是在仿真器中執(zhí)行(實(shí)際上就是語(yǔ)法解析,然后交給CPU來(lái)執(zhí)行了)。
當(dāng)然,你的示例還可以是 A | B,A xor B,若干的樣例。
另外:
INIT=0 IS_C_INVERTED = 0 IS_CLR_INVERTED=1 可以驗(yàn)證 DFFCE 的功能
1bit加,1bit 減 可以驗(yàn)證CLA功能
wclk極性不反轉(zhuǎn) 驗(yàn)證 SFTR32
將INIT、IC_C_INVERTED、IS_PRE(CLR/R/S/)_INVERTED的值進(jìn)行隨機(jī),inst約束到FFA0 驗(yàn)證 LPQCE
3.1.2:DSP
我們?cè)僖訢SP為例,選擇合適的用例(針對(duì)DSPX18 的 2個(gè)輸入乘法)
直接調(diào)用 YY_DSP48_CPLX18 ,具體就不寫了。
具體如何設(shè)置用例,需要根據(jù)DSP48_CPLX18的輸入?yún)?shù)來(lái)設(shè)置,盡量保證相關(guān)的參數(shù)可覆蓋。
3.2:多Tile位流驗(yàn)證
需要驗(yàn)證 Tile間路由的正確性,在多個(gè)tile分配資源,全局信號(hào),時(shí)鐘可以正常共享,跨tile的優(yōu)化結(jié)果符合預(yù)期。主要是對(duì)一組tile,某個(gè)功能區(qū)域進(jìn)行驗(yàn)證。驗(yàn)證多個(gè)tile的功能及其之間的交互??梢杂脕?lái)驗(yàn)證協(xié)同工作,比如:DSP 與 BRAM的協(xié)同工作情況,驗(yàn)證范圍有限,無(wú)法覆蓋全芯片的全局資源,比如:時(shí)鐘網(wǎng)絡(luò),全局布線等。
需要構(gòu)造如下用例:
長(zhǎng)路徑信號(hào)傳輸:
Tile間級(jí)聯(lián):多個(gè)tile之間的邏輯級(jí)聯(lián)(比如:多級(jí)加法器)
Tile內(nèi)外通信:在不同Tile實(shí)現(xiàn)的模塊之間進(jìn)行通信(如:FIFO,AXI總線)
3.3:全芯片位流驗(yàn)證
對(duì)于全局資源(如:時(shí)鐘,全局線)的使用進(jìn)行驗(yàn)證。關(guān)注邊界行為(I/O引腳,DDR,PCIe)。
需要構(gòu)建的用例 :
設(shè)計(jì)一條覆蓋盡可能多Tile的信號(hào)路徑,從一個(gè)邊界Tile傳播到對(duì)角線另一側(cè)。
在設(shè)計(jì)中啟動(dòng)全局時(shí)鐘。
包含外部接口(I/O,DDR,PCIe)在設(shè)計(jì)中。
選用的用例,一般會(huì)是一些經(jīng)典的電路設(shè)計(jì),比如:FPGA一般會(huì)和閃存配合使用,那我們就選用一些標(biāo)閃的閃存器件來(lái)搭建用例(因?yàn)殚W存用例是有公開的行為模型和仿真庫(kù)的)
因?yàn)槭轻槍?duì)整個(gè)芯片的測(cè)試,所以,激勵(lì)數(shù)據(jù),應(yīng)該采用jtag方式輸入,涉及到PRAM的操作。相對(duì)比較復(fù)雜,這里不再展開細(xì)說。
3.4:代碼的測(cè)試覆蓋率
測(cè)試是否有效,主要看覆蓋率,所以,在仿真運(yùn)行中輸出測(cè)試覆蓋率,是非常重要的指標(biāo)。
覆蓋率報(bào)告通常包括以下信息:
總體覆蓋率:
顯示整個(gè)設(shè)計(jì)的總體覆蓋率(如行覆蓋率、分支覆蓋率等)。
模塊級(jí)覆蓋率:
顯示每個(gè)模塊的覆蓋率詳情。
代碼行覆蓋率:
顯示每一行代碼是否被執(zhí)行。
分支覆蓋率:
顯示每個(gè)分支是否被覆蓋。
條件覆蓋率:
顯示每個(gè)布爾表達(dá)式的條件組合是否被覆蓋。
狀態(tài)機(jī)覆蓋率:
顯示狀態(tài)機(jī)的所有狀態(tài)和狀態(tài)轉(zhuǎn)換是否被覆蓋。
翻轉(zhuǎn)覆蓋率:
顯示信號(hào)是否發(fā)生了 0 到 1 或 1 到 0 的翻轉(zhuǎn)。
代碼覆蓋度能夠查看測(cè)試的完整度。是非常重要的參考指標(biāo)。
最后我們來(lái)看看,要搭建一個(gè)自動(dòng)化的驗(yàn)證平臺(tái),需要做一些什么樣的工作:
這部分是一個(gè)封裝動(dòng)作,和驗(yàn)證本身的關(guān)系并不是很大,但如果對(duì)驗(yàn)證的細(xì)節(jié)不清楚,也不能搭建一個(gè)好的,可擴(kuò)展的平臺(tái),因?yàn)槠脚_(tái)的功能也不是一成不變的,需要有一個(gè)演進(jìn)的過程。如果有好的設(shè)計(jì),自然最佳。
四:位流驗(yàn)證的自動(dòng)化平臺(tái)
4.1:平臺(tái)架構(gòu)
這軟件EDA的位流驗(yàn)證的架構(gòu)。如果驗(yàn)證是上板驗(yàn)證(生產(chǎn)測(cè)試中心)。那位流的運(yùn)行就不是在仿真環(huán)境,而是在板上的物理芯片運(yùn)行,然后想辦法把物理芯片的運(yùn)行結(jié)果,按時(shí)序取回,然后進(jìn)行對(duì)比。
4.2:資源管理
需要管理的資源:
平臺(tái)的代碼
主要是流程控制的代碼,Python,Shell腳本,主要是存放到Git中,應(yīng)該需要管理版本,
一般會(huì)是解釋性腳本語(yǔ)言,不會(huì)有編譯/構(gòu)建的過程。
測(cè)試工程
每一次回歸測(cè)試,我們定義為一個(gè)工程。而工程會(huì)描述所有運(yùn)行的輸入,輸出。
工程的定義:針對(duì)某個(gè)芯片,某種驗(yàn)證方式,某個(gè)器件的測(cè)試,我們認(rèn)為是一個(gè)驗(yàn)證工程。
待驗(yàn)證芯片——芯片的系列(架構(gòu)),具體輸出的芯片版本號(hào)(鎖定的版本)
待驗(yàn)證的內(nèi)容—— FullChip,或者 TILE_CLB_LUT2,或者 BRAM & DSP 的聯(lián)合工程。
對(duì)應(yīng)的仿真庫(kù)——不同驗(yàn)證點(diǎn),需要提供不同的仿真庫(kù),比如 fullchip和單tile需要的仿真庫(kù)是不同的。但相對(duì)固定,基本上是提前準(zhǔn)備好的。但是如果芯片的架構(gòu)發(fā)生變化,需要做相應(yīng)的更換。也可以理解芯片系列的版本發(fā)生變化。
對(duì)應(yīng)的待測(cè)式DUT——待測(cè)試的DUT的測(cè)試用例。
DUT 對(duì)應(yīng)的RefModel—— 對(duì)應(yīng)的參考模型。
相關(guān)的配置信息——可能存在一些配置,可能待測(cè)內(nèi)容不同,配置會(huì)有所不同。略
輸出目錄——包括位流輸出目錄(包括一些中間文件輸出),最終輸出目錄。
DUT Testbench
每個(gè)待測(cè)工程,都需要有一個(gè)TestBench 代碼,TestBench 用來(lái)定義整個(gè)測(cè)試的過程。包括如何使用生成的位流進(jìn)行仿真運(yùn)行,如何調(diào)用RefModel(Golden case)獲得結(jié)果,兩者如何進(jìn)行比較,如何輸出。
注意,不同測(cè)試工程,可能代碼會(huì)有所不同。
測(cè)試用例
測(cè)試用例是針對(duì)芯片待測(cè)單元的調(diào)用??赡苄枰采w待測(cè)單元的大多數(shù)輸入組合。這些用例需要進(jìn)行統(tǒng)一管理,在需要時(shí),在測(cè)試工程中配置。
比如:針對(duì) LUT1的測(cè)試用例 (只需要初始化一下真值表即可)
YY_LUT1 # ( INIT (2'h3) inst_lut1() // o = a
參考模型代碼
針對(duì)測(cè)試用例,與之對(duì)應(yīng)的另外一種實(shí)現(xiàn)(不依賴于FPGA),直接在VCS中運(yùn)行。如果需要考慮時(shí)序,該模型代碼需要打拍。
比如:assign o = a 就是針對(duì)上面的LUT1用例的Golden case。
其它配置
配置EDA工具的運(yùn)行環(huán)境,這個(gè)是可以按需配置,因?yàn)閷?duì)于EDA,研發(fā)每天都會(huì)有新的版本。
4.3:調(diào)度平臺(tái)
因?yàn)樾枰詣?dòng)化,必須要有調(diào)度,這樣可以定時(shí)自動(dòng)執(zhí)行。
可以通過腳本控制執(zhí)行的入口和過程,控制超時(shí)時(shí)間,控制運(yùn)行的隊(duì)列(串行還是并行),可以將大任務(wù)發(fā)到計(jì)算集群。
調(diào)度很簡(jiǎn)單,一般使用 Jekins的 Pipeline即可,Jekins支持Shell,可以進(jìn)行任務(wù)的編排。
4.4:位流生成
位流生成,就是使用j最新EDA和相應(yīng)的flow tcl ,用來(lái)生成位流。
位流生成需要注意幾個(gè)點(diǎn):
可能會(huì)添加固定的物理約束,簡(jiǎn)化輸出,明確實(shí)際的 IOPAD。
4.5:仿真運(yùn)行
對(duì)于test bencch 運(yùn)行,會(huì)有多個(gè)步驟。
激勵(lì)數(shù)據(jù)的處理
這里要看一下,是否需要形成有針對(duì)性的激勵(lì)數(shù)據(jù)??赡芎臀恢棉D(zhuǎn)換有關(guān)(實(shí)際位置可以通過位流輸出的 instance和 route信息,獲取實(shí)際的位置信息)。
test bench 代碼編譯
針對(duì) test bench代碼,建議采用makefile進(jìn)行編譯/構(gòu)建,這樣比較容易針對(duì)VCS進(jìn)行動(dòng)態(tài)鏈接和引用,也定義輸出的動(dòng)作。
test bech 仿真運(yùn)行
使用仿真平臺(tái),輸入激勵(lì),進(jìn)行仿真,輸出波形,輸出代碼覆蓋度。
對(duì)Golden Case 進(jìn)行運(yùn)行,輸入激勵(lì),執(zhí)行輸出。
兩者進(jìn)行比較,在仿真log中輸出
4.6:結(jié)果輸出
收集結(jié)果,確認(rèn)是否成功,輸出最終報(bào)告。
可能還會(huì)輸出一些必要的數(shù)據(jù),波形,代碼覆蓋度之類。
五:其它
5.1:硬件設(shè)計(jì)驗(yàn)證
對(duì)于硬件部的位流驗(yàn)證,實(shí)際上基本上是一致的。不同之處主要有:
1:在EDA的位流生成功能不成熟前,需要有其它方式生成位流。
2:硬件驗(yàn)證不通過的情況,會(huì)關(guān)注硬件本身的設(shè)計(jì),而不是位流的生成。關(guān)注點(diǎn)會(huì)有所不同。
5.2:生產(chǎn)測(cè)試中心位流驗(yàn)證
對(duì)于生產(chǎn)測(cè)試中心,需要實(shí)際上板測(cè)試。所以。
1:位流需要download到實(shí)際芯片上運(yùn)行,激勵(lì)需要實(shí)際輸入到芯片。
2:參考模型與軟件一樣,但注意,大多數(shù)時(shí)候要考慮時(shí)序,而不是簡(jiǎn)單的組合邏輯。
3:對(duì)于實(shí)際芯片的運(yùn)行輸入/輸出,一般需要做特殊處理,比如:設(shè)計(jì)專用電路,完成激勵(lì)輸入,設(shè)計(jì)驅(qū)動(dòng)程序?qū)⑤敵鰯?shù)據(jù)寫入本地磁盤,然后通過磁盤文件獲取結(jié)果,進(jìn)行比較。
輸出的文件需要表達(dá)時(shí)序信息。
4:生產(chǎn)測(cè)試發(fā)現(xiàn)問題,關(guān)注的是硬件的可靠性。
原文鏈接:https://community.sslcode.com.cn/6789d33a59bcf8384aa65e71.html
-
FPGA
+關(guān)注
關(guān)注
1642文章
21918瀏覽量
611966 -
芯片
+關(guān)注
關(guān)注
459文章
51927瀏覽量
433655 -
eda
+關(guān)注
關(guān)注
71文章
2852瀏覽量
175744 -
數(shù)字電路
+關(guān)注
關(guān)注
193文章
1636瀏覽量
81430
原文標(biāo)題:FPGA EDA軟件的位流驗(yàn)證
文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
驗(yàn)證中的FPGA原型驗(yàn)證 FPGA原型設(shè)計(jì)面臨的挑戰(zhàn)是什么?
FPGA設(shè)計(jì)新需求走熱 EDA戰(zhàn)況升溫
設(shè)計(jì)與驗(yàn)證Verilog HDL FPGA設(shè)計(jì)與驗(yàn)證的好書
FPGA設(shè)計(jì)的仿真驗(yàn)證概述
基于EDA技術(shù)的FPGA該怎么設(shè)計(jì)?
基于EDA技術(shù)的FPGA該怎么設(shè)計(jì)?
EDA軟件的安裝與配置(僅針對(duì)開發(fā)Altera FPGA)
EDA Tools in FPGA
基于多種EDA工具的FPGA設(shè)計(jì)

芯片設(shè)計(jì)EDA軟件的使用
什么是板級(jí)EDA軟件 eda器件分幾類 數(shù)字EDA和模擬EDA的區(qū)別
使用加密和身份驗(yàn)證來(lái)保護(hù)UltraScale/UltraScale+ FPGA比特流

原型平臺(tái)是做什么的?proFPGA驗(yàn)證環(huán)境介紹

智多晶EDA工具HqFpga軟件實(shí)用小功能

評(píng)論