色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

UVM Sequences 復(fù)用程度的3大準(zhǔn)則

jf_78858299 ? 來源:芯片驗(yàn)證工程師 ? 作者:驗(yàn)證哥布林 ? 2023-03-21 11:31 ? 次閱讀

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

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

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

1、寫文檔

2、別人不寫文檔

3、寫注釋

4、別人不寫注釋

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

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

|

class usb_simple_sequence extends uvm_sequence #(usb_transfer);
rand int unsigned sequence_length;
constraint reasonable_seq_len { sequence_length < 10 };
//Constructor
function 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 sequence
virtual task body();
repeat(sequence_length)
`uvm_do_with(req,  {
//Setting the device_id to 2
req.device_id == 8’d2;
//Setting transfer type to BULK
req.type == usb_transfer::BULK_TRANSFER;
})
endtask : body
endclass

在上面的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_phase
endclass

到目前為止,sequence看起來既簡單又直接。但是 直接的代碼往往意味著麻煩的堆疊。 為了確保sequence在更復(fù)雜的場景中重用,我們必須遵循一些準(zhǔn)則或者說代碼規(guī)范。

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

|

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

需要注意的是,只有被定義為default sequence才會(huì)自動(dòng)執(zhí)行starting_phase,否則就需要手動(dòng)調(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 method
is explicitly called to invoke the sequence
seq.starting_phase = phase;
seq.start();
…
endfunction : main_phase
endclass

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

|

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 : body
endclass

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

這里需要注意的是:

uvm_config_db#()::set

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

uvm_config_db#()::get

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

3、在創(chuàng)建復(fù)雜sequence的時(shí)候盡量去復(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 transfer
usb_simple_sequence simp_seq_bulk;
//Object of simple sequence used for sending interrupt transfer
usb_simple_sequence simp_seq_int;
…
virtual task body();
//Variable for getting device_id for bulk transfer
bit[7:0] local_device_id_bulk;
//Variable for getting device_id for interrupt transfer
bit[7:0] local_device_id_int;
//Variable for getting sequence length for bulk
int unsigned local_seq_len_bulk;
//Variable for getting sequence length for interrupt
int 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 sequence
uvm_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 sequence
uvm_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 : body
endclass
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • UVM
    UVM
    +關(guān)注

    關(guān)注

    0

    文章

    182

    瀏覽量

    19184
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4791

    瀏覽量

    68686
  • Coding
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    6447
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    什么是3σ準(zhǔn)則

    。當(dāng)上述理由不明確時(shí),可用相關(guān)標(biāo)準(zhǔn)規(guī)定的方法。 3σ準(zhǔn)則是建立在正態(tài)分布的等精度重復(fù)測量基礎(chǔ)上的一種常用手段。假設(shè)一組數(shù)據(jù)只含有隨機(jī)誤差,對(duì)其進(jìn)行計(jì)算處理得到標(biāo)準(zhǔn)偏差,按一定概率確定一個(gè)區(qū)間,認(rèn)為凡超過
    發(fā)表于 09-08 07:49

    數(shù)字IC驗(yàn)證之“什么是UVM”“UVM的特點(diǎn)”“UVM提供哪些資源”(2)連載中...

    原文鏈接:https://zhuanlan.zhihu.com/p/345775995大家好,我是一哥,上章內(nèi)容主要講述兩個(gè)內(nèi)容,芯片驗(yàn)證以及驗(yàn)證計(jì)劃。那本章我們主要講述的內(nèi)容有介紹什么是uvm
    發(fā)表于 01-21 16:00

    什么是uvm?uvm的特點(diǎn)有哪些呢

    大家好,我是一哥,上章內(nèi)容我們介紹什么是uvmuvm的特點(diǎn)以及uvm為用戶提供了哪些資源?本章內(nèi)容我們來看一看一個(gè)典型的uvm驗(yàn)證平臺(tái)應(yīng)該是什么樣子的,來看一個(gè)典型的
    發(fā)表于 02-14 06:46

    請(qǐng)問一下在UVM中的UVMsequences是什么意思啊

    UVM方法學(xué)中,UVMsequences 是壽命有限的對(duì)象。UVM sequencesuvm_sequence_item基類擴(kuò)展得到,uvm
    發(fā)表于 04-11 16:43

    談?wù)?b class='flag-5'>UVM中的uvm_info打印

    _severity  {  UVM_INFO,  UVM_WARNING,  UVM_ERROR,  UVM_FATAL  } uvm_se
    發(fā)表于 03-17 16:41

    UVM中seq.start()和default_sequence執(zhí)行順序

      1. 問題  假如用以下兩種方式啟動(dòng)sequence,方法1用sequence的start()方法啟動(dòng)seq1,方法2用UVM的default_sequence機(jī)制啟動(dòng)seq2。那么seq1
    發(fā)表于 04-04 17:15

    Programming Sequences and Tips

    software programming sequences are crucial during the TSC initialization and data reading and are also helpful during the TSC mode cha
    發(fā)表于 06-10 10:53 ?37次下載

    集成級(jí)的UVM寄存器模型

    UVM使得驗(yàn)證測試平臺(tái)的結(jié)構(gòu)得以標(biāo)準(zhǔn)化,各種復(fù)用策略及標(biāo)準(zhǔn)對(duì)于提高驗(yàn)證質(zhì)量、縮短項(xiàng)目周期都非常有效。垂直重用是常見的復(fù)用策略之一,即同一項(xiàng)目測試平臺(tái)復(fù)用于不同驗(yàn)證層次。驗(yàn)證中常將最底層
    發(fā)表于 09-15 11:49 ?16次下載
    集成級(jí)的<b class='flag-5'>UVM</b>寄存器模型

    UVM驗(yàn)證平臺(tái)執(zhí)行硬件加速

    UVM已經(jīng)成為了一種高效率的、從模塊級(jí)到系統(tǒng)級(jí)完整驗(yàn)證環(huán)境開發(fā)標(biāo)準(zhǔn),其中一個(gè)關(guān)鍵的原則是UVM可以開發(fā)出可重用的驗(yàn)證組件。獲得重用動(dòng)力的一個(gè)方面表現(xiàn)為標(biāo)準(zhǔn)的仿真器和硬件加速之間的驗(yàn)證組件和環(huán)境的復(fù)用
    發(fā)表于 09-15 17:08 ?14次下載
    <b class='flag-5'>UVM</b>驗(yàn)證平臺(tái)執(zhí)行硬件加速

    UVM學(xué)習(xí)筆記(一)

    driver應(yīng)該派生自uvm_driver,而uvm_driver派生自uvm_component。
    的頭像 發(fā)表于 05-26 14:38 ?1406次閱讀
    <b class='flag-5'>UVM</b>學(xué)習(xí)筆記(一)

    UVM里的6個(gè)常見參數(shù)介紹分析

    UVM預(yù)先定義了六個(gè)詳細(xì)程度; UVM_NONE到UVM_DEBUG。這些級(jí)別只不過是整數(shù)枚舉值
    的頭像 發(fā)表于 06-06 12:33 ?4469次閱讀
    <b class='flag-5'>UVM</b>里的6個(gè)常見參數(shù)介紹分析

    UVMuvm_config_db機(jī)制背后的大功臣

    本次講一下UVM中的uvm_config_db,在UVM中提供了一個(gè)內(nèi)部數(shù)據(jù)庫,可以在其中存儲(chǔ)給定名稱下的值,之后可以由其它TB組件去檢索。
    的頭像 發(fā)表于 06-20 17:28 ?1442次閱讀

    UVMuvm_config_db機(jī)制背后的大功臣

    本次講一下UVM中的uvm_config_db,在UVM中提供了一個(gè)內(nèi)部數(shù)據(jù)庫,可以在其中存儲(chǔ)給定名稱下的值,之后可以由其它TB組件去檢索。
    的頭像 發(fā)表于 06-29 16:57 ?1321次閱讀

    一文詳解UVM設(shè)計(jì)模式

    本篇是對(duì)UVM設(shè)計(jì)模式 ( 二 ) 參數(shù)化類、靜態(tài)變量/方法/類、單例模式、UVM_ROOT、工廠模式、UVM_FACTORY[1]中單例模式的補(bǔ)充,分析靜態(tài)類的使用,UVM中資源池的
    的頭像 發(fā)表于 08-06 10:38 ?1871次閱讀
    一文詳解<b class='flag-5'>UVM</b>設(shè)計(jì)模式

    如何將sequences類型添加或注冊到sequence library里呢?

    uvm_sequence_library是從uvm_sequence擴(kuò)展而來的,它是一個(gè)容納了一系列其它sequences類型的容器,在啟動(dòng)時(shí),它會(huì)根據(jù)模式從這系列sequences
    的頭像 發(fā)表于 09-08 15:06 ?656次閱讀
    如何將<b class='flag-5'>sequences</b>類型添加或注冊到sequence library里呢?
    主站蜘蛛池模板: 日本毛片久久国产精品| 先锋影音 av| 超碰97免费人妻| vidosgratis tv少女| TIMI1TV天美传媒在线观看| 纯肉巨黄H爆粗口男男分卷阅读| 高清mv视频免费观看| 国产一区精选播放022| 国产精品亚洲AV毛片一区二区三区 | 国产亚洲精品97在线视频一| 国产MD视频一区二区三区| 国产精品青青青高清在线密亚| 国产亚洲精品久久久久久无码网站| 精品三级久久久久电影网1| 花蝴蝶免费观看影视| 久久爽狠狠添AV激情五月| 男人私gay挠脚心vk视频| 日韩一级精品久久久久| 日韩 亚洲 欧美 中文 高清| 午夜免费小视频| 伊人久久大香线蕉综合高清| 99热最新网站| 国产乱国产乱老熟300部视频| 久久re热在线视频精6| 9国产露脸精品国产麻豆| 被爽到叫呻呤视频免费视频| 国产午夜高潮熟女精品AV| 久久亚洲精品AV成人无| 青青草A在在观免费线观看| 亚洲精品AV无码永久无码| 西西人体一级裸片| 中文字幕本庄优花喂奶| 最近中文字幕完整版免费| 玉林天天论坛| 中文字幕亚洲乱码熟女在线萌芽 | 色欲精品久久人妻AV中文字幕| 亚洲偷偷自拍免费视频在线| 夜夜国产亚洲视频香蕉| xxxx69日本| 精品AV亚洲乱码一区二区| 欧美精品色视频|