開發(fā)和驗(yàn)證 FPGA IP 不僅僅是編寫 HDL,而是需要更多的思考。讓我們來看看如何做吧!
介紹
當(dāng)我們開發(fā)基于 FPGA 的解決方案時(shí),我們會(huì)盡可能利用手上的 IP,因?yàn)檫@會(huì)加速開發(fā)。然而,在某些情況下,我們需要使用自定義 IP 核,以應(yīng)對(duì)新項(xiàng)目。
開發(fā)和驗(yàn)證此 IP 塊會(huì)帶來一些挑戰(zhàn),如果做得不正確,可能會(huì)讓項(xiàng)目進(jìn)度變得緩慢。
當(dāng)然,在使用 FPGA 時(shí),我們需要考慮的關(guān)鍵事情之一是需要首先考慮我們希望實(shí)現(xiàn)的功能,以及遵循正確的開發(fā)流程。
為了說明這個(gè)過程,我們以實(shí)際項(xiàng)目為示例,過程如下:
定義需求
創(chuàng)建微架構(gòu)和接口
編寫模塊的RTL描述
開發(fā) RTL 接口的總線功能模型
創(chuàng)建仿真平臺(tái)進(jìn)行驗(yàn)證
要求
示例項(xiàng)目,我們將創(chuàng)建一個(gè)簡(jiǎn)單的 AXI Stream QSPI 從接口IP,具有以下要求:
創(chuàng)建IP的這些要求非常簡(jiǎn)單。然后,我們可以將該模塊與之前的項(xiàng)目集成,例如:可以通過 QSPI 訪問芯片內(nèi)的AXI4總線。
微架構(gòu)和接口
接下來我們需要?jiǎng)?chuàng)建微架構(gòu),這意味著我們需要了解串行存儲(chǔ)器模式下的 QSPI 是如何工作的。
READ4IO 和 PP4IO 的波形如下所示
它們首先使用單線到 IO0 來發(fā)送命令 0x38(用于寫入操作)或 0xEB(用于讀取操作)。
命令發(fā)送后,將使用所有 IO 執(zhí)行事務(wù)的其余部分。
對(duì)我們架構(gòu)的影響是,我們需要一個(gè) 8 元素移位寄存器用于 IO0,2 元素移位寄存器用于 IO1-3。收到命令后,我們就可以僅使用 IO0 寄存器的較低兩個(gè)元素。
因此,我們的微架構(gòu)需要能夠執(zhí)行以下操作
通過識(shí)別 CSn 的下降沿來檢測(cè)新事務(wù)
啟用新事務(wù)后檢測(cè) SCK 上的上升沿
使能數(shù)據(jù)移入 IO0 寄存器
一旦 8 位數(shù)據(jù)位于 IO0 寄存器中,具體取決于檢查是否有效的讀或?qū)懨?/p>
對(duì)于寫使能 IO1-3 以及 IO0 - 每兩個(gè) SCLK 在 AXIS 接口上輸出一個(gè)字節(jié)的數(shù)據(jù)。確保 IO 驅(qū)動(dòng)程序在該狀態(tài)下處于三態(tài)。
對(duì)于讀取,在虛擬時(shí)鐘周期期間,從 AXIS 接口讀取
對(duì)于在虛擬周期結(jié)束時(shí)讀取,輸出 IO0-IO3 上的數(shù)據(jù)
CSn 的取消斷言會(huì)停止事務(wù)并復(fù)位狀態(tài)機(jī)等。
微代碼架構(gòu)完成后,我們就可以編寫 HDL。
設(shè)計(jì)微架構(gòu)時(shí)的關(guān)鍵要素之一是以合理的方式定義接口,尤其是 FPGA 內(nèi)部與其他模塊連接的接口。雖然定義自己的接口可能很爽,但是還是要選擇行業(yè)標(biāo)準(zhǔn),例如 AXI 等。這樣不僅能夠輕松定義接口,同時(shí)確保其他開發(fā)人員在集成時(shí)能夠輕松使用它們。使用行業(yè)標(biāo)準(zhǔn)還簡(jiǎn)化了接口驗(yàn)證,因?yàn)榭梢允褂脴?biāo)準(zhǔn) BFM,隨著時(shí)間的推移,它還會(huì)建立一個(gè)有用的 IP 模塊存儲(chǔ)庫,可以在多個(gè)項(xiàng)目中重復(fù)使用,從而減少開發(fā)時(shí)間和同類型項(xiàng)目成本。
因此,該塊使用 AXI Stream 通過 QSPI 接口發(fā)送和接收數(shù)據(jù)。
HDL 設(shè)計(jì)
該設(shè)計(jì)的 HDL 可以在文末看到。
IP 的接口如下是:
設(shè)計(jì)中的狀態(tài)機(jī):
HDL 完成后,下一步是仿真驗(yàn)證。
仿真
我們?nèi)绾瓮ㄟ^創(chuàng)建測(cè)試平臺(tái)來驗(yàn)證 FPGA 設(shè)計(jì)是否按預(yù)期工作。測(cè)試臺(tái)對(duì)被測(cè)單元 (UUT) 施加激勵(lì)并觀察 UUT 的輸出,以確保其行為符合預(yù)期。
本次我們不想使用波形進(jìn)行驗(yàn)證,我們檢查 UUT 的行為并將其記錄到文件中,驗(yàn)證其是否按照預(yù)期運(yùn)行。
如果我們發(fā)現(xiàn)預(yù)期結(jié)果存在異常,我們?cè)偈褂貌ㄐ蝸碚{(diào)試 UUT。
每個(gè)測(cè)試用例都是一組獨(dú)特的激勵(lì),它將特定測(cè)試應(yīng)用于 UUT 以檢查該激勵(lì)的特定結(jié)果。
創(chuàng)建這些測(cè)試用例可能很復(fù)雜,并且是驗(yàn)證過程中最耗時(shí)的部分。根據(jù) UUT 的復(fù)雜性,可能有少量測(cè)試用例,也可能有數(shù)十個(gè)甚至數(shù)百個(gè)。
因此,我們希望將測(cè)試平臺(tái)與測(cè)試用例分開。我們使用幾個(gè)不同的抽象層來實(shí)現(xiàn)這一目標(biāo),包括
測(cè)試用例 - 一個(gè)或多個(gè)測(cè)試用例,通過測(cè)試框架向 UUT 施加激勵(lì)。
測(cè)試工具 - 包含 UUT 的映射以及 IP 模型(例如 RAMS、DDR 模型等)的連接
UUT - 我們正在測(cè)試的單元。
為了以最簡(jiǎn)單的方式實(shí)現(xiàn)這一目標(biāo),我們將使用大量的總線功能模型 (BFM) 和事務(wù)級(jí)模型 (TLM)。
當(dāng)然,我們可以將 UVM、UVVM 和 OSVVM 等框架用于這些應(yīng)用程序,但是,由于該項(xiàng)目的目的是演示,因此我們將從頭開始。
如果本次設(shè)計(jì)可以完美完成,將使測(cè)試用例成為一系列 BFM / TLM 級(jí)別的調(diào)用和相關(guān)檢查。通過這種方式,測(cè)試用例看起來更像腳本而不是傳統(tǒng)的 HDL 文件。
這樣的靈活性非常重要,因?yàn)槲覀冃枰軌蜻m應(yīng) UUT 功能的變化,這些變化會(huì)導(dǎo)致需要?jiǎng)?chuàng)建更多的測(cè)試用例。
對(duì)于此應(yīng)用程序,我們有以下內(nèi)容:
測(cè)試用例 - 應(yīng)用激勵(lì) - 在這種情況下,我們有一個(gè)測(cè)試用例,其中包含一個(gè)簡(jiǎn)單的測(cè)試。
測(cè)試臺(tái) - 包含測(cè)試臺(tái)的測(cè)試基礎(chǔ)設(shè)施。這包括 UUT、AXIS FIFO 和時(shí)鐘/復(fù)位電路。
UUT - 我們正在測(cè)試的 QSPI IP 核
QSPI BFM 庫 - 包含許多 BFM 的庫,作為 QSPI 主設(shè)備通過接口執(zhí)行讀寫操作。
Vivado 項(xiàng)目
為了測(cè)試該項(xiàng)目,我們可以創(chuàng)建一個(gè)包含 HDL 和測(cè)試平臺(tái)的 Vivado 項(xiàng)目。我們使用 Vivado 在測(cè)試臺(tái)中提供 AXIS FIFO,允許循環(huán)回寫入的命令,以驗(yàn)證讀回。
如果我們查看項(xiàng)目層次結(jié)構(gòu),我們將看到測(cè)試用例位于頂層的驗(yàn)證結(jié)構(gòu),下面的測(cè)試臺(tái)包含 AXIS FIFO 和 UUT。
看不到該包,因?yàn)樗鼉H在庫視圖下可用
運(yùn)行 HDL 行為仿真將打開波形視圖。選擇 UUT 并將信號(hào)添加到波形中。
單擊“run all”,仿真完成后將看到 IO 信號(hào)和內(nèi)部信號(hào)的波形。
在這種情況下,我們期望的是,我們收到的每個(gè)寫入值與測(cè)試平臺(tái)執(zhí)行此檢查時(shí)返回的值相同。
對(duì)于關(guān)鍵應(yīng)用,可能不同的工程師來執(zhí)行驗(yàn)證并提供驗(yàn)證結(jié)果。
總結(jié)
在這個(gè)項(xiàng)目中,我們提供了 FPGA IP 核開發(fā)的流程概要。有些流程尚未涵蓋,例如編碼規(guī)則和靜態(tài)分析等,但它為那些希望開始的人提供了很好的開端。
評(píng)論
查看更多