版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、如何從零開始構(gòu)建一個(gè)可用的UVM驗(yàn)證平臺 前面大體說明了uvm的結(jié)構(gòu),類型關(guān)系以及啟動(dòng)過程。現(xiàn)在最關(guān)心的大概也就是uvm是如何把一串激勵(lì)發(fā)送給被測對象的了。對于傳統(tǒng)的基于verilog的驗(yàn)證平臺,基本套路就是各種module中的task相互調(diào)用,最終把激勵(lì)施加到頂層模塊例化的被測對象中,但是具體步驟各個(gè)團(tuán)隊(duì)又有挺大差異?;赨VM的平臺,本質(zhì)其實(shí)也是這樣,但是它把各種調(diào)用關(guān)系進(jìn)行了更嚴(yán)格的限定,所以所有使用uvm的團(tuán)隊(duì),實(shí)現(xiàn)的驗(yàn)證平臺都更加相似。下面以之前的apb/spi接口為例具體講解一下。這里把之前的圖再貼過來一下。之前已經(jīng)說過有關(guān)sequencer,driver,monitor,env等
2、的大體功能,這些可以被認(rèn)為是驗(yàn)證平臺的硬體,除此之外,還有一些在這之間流動(dòng)的軟體需要近一步說明一下。uvm_sequence_item就是這種軟體最基本的構(gòu)造單元。比如可以定義apb端的sequence_item,其中包括讀寫信息,數(shù)據(jù)地址這些成員。class apb_transfer extendsuvm_sequence_item; rand bit31:0 addr; randapb_direction_enum direction; rand bit31:0 data; rand intunsigned delay = 0; constraint c_direction directi
3、on inside APB_READ, APB_WRITE ; constraint c_delay delay /這里需要將其中的變量注冊一下,這些后邊具體講 uvm_object_utils_begin(apb_transfer) uvm_field_int(addr, UVM_DEFAULT) uvm_field_enum(apb_direction_enum, direction, UVM_DEFAULT) uvm_field_int(data, UVM_DEFAULT) uvm_object_utils_end function new (string name ='apb_
4、transfer'); super.new(name); endfunction/對其他方法沒有進(jìn)行特別的設(shè)定endclass : apb_transfer比uvm_sequence_item稍微高一層極的信息單元是uvm_sequence,這個(gè)可以認(rèn)為是一連串的uvm_sequence_item,可以表達(dá)一個(gè)完整的操作,下面是讀fifo的一個(gè)例子。class read_rx_fifo_seq extends uvm_sequence#(apb_pkg:apb_transfer);/此類從uvm_sequence派生得到,uvm_sequence是一個(gè)參數(shù)化的類,這里類型賦值為apb_
5、transfer,它被定義在apb_pkg這個(gè)包中 functionnew(string name='read_rx_fifo_seq'); super.new(name); endfunction / Registersequence with a sequencer uvm_object_utils(read_rx_fifo_seq) rand bit31:0 read_addr; rand intunsigned del = 0; rand intunsigned num_of_rd; constraintnum_of_rd_ct (num_of_rd constrain
6、tdel_ct (del constraintaddr_ct (read_addr1:0 = 0); /一個(gè)sequence最重要的行為就是body,里邊定義這個(gè)信息序列都發(fā)送什么東西 virtual taskbody(); uvm_info(get_type_name(), $sformatf('Starting Reads.',num_of_rd), UVM_LOW) response_queue_error_report_disabled = 1; for (int i = 0; i read_addr =RX_FIFO_REG; /rx fifo address uvm
7、_do_with(req, req.addr = read_addr; req.direction = APB_READ; req.delay = del; ) end endtask /uvm_do_with這個(gè)宏負(fù)責(zé)把各個(gè)最基本的sequence_item加上約束發(fā)送出去。endclass : read_rx_fifo_seq如何把這個(gè)sequence發(fā)送出去呢?這就需要在testcase里邊把這個(gè)sequence通過sequencer發(fā)出去。class read_rx_fifo_test extends uvm_test; uvm_component_utils(read_rx_fifo
8、_test) spi_apb_env spi_apb_env_0;/test中例化env function new(string name ='read_rx_fifo_test', uvm_component parent=null); super.new(name,parent); endfunction : new virtual function void build_phase(uvm_phasephase); super.build_phase(phase); spi_apb_env_0 = spi_apb_env:type_id:create('spi_a
9、pb_env_0',this); endfunction : build_phasevirtual taskmain_phase(uvm_phase phase); super.main_phase(phase);/執(zhí)行基類的任務(wù) read_rx_fifo_seq_inst =read_rx_fifo_seq:type_id:create('read_rx_fifo_seq_inst',this);/產(chǎn)生一個(gè)seq read_rx_fifo_seq_inst.start(spi_apb_env_0.apb_agent_0.apb_sqr);/將seq通過sqr發(fā)送 en
10、dtaskendclass : read_rx_fifo_testsequencer得到了這個(gè)序列,就要把它交給driver,然后driver把其中的信息元素放置到與dut連接的接口上。這樣就將需要的激勵(lì)施加給了被測對象。class apb_master_driver extends uvm_driver #(apb_transfer); / 連接driver與dut的虛接口. virtual apb_if vif; function new (string name, uvm_componentparent); super.new(name, parent); endfunction : n
11、ew / 在外部定義以下任務(wù) extern virtual function voidbuild_phase(uvm_phase phase); extern virtual function voidconnect_phase(uvm_phase phase); extern virtual task run_phase(uvm_phasephase); extern virtual protected taskget_and_drive(); extern virtual protected task drive_transfer(apb_transfer trans); extern v
12、irtual protected taskdrive_address_phase (apb_transfer trans); extern virtual protected task drive_data_phase(apb_transfer trans);endclass : apb_master_driverfunction void apb_master_driver:connect_phase(uvm_phasephase); super.connect_phase(phase); if (!uvm_config_db#(virtual apb_if):get(this,'&
13、#39;, 'vif', vif) uvm_error('NOVIF','virtual interface must be set for:',get_full_name(),'.vif')/將虛接口通過配置從頂層取出來,并賦值給vifendfunction : connect_phasetask apb_master_driver:run_phase(uvm_phase phase); get_and_drive();endtask : run_phase/ 在執(zhí)行時(shí)一直在從sqr取item并且賦值給viftask apb_m
14、aster_driver:get_and_drive(); while (1) begin fork begin forever begin (posedge vif.pclock iff (vif.preset) seq_item_port.get_next_item(req);/從sqr取到item drive_transfer(req);/發(fā)送 seq_item_port.item_done(req);/告知sqr使其產(chǎn)生下一個(gè)item end end join_any disable fork; endendtask : get_and_drive/具體一個(gè)發(fā)送過程task apb_m
15、aster_driver:drive_transfer (apb_transfer trans); drive_address_phase(trans);/發(fā)送地址 drive_data_phase(trans);/發(fā)送數(shù)據(jù)endtask : drive_transfertask apb_master_driver:drive_address_phase (apb_transfertrans); int slave_indx; slave_indx =cfg.get_slave_psel_by_addr(trans.addr); vif.paddr vif.psel vif.penable i
16、f (trans.direction = APB_READ) begin vif.prwd end else begin vif.prwd vif.pwdata end (posedge vif.pclock);endtask : drive_address_phasetask apb_master_driver:drive_data_phase (apb_transfertrans); vif.penable (posedge vif.pclock iff vif.pready); if (trans.direction = APB_READ) begin trans.data =vif.p
17、rdata; end vif.penable vif.psel endtask : drive_data_phase再重復(fù)一下這個(gè)基本的步驟,在test的main_phase中,由基本的sequence_item組成的sequence被放到sequencer上執(zhí)行,sequencer將它轉(zhuǎn)交給driver,其后driver通過虛接口將具體信號施加到被測對象上,實(shí)現(xiàn)uvm中激勵(lì)的產(chǎn)生傳輸與施加過程。這里就產(chǎn)生了兩個(gè)問題,一個(gè)是sequencer如何將sequence_item轉(zhuǎn)交給driver,另一個(gè)是driver如何通過虛接口將具體信號施加到被測對象上。這里具體解釋對于第一個(gè)問題,我們在dri
18、ver中有這么2句 seq_item_port.get_next_item(req); seq_item_port.item_done(req);這里的seq_item_port就是driver與sequencer通信的接口。在uvm_driver中可以看到這個(gè)定義為 uvm_seq_item_pull_port #(REQ, RSP)seq_item_port;這里的REQ,RSP都是對應(yīng)uvm_driver的sequence_item。而uvm_seq_item_pull_port是一個(gè)uvm專用的tlm口同樣,在uvm_sequencer中有 uvm_seq_item_pull_imp
19、#(REQ, RSP, this_type)seq_item_export;而在上層的uvm_agent中有 virtual function voidconnect_phase(uvm_phase phase); drv.seq_item_port.connect(sqr.seq_item_export); endfunction這里drv跟sqr分別是例化的uvm_driveruvm_sequencer的名字,可以看到他們兩個(gè)實(shí)質(zhì)是通過這個(gè)tlm接口來傳遞item的。下面圖大致說明了這個(gè)鏈接建立以及傳送數(shù)據(jù)的過程。首先在build后的connect 時(shí)段,會(huì)確立drv.seq_item_p
20、ort與sqr.seq_item_export的鏈接,也就是檢查port與export的一一對應(yīng)關(guān)系,并將與port對應(yīng)的export映射給m_if,而后每次執(zhí)行driver中的 get_next_item與item_done實(shí)際就是執(zhí)行了sequencer中的get_next_item與item_done。而這實(shí)際上就是往一個(gè)隊(duì)列中不斷存數(shù)與取數(shù)的過程。詳細(xì)代碼在uvm_sequencer中接下來再看第2個(gè)問題,driver通過虛接口驅(qū)動(dòng)信號的過程。這里是apb接口的定義interface apb_if (input pclock, input preset); parameter PADDR_WIDTH = 32; parameter PWDATA_WIDTH = 32; parameter PRDATA_WIDTH = 32; logic PADDR_WIDTH-1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 科技驅(qū)動(dòng)農(nóng)產(chǎn)品電商
- 科技農(nóng)業(yè)投資視角
- 專業(yè)房產(chǎn)經(jīng)紀(jì)服務(wù)協(xié)議2024版范本版
- 二零二四宇通客車零部件銷售代理及市場拓展合作協(xié)議3篇
- 2025年度電商新零售線下體驗(yàn)店合作合同3篇
- 專業(yè)銷售服務(wù)協(xié)議書2024年3篇
- 2025年度跨境電商物流中心場地承包經(jīng)營合同4篇
- 2025年度航空航天復(fù)合材料加工技術(shù)合同4篇
- 2025年度茶樓裝修工程合同標(biāo)準(zhǔn)樣本8篇
- 2025年度教育機(jī)構(gòu)場地租賃保證金合同8篇
- 2024版塑料購銷合同范本買賣
- 【高一上】【期末話收獲 家校話未來】期末家長會(huì)
- JJF 2184-2025電子計(jì)價(jià)秤型式評價(jià)大綱(試行)
- GB/T 44890-2024行政許可工作規(guī)范
- 有毒有害氣體崗位操作規(guī)程(3篇)
- 二年級下冊加減混合豎式練習(xí)360題附答案
- 吞咽解剖和生理研究
- TSG11-2020 鍋爐安全技術(shù)規(guī)程
- 汽輪機(jī)盤車課件
- 異地就醫(yī)備案個(gè)人承諾書
- 蘇教版五年級數(shù)學(xué)下冊解方程五種類型50題
評論
0/150
提交評論