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

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

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

如何在生成的代碼中使用UVM Register Layer?

芯片驗證工程師 ? 來源:芯片驗證工程師 ? 2023-06-05 14:14 ? 次閱讀

Acquire a Register Model

寄存器模型一般可以使用工具生成或者從頭開始編寫,寄存器模型示例如下:

Filename regmodel.sv
class dummy_reg extends uvm_reg;
`uvm_object_utils(dummy_reg)


rand uvm_reg_field F;
...
virtual function void build();
F = uvm_reg_field::create("F");
F.configure(this, 8, 0, "RW", 1, 8'h00, 1, 1, 1);
endfunction
endclass




class bus_reg_block extends uvm_reg_block;
`uvm_object_utils(bus_reg_block)


rand dummy_reg reg0;
uvm_reg_map bus_map;
...
virtual function void build();
reg0 = dummy_reg::create("reg0");
reg0.configure(this);
reg0.build();


bus_map = create_map("bus_map", 'h0, 1, UVM_LITTLE_ENDIAN);
default_map = bus_map;
bus_map.add_reg(reg0, 'h0, "RW");
lock_model();
endfunction
endclass




class top_reg_block extends uvm_reg_block;
`uvm_object_utils(top_reg_block)


bus_reg_block bus;
uvm_reg_map bus_map;
...
virtual function void build();
bus = bus_reg_block::create("bus");
bus.configure(this);
bus.build();


bus_map = create_map("bus_map", 'h0, 1, UVM_LITTLE_ENDIAN);
default_map = bus_map;
bus_map.add_submap(bus.bus_map, 'h0);
lock_model();
endfunction
endclass

Add Register Access to the Interface Template File

我們從interface template file的主要部分開始,其中指定了事務接口中的變量。為了使示例簡單,我們省略monitor和focv,只包含driver。


Filename bus.tpl
agent_name = bus
trans_item = bus_tx
trans_var  = rand bit cmd;
trans_var  = rand byte addr;
trans_var  = rand byte data;


driver_inc = bus_do_drive.sv


if_port  = logic clk;
if_port  = bit  cmd;
if_port  = byte addr;
if_port  = byte data;
if_clock = clk

現(xiàn)在,我們通過指定register layer具有的訪問類型以及寄存器層和agent之間的映射來擴展interface template file。這是通過標識register layer用于讀取和寫入 DUT 中的寄存器的command, address和data:

reg_access_mode       = WR
reg_access_block_type = bus_reg_block


uvm_reg_kind    = cmd
uvm_reg_addr    = addr
uvm_reg_data    = data


reg_access_mode指定是否允許register layer對寄存器進行寫/讀(WR)、只寫 (WO) 或只讀 (RO) 訪問。

reg_access_block_type在寄存器模型文件中指定 uvm_reg_block 類型,該文件包含要讀取或?qū)懭氲募拇嫫鳌?/p>

Add Register Access to the Common Template File

top-level register model必須在common template file中向uvm代碼生成器描述:

Filename common.tpl
regmodel_file      = regmodel.sv
top_reg_block_type = top_reg_block

top_reg_block_type參數(shù)必須為top-level register model的類名。

Generate and Run

uvm代碼生成器將創(chuàng)建以下結(jié)構(gòu):

top_tb (module)
 ? top_th (module instance)
   ? bus_if (interface instance)
     mydut (module instance)


 ? top_test (object, class uvm_test)
    ? top_config (created in build_phase, class uvm_object)
      top_env (uvm_env)
       ? bus_env_config (uvm_object)
         top_reg_block (uvm_reg_block)
         bus_env (uvm_env)
          ? bus_config (uvm_object)
            bus_reg_block (uvm_reg_block)
            reg2bus_adapter
            uvm_reg_predictor
            bus_agent (uvm_agent)
             ? bus_sequencer
               bus_driver (uvm_driver)
               bus_monitor (uvm_monitor)
            bus_coverage (uvm_subscriber)
            bus_env_coverage (uvm_subscriber)


       ? top_default_seq (created in run_phase, class uvm_sequence)
          ? bus_env_default_seq (uvm_sequence)
             ? registers.update()

實例化register model時,使用register model的每個agent都在其自己的 env 中實例化。在上面的結(jié)構(gòu)中,可以看到:

top_test
  instantiates top_env
    instantiates bus_env
      instantiates bus_agent

top_env具有對top-level register blocktop_reg_block的引用,registermodel就是在這個層次實例化的。

bus_env引用該agent的register modelbus_reg_block,并實例化adapter和predictor,該adapter和predictor將該registermodel連接到agent。

uvm代碼生成器在使用registermodel的default sequence中向相應registermodel中的每個寄存器寫入一個隨機值。

Filenamebus_env_seq_lib.sv


task bus_env_default_seq::body();
  super.body();
  `uvm_info(get_type_name(), "default sequence starting", UVM_HIGH)
  regmodel.get_registers(data_regs);
  data_regs.shuffle();
  foreach(data_regs[i])
    begin
      // Randomize register content and then update
      if(!data_regs[i].randomize())
        `uvm_error(get_type_name(), $sformatf("Randomization error for data_regs[%0d]", i))
      data_regs[i].update(status, .path(UVM_FRONTDOOR), .parent(this));
    end
  `uvm_info(get_type_name(), "default sequence completed", UVM_HIGH)
endtask : body

添加用戶定義的寄存器sequence

與前面的文章一樣,可以通過擴展uvm代碼生成器創(chuàng)建的default sequence來創(chuàng)建自己的sequence。這次它是一個專門的register sequence:

Filenamebus_env_reg_seq.sv


class bus_env_reg_seq extends bus_env_default_seq;
  `uvm_object_utils(bus_env_reg_seq)
  ...
  task body();
     regmodel.reg0.write(status, .value('hab), .parent(this));
     assert(status == UVM_IS_OK);


     regmodel.reg0.write(status, .value('hcd), .parent(this));
     assert(status == UVM_IS_OK);


     regmodel.reg0.write(status, .value('hef), .parent(this));
     assert(status == UVM_IS_OK);


     regmodel.reg0.read(status, .value(data), .parent(this));
     assert(status == UVM_IS_OK);
  endtask: body
endclass : bus_env_reg_seq

同樣需要在interface template file添加factory override:

Filenamebus.tpl
...
reg_seq_inc       = bus_env_reg_seq.sv
agent_factory_set = bus_env_default_seq  bus_env_reg_seq

然后可以對生成的現(xiàn)成代碼運行仿真,應該看到仿真日志中包含以下打印信息

# @10000 mydut bus_cmd = W, bus_addr = 00, bus_data = ab
# @30000 mydut bus_cmd = W, bus_addr = 00, bus_data = cd
# @50000 mydut bus_cmd = W, bus_addr = 00, bus_data = ef
# @70000 mydut bus_cmd = R, bus_addr = 00, bus_data = 00





審核編輯:劉清

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

    關(guān)注

    31

    文章

    5302

    瀏覽量

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

    關(guān)注

    0

    文章

    181

    瀏覽量

    19122
  • 生成器
    +關(guān)注

    關(guān)注

    7

    文章

    313

    瀏覽量

    20958
  • DUT
    DUT
    +關(guān)注

    關(guān)注

    0

    文章

    189

    瀏覽量

    12314

原文標題:Easier UVM Code Generator Part 3:添加Register Layer

文章出處:【微信號:芯片驗證工程師,微信公眾號:芯片驗證工程師】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    IC驗證之UVM常用宏匯總分析(四)

    UVM_REG_ADDR_WIDTH 64源代碼 :`ifndef UVM_REG_DATA_WIDTH`define UVM_REG_DATA_WIDTH 64`endif自定義字
    發(fā)表于 12-02 15:24

    UVM ral register在UVC中使用注意事項

    在UVC中使用RAL中的register
    發(fā)表于 12-18 06:35

    何在simv sim_opts中使uvm_set_verbosity

    -uvm_set_verbosity本文只介紹如何在simv sim_opts中使uvm_set_verbosity。
    發(fā)表于 12-18 06:42

    UVM sequence分層有哪幾種方式呢

    ,我們隨機生成了包含多個lower_env_item的數(shù)組upper_env_item_seq,然后分別進行發(fā)送。同樣一個例子,我們也可以使用多個sequencer(high-layer
    發(fā)表于 04-11 16:37

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

    的例子中,我們隨機生成了包含多個lower_env_item的數(shù)組upper_env_item_seq,然后分別進行發(fā)送。同樣一個例子,我們也可以使用多個sequencer(high-layer
    發(fā)表于 04-14 11:08

    基于UVM代碼生成器的開發(fā)設計

    不一相互矛盾的UVM代碼。對于這些問題UVM 代碼生成器基本都可以解決,更為關(guān)鍵的是,這對于項目的開發(fā)效率提高也是一件極有意義的事情。 簡單
    發(fā)表于 09-15 17:18 ?22次下載
    基于<b class='flag-5'>UVM</b>的<b class='flag-5'>代碼</b><b class='flag-5'>生成</b>器的開發(fā)設計

    何在生產(chǎn)時防止代碼泄漏

    的,本文將介紹如何在生產(chǎn)時防止代碼泄漏。 有很多企業(yè)在產(chǎn)品研發(fā)完成后,一般選擇代工廠進行批量生產(chǎn),代碼的安全性尤為重要。為了避免工廠直接接觸代碼,一般會在編程器上建立加密工程,對燒錄文
    發(fā)表于 01-26 01:05 ?383次閱讀
    如<b class='flag-5'>何在生</b>產(chǎn)時防止<b class='flag-5'>代碼</b>泄漏

    何在java代碼中使用HTTP代理IP

    何在java代碼中使用HTTP代理IP。
    的頭像 發(fā)表于 08-04 15:38 ?2179次閱讀

    何在python代碼中使用HTTP代理IP

    何在python代碼中使用HTTP代理IP。
    的頭像 發(fā)表于 08-04 15:46 ?1243次閱讀

    何在PHP代碼中使用HTTP代理IP

    何在PHP代碼中使用HTTP代理IP。
    的頭像 發(fā)表于 08-04 16:08 ?2401次閱讀

    何在易e語言代碼中使用HTTP代理IP

    何在易e語言代碼中使用HTTP代理IP,示例代碼demo直接可用(步驟注釋清晰)
    的頭像 發(fā)表于 08-05 16:29 ?6812次閱讀

    何在c語言代碼中使用HTTP代理IP

    何在c語言代碼中使用HTTP代理IP,示例代碼demo直接可用(步驟注釋清晰)
    的頭像 發(fā)表于 08-05 16:31 ?2302次閱讀

    何在c#語言代碼中使用HTTP代理IP

    何在c#語言代碼中使用HTTP代理IP,示例代碼demo直接可用(步驟注釋清晰)
    的頭像 發(fā)表于 08-05 16:33 ?2547次閱讀

    何在python代碼中使用HTTP代理IP

    如何再python代碼中使用HTTP代理IP。
    的頭像 發(fā)表于 09-13 09:25 ?968次閱讀

    個性化地定制自己的uvm代碼生成器模板和腳本

    使用uvm代碼生成器創(chuàng)建基本的uvm驗證環(huán)境框架,然后丟棄代碼生成器模板并擴展和維護
    的頭像 發(fā)表于 05-14 16:51 ?1975次閱讀
    個性化地定制自己的<b class='flag-5'>uvm</b><b class='flag-5'>代碼</b><b class='flag-5'>生成</b>器模板和腳本