吴忠躺衫网络科技有限公司

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

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

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

UVM中add_typewide_sequence和add_sequence的區(qū)別

冬至子 ? 來源:CSDN ? 作者:谷公子 ? 2023-05-24 15:21 ? 次閱讀

我們在用uvm_sequence_library的時候,會遇到三種方式往uvm_sequence_library添加sequence,分別是:

  1. function void add_sequence(uvm_object_wrapper seq_type);
  2. function void add_typewide_sequence(uvm_object_wrapper seq_type);
  3. function void add_typewide_sequences(uvm_object_wrapper seq_types[$]);

第2和第3種方式類似,第3種是一下子添加多個sequence,它內(nèi)部原理就是調(diào)用第2種的函數(shù),因此在本質(zhì)上,只有第1和第2種這兩類區(qū)別。第1種方式是往sequences隊(duì)列里push sequences。第2種方式是往m_typewide_sequences隊(duì)列里push sequences。sequences和m_typewide_sequences的定義如下,它們都是uvm_object_wrapper類型,因此sequence在push的時候,要采用sequence_name::get_type()的方式加入。

protected uvm_object_wrapper sequences[$];
static protected uvm_object_wrapper m_typewide_sequences[$];

下面分別說下兩種push有何不同。

1. add_sequence(uvm_object_wrapper seq_type)

它的代碼如下:

function void add_sequence(uvm_object_wrapper seq_type);
  if (m_dyn_check(seq_type))
    sequences.push_back(seq_type);
endfunction

可以看出add_sequence(xxx)函數(shù)很簡單,就是往sequences隊(duì)列里push sequence的uvm_object_wrapper類型。

在m_dyn_check(xxx)函數(shù)里會檢查push進(jìn)來的sequence不能是非uvm_sequence_base類型的,且不能重復(fù)。只有都不滿足以上兩者條件,才能被push進(jìn)sequences隊(duì)列里。而且我們根據(jù)sequences隊(duì)列的定義可以看出,它沒有帶static修飾,也就是說,uvm_sequence_library例化多份instance的話,它也會跟著被例化多份,多個instance里的sequences隊(duì)列互不共享。這一點(diǎn)是和m_typewide_sequences隊(duì)列有著本質(zhì)區(qū)別的。

function bit m_dyn_check(uvm_object_wrapper seq_type);
  if (!m_check(seq_type,this))
    return 0;
  foreach (sequences[i])
    if (sequences[i] == seq_type)
      return 0;
  return 1;
endfunction

m_check(xxx)函數(shù)定義如下,它就是單純的判斷seq_type,如果seq_type是uvm_sequence_base類型的,就返回1,否則返回0。

function bit m_check(uvm_object_wrapper seq_type, this_type lib);
  uvm_object obj;
  uvm_sequence_base seq;
  uvm_root top;
  string name;
  string typ;
  obj = seq_type.create_object();
  name = (lib == null) ? type_name : lib.get_full_name();
  typ = (lib == null) ? type_name : lib.get_type_name();
  top = uvm_root::get();
 
  if (!$cast(seq, obj)) begin
    `uvm_error_context("SEQLIB/BAD_SEQ_TYPE",
        {"Object '",obj.get_type_name(),
        "' is not a sequence. Cannot add to sequence library '",name,
        "'"},top)
     return 0;
  end
  return 1;
endfunction

2. add_typewide_sequence(uvm_object_wrapper seq_type)

它的代碼如下:

static function void add_typewide_sequence(uvm_object_wrapper seq_type);
  if (m_static_check(seq_type))
    m_typewide_sequences.push_back(seq_type);
endfunction

可以看出add_typewide_sequence(xxx)函數(shù)也很簡單,就是往m_typewide_sequences隊(duì)列里push sequence的uvm_object_wrapper類型。

m_static_check(xxx)函數(shù)和m_dyn_check(xxx)函數(shù)類似,這里面會檢查push進(jìn)來的sequence不能是非uvm_sequence_base類型的,且不能重復(fù)。只有都不滿足以上兩者條件,才能被push進(jìn)m_typewide_sequences隊(duì)列里。

function bit m_static_check(uvm_object_wrapper seq_type);
  if (!m_check(seq_type,null))
    return 0;
  foreach (m_typewide_sequences[i])
    if (m_typewide_sequences[i] == seq_type)
      return 0;
  return 1;
endfunction

從m_typewide_sequences隊(duì)列和add_typewide_sequence(xxx)函數(shù)的定義我們可以看出,它們都是static類型的,也就是就算uvm_sequence_library有多份不同的instances,m_typewide_sequences在它們之間是共享的。因此,放在m_typewide_sequences隊(duì)列里的sequences是打算被多個uvm_sequence_library(包含從它擴(kuò)展出的子類libraries)共享的話,就可以用add_typewide_sequence(xxx)函數(shù)把它們加入到m_typewide_sequences隊(duì)列里。如果要被某個uvm_sequence_library私自獨(dú)享的話,就需要用add_sequence(xxx)函數(shù)把它們加入到sequences隊(duì)列中。

3. 注意事項(xiàng)

在uvm_sequence_library調(diào)用new(xxx)函數(shù)例化的時候,會自動調(diào)用init_sequence_library()函數(shù),這個函數(shù)的定義如下:

function void init_sequence_library();
  foreach (this_type::m_typewide_sequences[i])
    sequences.push_back(this_type::m_typewide_sequences[i]);
endfunction

init_sequence_library()函數(shù)會自動把m_typewide_sequences隊(duì)列里的內(nèi)容復(fù)制到sequences隊(duì)列里,因?yàn)閡vm_sequence_library隨機(jī)選擇sequence時看的是sequences隊(duì)列里的sequence。

因此大家要注意的是,如果在uvm_sequence_library例化之前,通過uvm_sequence_library::add_typewide_sequence(xxx)方式放到m_typewide_sequences隊(duì)列里的sequences會自動也復(fù)制到sequences隊(duì)列里。但如果是在uvm_sequence_library例化之后,才調(diào)用add_typewide_sequence(xxx)方式放到m_typewide_sequences隊(duì)列里的sequences,需要自己再調(diào)用下init_sequence_library()函數(shù)。

下面是一段UVM的例子,selection_mode為UVM_SEQ_LIB_RAND,它會按平均權(quán)重隨機(jī)在sequences隊(duì)列挑出sequence。

UVM_SEQ_LIB_RAND: begin
        valid_rand_selection.constraint_mode(1);
        valid_sequence_count.constraint_mode(0);
        for (int i=1; i<=sequence_count; i++) begin
          if (!randomize(select_rand)) begin
            `uvm_error("SEQLIB/RAND_FAIL", "Random sequence selection failed")
            break;
          end
          else begin
            wrap = sequences[select_rand];
          end
          execute(wrap);
        end
        valid_rand_selection.constraint_mode(0);
        valid_sequence_count.constraint_mode(1);
      end

下面是另一段UVM的例子,selection_mode為UVM_SEQ_LIB_USER,也是用戶可以自動的方式。因此用戶需要select_sequence(xxx)函數(shù)來完成自己挑選算法

UVM_SEQ_LIB_USER: begin
        for (int i=1; i<=sequence_count; i++) begin
          int user_selection;
          user_selection = select_sequence(sequences.size()-1);
          if (user_selection >= sequences.size()) begin
            `uvm_error("SEQLIB/USER_FAIL", "User sequence selection out of range")
            wrap = REQ::get_type();
          end
          else begin
            wrap = sequences[user_selection];
          end
          execute(wrap);
        end
      end

select_sequence(xxx)函數(shù)定義如下,用戶用systemverilog語法的virtual override就可以實(shí)現(xiàn)自定義挑選sequence的算法了。

function int unsigned select_sequence(int unsigned max);
  static int unsigned counter;
  select_sequence = counter;
  counter++;
  if (counter >= max)
    counter = 0;
endfunction
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Verilog
    +關(guān)注

    關(guān)注

    28

    文章

    1351

    瀏覽量

    110400
  • UVM
    UVM
    +關(guān)注

    關(guān)注

    0

    文章

    182

    瀏覽量

    19231
  • sequence
    +關(guān)注

    關(guān)注

    0

    文章

    23

    瀏覽量

    2863
收藏 人收藏

    評論

    相關(guān)推薦

    UVM sequence分層有哪幾種方式呢

    種請求下可以使用第一種分層方式,在high-layer sequence依然使用low-layer sequencer進(jìn)行驅(qū)動,同時對low-layer sequence進(jìn)行更加精細(xì)化的控制
    發(fā)表于 04-11 16:37

    UVM sequence分層的幾種體現(xiàn)

    種請求下可以使用第一種分層方式,在high-layer sequence依然使用low-layer sequencer進(jìn)行驅(qū)動,同時對low-layer sequence進(jìn)行更加精細(xì)化的控制。在上面
    發(fā)表于 04-14 11:08

    如何配置sequence的仲裁算法和優(yōu)先級及中斷sequence的執(zhí)行

    01 Arbitrary在UVM,多個sequence可以同時被綁定到相同的sequencer并啟動。這種測試場景在實(shí)際是存在的,比如在模擬同一個總線master口上的不同類型的數(shù)
    發(fā)表于 09-23 14:35

    sequence item實(shí)際應(yīng)用應(yīng)該包含哪些東西

    展開。Sequence item是游走在Sequence-Sequencer-Driver這一基本結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu)類型,在有些地方也直接叫transaction,可以說是UVM的必用品
    發(fā)表于 09-23 14:42

    UVMseq.start()和default_sequence執(zhí)行順序

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

    淺談UVMsequence/item見解(上)

    item指的是uvm_sequence_item, Sequence Item具備UVM核心基類所必要的數(shù)據(jù)操作方法,對于激勵的生成和場景控制,是由sequence來編織的,item應(yīng)
    的頭像 發(fā)表于 02-19 15:52 ?5096次閱讀
    淺談<b class='flag-5'>UVM</b>之<b class='flag-5'>sequence</b>/item見解(上)

    如何在定義后啟動一個sequence

    激勵最初產(chǎn)生在driver,后來產(chǎn)生在sequence。為什么會有這個過程呢?
    的頭像 發(fā)表于 09-09 09:41 ?1075次閱讀

    UVM sequence機(jī)制response的簡單使用

    sequence作為UVM幾個核心機(jī)制之一,它有效地將transaction的產(chǎn)生從driver剝離出來,并且通過和sequencer相互配合,成功地將driver的負(fù)擔(dān)降低至僅聚焦于根據(jù)協(xié)議將
    的頭像 發(fā)表于 09-22 09:26 ?2499次閱讀

    start()如何執(zhí)行uvm_sequence

    要使用start()啟動一個sequence,就必須要指定相應(yīng)的sequencer句柄, **另外的幾個選項(xiàng)一般用不上** 。其中
    的頭像 發(fā)表于 03-21 11:37 ?739次閱讀
    start()如何執(zhí)行<b class='flag-5'>uvm_sequence</b>

    如何配置sequence的仲裁算法和優(yōu)先級?

    UVM,多個sequence可以同時被綁定到相同的sequencer并啟動。這種測試場景在實(shí)際是存在的,比如在模擬同一個總線master口上的不同類型的數(shù)據(jù)流時
    的頭像 發(fā)表于 04-27 15:20 ?1437次閱讀
    如何配置<b class='flag-5'>sequence</b>的仲裁算法和優(yōu)先級?

    UVMsequence的那些事兒

    將 生成測試case的語句 從 main_phase 獨(dú)立出來,使得使用不同測試用例時,只需要修改sequence部分即可,而不用關(guān)注 UVM剩余部分。
    的頭像 發(fā)表于 05-26 15:17 ?1156次閱讀
    <b class='flag-5'>UVM</b><b class='flag-5'>中</b><b class='flag-5'>sequence</b>的那些事兒

    UVMuvm_do宏簡析

    uvm_do宏及其變體提供了創(chuàng)建、隨機(jī)化和發(fā)送transaction items或者sequence的方法。
    的頭像 發(fā)表于 06-09 09:36 ?5173次閱讀
    <b class='flag-5'>UVM</b><b class='flag-5'>中</b>的<b class='flag-5'>uvm</b>_do宏簡析

    在Sequencer上啟動一個Sequence

    Sequencer默認(rèn)不執(zhí)行任何Sequence。驗(yàn)證工程師可以通過調(diào)用start()啟動一個Sequence,也可以通過uvm_config_db指定一個自動啟動的Sequence
    的頭像 發(fā)表于 06-10 09:10 ?862次閱讀
    在Sequencer上啟動一個<b class='flag-5'>Sequence</b>

    UVM設(shè)計sequence啟動方式有哪幾種呢?

    本篇介紹UVMsequence,這是UVM中最基礎(chǔ)的部分。對于前面介紹的uvm_callback,
    的頭像 發(fā)表于 08-17 10:07 ?4720次閱讀
    <b class='flag-5'>UVM</b>設(shè)計<b class='flag-5'>中</b>的<b class='flag-5'>sequence</b>啟動方式有哪幾種呢?

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

    uvm_sequence_library是從uvm_sequence擴(kuò)展而來的,它是一個容納了一系列其它sequences類型的容器,在啟動時,它會根據(jù)模式從這系列sequences中選擇并執(zhí)行它們。
    的頭像 發(fā)表于 09-08 15:06 ?691次閱讀
    如何將sequences類型添加或注冊到<b class='flag-5'>sequence</b> library里呢?
    上海百家乐官网的玩法技巧和规则 | 百家乐官网路单生| 北京太阳城国际老年公寓| 太阳城申博娱乐城| 百家乐官网真人游戏投注网 | 百家乐官网最新投注法| 百家乐分析概率原件| 青龙| 百家乐现场新全讯网| 汕尾市| 百家乐对冲套红利| 十六蒲娱乐城| 百家乐5式直缆打法| 宝坻区| 百家乐真人娱乐平台| 玩百家乐官网最好方法| 盛大百家乐的玩法技巧和规则| 辽源市| 尊龙百家乐娱乐平台| 什么百家乐官网平注法| 玩百家乐去哪个娱乐城最安全| 最好的百家乐博彩公司| 盈禾体育| 金臂百家乐开户送彩金| 百家乐官网稳赢赌法| 百家乐特殊技巧| 百家乐官网免佣台| 大发888娱乐登录| 属火的在属土的方向做生意好不好| 现金游戏平台| 百家乐上海代理| 网上百家乐官网靠谱吗| 百家乐必赢| 888百家乐官网的玩法技巧和规则 大发百家乐官网的玩法技巧和规则 | 出国| 威尼斯人娱乐网官网| 吉利百家乐官网的玩法技巧和规则| 皇家金堡娱乐城| 百家乐怎么做弊| 蜀都棋牌游戏大厅| 网络百家乐游赌博|