本系列我想深入探尋 AXI4 總線。不過(guò)事情總是這樣,不能我說(shuō)想深入就深入。當(dāng)前我對(duì) AXI總線的理解尚談不上深入。但我希望通過(guò)一系列文章,讓讀者能和我一起深入探尋 AXI4。
歡迎來(lái)到深入 AXI4 總線的實(shí)戰(zhàn)篇,系列第二篇文章中,我們將首先了解調(diào)用 AXI VIP 產(chǎn)生激勵(lì)與響應(yīng)的方法,并完成一個(gè)小目標(biāo):實(shí)現(xiàn)三種情況下的握手信號(hào)。
關(guān)于平臺(tái)移植
本文的實(shí)戰(zhàn)在第一篇的示例工程上,新建 tb 來(lái)實(shí)現(xiàn)我們的功能。新建 tb 中的邏輯由 demo tb 的內(nèi)容搬運(yùn)簡(jiǎn)化而來(lái)。
本來(lái)計(jì)劃新建一個(gè)工程,但是閱讀 PG267 (IP 核的產(chǎn)品文檔)發(fā)現(xiàn),當(dāng)前 Vivado 對(duì)于該 IP 的支持還比較弱,需要將 IP 的實(shí)例名以及層次路徑硬編碼至 tb 中,如果新建工程還比較麻煩。所以本文暫時(shí)還是在 example 的基礎(chǔ)上展開(kāi) 。
想要重新搭建工程的讀者請(qǐng)注意閱讀 demo tb 開(kāi)頭的說(shuō)明,或者 PG267 第六章中的內(nèi)容。
本文的場(chǎng)景為主機(jī)與從機(jī)之間通過(guò) Pass-through (以后叫 ta 中間機(jī)?)進(jìn)行通信。從機(jī)選用 mem 模式,有自己的存儲(chǔ)模型,即使用 mem_stimulus.sv 作為激勵(lì)。關(guān)于存儲(chǔ)模型,我們將在后續(xù)的文章中討論。
我們的改動(dòng)在于主機(jī)的激勵(lì)部分,以原先的 mst_stimulus.sv 為基礎(chǔ),構(gòu)建我們自己的主機(jī)激勵(lì),改動(dòng)后的 testbench 結(jié)構(gòu)如下圖所示。
是的,新的激勵(lì)加上了 headbig 字段,這來(lái)自于 深入 AXI4 總線 系列文章的英文名:Headbig AXI4。
VIP API 基本調(diào)用方式
PG 文檔中,Xilinx 表示 VIP 基于 SystemVerilog 語(yǔ)言開(kāi)發(fā),同時(shí)在 API 的設(shè)計(jì)上,命名與數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)均參考了 UVM 框架,便于 VIP 在驗(yàn)證系統(tǒng)中的集成。由于本文的重點(diǎn)不在于 UVM 或者 API 的設(shè)計(jì),因此僅跟著 demo 以及 PG 中的 API 調(diào)用流程過(guò)一遍。
主機(jī) master
首先來(lái)看主機(jī),定義于 axi_vip_master_mst_stimulus.sv 中
為主機(jī) master ip 創(chuàng)建一個(gè) agent 對(duì)象,傳入 master ip 的層級(jí)路徑,后續(xù)通過(guò)該 agent 控制主機(jī) ip
agent = new("master vip agent",DUT.ex_design.axi_vip_mst.inst.IF);
通過(guò) agent 啟動(dòng)主機(jī)
agent.start_master();
在 fork ...join 并發(fā)塊中同時(shí)發(fā)出主機(jī)的讀寫(xiě)傳輸事務(wù)。
fork begin //調(diào)用寫(xiě)傳輸事務(wù) API end begin //調(diào)用讀傳輸事務(wù) API end join
產(chǎn)生兩者的 API 結(jié)構(gòu)相似,我們以寫(xiě)傳輸事務(wù)為例。例程中依次使用了 3 種 API ,分別產(chǎn)生
完全隨機(jī)化的寫(xiě)傳輸事務(wù)
multiple_write_transaction_full_rand ("single write",1);
定制化的寫(xiě)傳輸事務(wù)
single_write_transaction_api("single write with api", .id(mtestWID), .addr(mtestWADDR), .len(mtestWBurstLength), .size(mtestWDataSize), .burst(mtestWBurstType), .wuser(mtestWUSER), .awuser(mtestAWUSER), .data(mtestWData) );
部分隨機(jī)化的寫(xiě)傳輸事務(wù)
multiple_write_transaction_partial_rand(相關(guān)參數(shù));
我們常說(shuō),不想知道 API 函數(shù)之下發(fā)生了什么的程序員不是好程序員,IC 工程師同樣如是。以較簡(jiǎn)單的定制化寫(xiě)傳輸事務(wù)函數(shù)為例,所謂函數(shù)實(shí)質(zhì)上是一個(gè) sv task,以下是 task 中的主要內(nèi)容:
axi_transaction wr_trans; wr_trans = agent.wr_driver.create_transaction(name); wr_trans.set_write_cmd(addr,burst,id,len,size); wr_trans.set_prot(prot); //... wr_trans.set_data_block(data); agent.wr_driver.send(wr_trans);
首先聲明一個(gè) axi 傳輸事務(wù)對(duì)象,然后在主機(jī) ip 的 agent 下建立傳輸事務(wù)。
通過(guò) API 函數(shù)設(shè)定寫(xiě)命令信息,設(shè)定傳輸屬性以及待傳輸?shù)臄?shù)據(jù)塊。數(shù)據(jù)塊的數(shù)據(jù)類型為
bit [4 * 1024 * 8 - 1:0]
從機(jī) slave
接下來(lái),我們看一下從機(jī)的相關(guān)流程,定義于 axi_vip_master_mem_stimulus.sv 中。
同樣為從機(jī)創(chuàng)建并啟動(dòng)相應(yīng) agent,此處與主機(jī)相似不表。
在 demo 中構(gòu)造了一個(gè)虛擬數(shù)據(jù)作為后續(xù)對(duì)主機(jī)讀數(shù)據(jù)的回應(yīng),因?yàn)楸疚牡闹饕ぷ魇堑玫轿帐中畔⒌牟ㄐ危虼瞬⒉粫?huì)實(shí)際存儲(chǔ)主機(jī)寫(xiě)入的數(shù)據(jù),而是在主機(jī)讀取任意地址時(shí),返回這個(gè)虛擬數(shù)據(jù)。
最后,從機(jī)調(diào)用 API 產(chǎn)生 wready 信號(hào)應(yīng)答
task user_gen_wready(); axi_ready_gen wready_gen; wready_gen = agent.wr_driver.create_ready("wready"); wready_gen.set_ready_policy(XIL_AXI_READY_GEN_OSC); wready_gen.set_low_time(1); wready_gen.set_high_time(2); agent.wr_driver.send_wready(wready_gen); endtask
此處表示 wready 信號(hào)在從機(jī)空閑時(shí)周期性生成,有效時(shí)間為 2/3,我們可以在后續(xù)的波形中看到。
握手波形
我們對(duì)主機(jī)的激勵(lì)代碼進(jìn)行修改,僅保留單次定制化的讀寫(xiě)傳輸事務(wù),地址為 0x0,突發(fā)長(zhǎng)度為 0。在波形中我們得到了三種情況下的握手信號(hào)。
(1)VALID 信號(hào)等待 READY 信號(hào)
在 tb 中主機(jī)并行地啟動(dòng)讀寫(xiě)傳輸事務(wù),AR/W VALID 同時(shí)置高,在等待從機(jī)給出 READY 信號(hào)后完成地址與控制信號(hào)的傳輸,此時(shí)地址為 0x0.
(2)READY 信號(hào)等待 VALID 信號(hào)
主機(jī)在發(fā)出讀傳輸事務(wù)后,置高 RREADY 信號(hào)等待接收從機(jī)返回的讀數(shù)據(jù)。在從機(jī)置高 RVALID 后,讀傳輸事務(wù)完成。
(3)READY 與 VALID 信號(hào)同時(shí)置起
在設(shè)置從機(jī)的 READY 信號(hào)類型時(shí),我們?cè)O(shè)置為周期性置高 READY,從下圖中可以看到,READY 信號(hào)在送出 2 個(gè)周期高電平后置低 1 個(gè)周期。
在這個(gè)場(chǎng)景中,寫(xiě)數(shù)據(jù)通道中的 WREADY 信號(hào)正好與 WVALID 信號(hào)同時(shí)置起,解鎖了最后三種握手姿勢(shì)中的最后一種,OK 本文實(shí)戰(zhàn)篇收工了。
結(jié)語(yǔ)
本文首先介紹了 AXI VIP 中產(chǎn)生傳輸事務(wù)的基本方法。基于 demo 修改了一個(gè)簡(jiǎn)單純粹的例子,并基于這個(gè)例子觀察到了握手信號(hào)。
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7133瀏覽量
89375 -
存儲(chǔ)
+關(guān)注
關(guān)注
13文章
4347瀏覽量
86058 -
編碼
+關(guān)注
關(guān)注
6文章
957瀏覽量
54911 -
AXI總線
+關(guān)注
關(guān)注
0文章
66瀏覽量
14295
原文標(biāo)題:深入AXI4 總線實(shí)戰(zhàn):Hello AXI handshake
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論