www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 公眾號精選 > ZLG致遠(yuǎn)電子
[導(dǎo)讀]就我個人而言,我覺得編寫sequence是在驗證任何IP時最具挑戰(zhàn)性的部分。首先需要仔細(xì)構(gòu)想場景,然后coding。如果沒有任何程度的復(fù)用,我們需要從頭為每個場景編寫一個sequence,這使得sequence難以維護(hù)和調(diào)試。sequence的編寫和調(diào)試是非常體現(xiàn)驗證工程師編碼能...

就我個人而言,我覺得編寫sequence是在驗證任何IP時最具挑戰(zhàn)性的部分。首先需要仔細(xì)構(gòu)想場景,然后coding。如果沒有任何程度的復(fù)用,我們需要從頭為每個場景編寫一個sequence,這使得sequence難以維護(hù)和調(diào)試。


sequence的編寫和調(diào)試是非常體現(xiàn)驗證工程師編碼能力的地方之一,如果每一個sequnce都有著完全不同的工作模式,那么維護(hù)起來非常痛苦。


網(wǎng)絡(luò)上有一個段子,程序員最討厭4件事情:

1、寫文檔

2、別人不寫文檔

3、寫注釋

4、別人不寫注釋


想象一下,如果你驗證同事離職,交接給你上百個定向且詭異的測試用例或者sequence?你會不會立馬想去重構(gòu)。


sequences 由多個事務(wù)激勵組成,在UVM中其繼承自參數(shù)化類uvm_sequence。通過這些事務(wù)觸發(fā)一些驗證工程師希望觸及的場景,而sequence的分層會創(chuàng)建一些更加復(fù)雜的場景激勵。驗證空間隨著設(shè)計規(guī)模指數(shù)級上升,驗證激勵自然也會越來越復(fù)雜。

class usb_simple_sequence extends uvm_sequence #(usb_transfer);rand int unsigned sequence_length;constraint reasonable_seq_len { sequence_length < 10 };//Constructorfunction new(string name=”usb_simple_bulk_sequence”);super.new(name);endfunction//Register with factory`uvm_object_utils(usb_simple_bulk_sequence)//the body() task is the actual logic of the sequencevirtual task body();repeat(sequence_length)`uvm_do_with(req, {//Setting the device_id to 2req.device_id == 8’d2;//Setting transfer type to BULKreq.type == usb_transfer::BULK_TRANSFER;})endtask : bodyendclass

在上面的sequence 中,我們試圖將發(fā)送多次id為2的事務(wù),在uvm_test中將該sequence指定為default sequence即可。

class usb_simple_bulk_test extends uvm_test;virtual function void build_phase(uvm_phase phase );uvm_config_db#(uvm_object_wrapper)::set(this, "sequencer_obj.main_phase","default_sequence", usb_simple_sequence::type_id::get());endfunction : build_phaseendclass
到目前為止,sequence看起來既簡單又直接。但是直接的代碼往往意味著麻煩的堆疊。為了確保sequence在更復(fù)雜的場景中重用,我們必須遵循一些準(zhǔn)則或者說代碼規(guī)范。


1、只在base sequence 類中的pre_start和post_start任務(wù)中raising objections和 dropping objections來管理測試用例的開始和結(jié)束。通過這種方式,能夠減少每一個sequence子類中的相關(guān)phase控制代碼。

task pre_start()if(starting_phase != null)starting_phase.raise_objection(this);endtask : pre_starttask post_start()if(starting_phase != null)starting_phase.drop_objection(this);endtask : post_start

需要注意的是,只有被定義為default sequence才會自動執(zhí)行starting_phase,否則就需要手動調(diào)用了。

class usb_simple_bulk_test extends uvm_test;usb_simple_sequence seq;virtual function void main_phase(uvm_phase phase );//User need to set the starting_phase as sequence start methodis explicitly called to invoke the sequenceseq.starting_phase = phase;seq.start();endfunction : main_phaseendclass

2、使用UVM configurations 機(jī)制從測試用例中獲取值。在上面的示例中,沒有給出控制sequence的按鈕,一些都靠sequence自身的隨機(jī),這對于擴(kuò)展用例非常不友好。我們可以對sequence做如下的修改,以提供更加精確的激勵控制。

class usb_simple_sequence extends uvm_sequence #(usb_transfer);rand int unsigned sequence_length;constraint reasonable_seq_len { sequence_length < 10 };virtual task body();usb_transfer::type_enum local_type;bit[7:0] local_device_id;//Get the values for the variables in case toplevel//test/sequence sets it.uvm_config_db#(int unsigned)::get(null, get_full_name(),“sequence_length”, sequence_length);uvm_config_db#(usb_transfer::type_enum)::get(null,get_full_name(), “l(fā)ocal_type”, local_type);uvm_config_db#(bit[7:0])::get(null, get_full_name(),?“l(fā)ocal_device_id”, local_device_id);repeat(sequence_length)`uvm_do_with(req, {req.device_id == local_device_id;req.type == local_type;})endtask : bodyendclass

通過上述修改,我們對測試用例進(jìn)行了控制,以配置device_id、sequence_length和type。

這里需要注意的是:

uvm_config_db#()::set中使用的參數(shù)類型和字符串(第三個參數(shù))應(yīng)該與

uvm_config_db#()::get中使用的類型相匹配,否則將無法正確配置。這個地方如果出錯會非常痛苦,但好在不需要經(jīng)常修改,痛苦一次就好。另外,這幾個配置項是隨機(jī)類型,相應(yīng)的配置值也需要滿足約束范圍。


3、在創(chuàng)建復(fù)雜sequence的時候盡量去復(fù)用簡單的sequence。例如,在下面的sequence 中順序發(fā)送不同的sequnce(層次化和模塊化,永遠(yuǎn)是編碼規(guī)范之一):

class usb_complex_sequence extends uvm_sequence #(usb_transfer);//Object of simple sequence used for sending bulk transferusb_simple_sequence simp_seq_bulk;//Object of simple sequence used for sending interrupt transferusb_simple_sequence simp_seq_int;virtual task body();//Variable for getting device_id for bulk transferbit[7:0] local_device_id_bulk;//Variable for getting device_id for interrupt transferbit[7:0] local_device_id_int;//Variable for getting sequence length for bulkint unsigned local_seq_len_bulk;//Variable for getting sequence length for interruptint unsigned local_seq_len_int;//Get the values for the variables in case top level//test/sequence sets it.uvm_config_db#(int unsigned)::get(null, get_full_name(),“l(fā)ocal_seq_len_bulk”,local_seq_len_bulk);uvm_config_db#(int unsigned)::get(null, get_full_name(),“l(fā)ocal_seq_len_int”,local_seq_len_int);uvm_config_db#(bit[7:0])::get(null, get_full_name(),“l(fā)ocal_device_id_bulk”,local_device_id_bulk);uvm_config_db#(bit[7:0])::get(null, get_full_name(),“l(fā)ocal_device_id_int”,local_device_id_int);//Set the values for the variables to the lowerlevel//sequence/sequence item, which we got from//above uvm_config_db::get.//Setting the values for bulk sequenceuvm_config_db#(int unsigned)::set(null, {get_full_name(),”.”,”simp_seq_bulk”}, “sequence_length”,local_seq_len_bulk);uvm_config_db#(usb_transfer::type_enum)::set(null, {get_full_name(),“.”,“simp_seq_bulk”} , “l(fā)ocal_type”,usb_transfer::BULK_TRANSFER);uvm_config_db#(bit[7:0])::set(null, {get_full_name(), “.”,”simp_seq_bulk”}, “l(fā)ocal_device_id”,local_device_id_bulk);//Setting the values for interrupt sequenceuvm_config_db#(int unsigned)::set(null, {get_full_name(),”.”,”simp_seq_int”}, “sequence_length”,local_ seq_len_int);uvm_config_db#(usb_transfer::type_enum)::set(null, {get_full_name(),“.”,“simp_seq_int”} , “l(fā)ocal_type”,usb_transfer::INT_TRANSFER);uvm_config_db#(bit[7:0])::set(null,{get_full_name(),“.”,”simp_seq_bulk”},“l(fā)ocal_device_id”,local_device_id_int);`uvm_do(simp_seq_bulk)simp_seq_bulk.get_response();`uvm_send(simp_seq_int)simp_seq_int.get_response();endtask : bodyendclass

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉