0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Easier UVM Code Generator Part 1: 运行仿真

芯片验证工程师 来源:芯片验证工程师 2023-05-19 09:18 次阅读

在运行uvm代码生成器后,我们现在可以开始运行仿真。同样,我们将命令行放入脚本文件中:

Filename runius
cd generated_tb/sim
compile_ius.sh


Filename runquesta
cd generated_tb/sim
vsim -c -do "do compile_questa.do; run -all"


Filename runvcs
cd generated_tb/sim
compile_vcs.sh


Filename runriviera
cd generated_tb/sim
vsimsa -do compile_riviera.do
./sim目录包含运行CadenceMentor,Synopsys等仿真器的脚本。 生成的验证环境将运行仅生成单个transaction的sequence,因此在仿真日志中,应该会看到来自clkndata_driver的UVM_INFO消息,其中打印出transaction中数据字段的值,如下所示:
# UVM_INFO ../tb/clkndata/sv/clkndata_driver.sv(47) @ 0: uvm_test_top.m_env.m_clkndata_agent.m_driver [clkndata_driver] req item 
# vseq.seq.req 
# data = f4
但是,你不会看到从 DUT 打印出此数据值($display(“mydut data = %h”, data);参考前文中DUT的代码),因为我们尚未提供driver的实现,因此尽管driver正在从sequencer接收事务,但它实际上并没有驱动DUT接口

`ifndef CLKNDATA_DRIVER_SV
`define CLKNDATA_DRIVER_SV
//Youcaninsertcodeherebysettingdriver_inc_before_classinfileclkndata.tpl
classclkndata_driverextendsuvm_driver#(data_tx);
`uvm_component_utils(clkndata_driver)
virtualclkndata_ifvif;
clkndata_configm_config;
externfunctionnew(stringname,uvm_componentparent);
//Youcaninsertcodeherebysettingdriver_inc_inside_classinfileclkndata.tpl
endclass:clkndata_driver
function clkndata_driver::new(string name, uvm_component parent);
super.new(name, parent);
endfunction:new
//Youcaninsertcodeherebysettingdriver_inc_after_classinfileclkndata.tpl
`endif//CLKNDATA_DRIVER_SV
实现driver

为了驱动DUT的接口,我们需要完成driver的实现。为此,我们可以提供driver需要调用的任务代码,然后在template files指示uvm代码生成器包含我们的任务。
Filename include/clkndata_do_drive.sv
task clkndata_driver::do_drive(); 
  vif.data <= req.data; 
  @(posedge vif.clk); 
endtask
在此任务中必须使用正确的命名约定。clkndata是interface template file中的agent名称,这需要作为任务和文件名的前缀。要让uvm代码生成器包含我们的任务,我们需要添加到interface template file。
Filename clkndata.tpl
...
driver_inc = clkndata_do_drive.sv
实现后的driver代码:
`ifndefCLKNDATA_DRIVER_SV
`define CLKNDATA_DRIVER_SV


//Youcaninsertcodeherebysettingdriver_inc_before_classinfileclkndata.tpl
classclkndata_driverextendsuvm_driver#(data_tx);
`uvm_component_utils(clkndata_driver)
virtualclkndata_ifvif;
clkndata_configm_config;
externfunctionnew(stringname,uvm_componentparent);
  // Methods run_phase and do_drive generated by setting driver_inc in file clkndata.tpl
  extern task run_phase(uvm_phase phase);
externtaskdo_drive();
//Youcaninsertcodeherebysettingdriver_inc_inside_classinfileclkndata.tpl
endclass:clkndata_driver


function clkndata_driver::new(string name, uvm_component parent);
  super.new(name, parent);
endfunction : new


task clkndata_driver::run_phase(uvm_phase phase);
`uvm_info(get_type_name(),"run_phase",UVM_HIGH)
  forever
  begin
    seq_item_port.get_next_item(req);
      `uvm_info(get_type_name(), {"req item
",req.sprint}, UVM_HIGH)
    do_drive();
    seq_item_port.item_done();
  end
endtask:run_phase


// Start of inlined include file generated_tb/tb/include/clkndata_do_drive.sv
task clkndata_driver::do_drive();
  vif.data <= req.data;
  @(posedge vif.clk);
endtask
// End of inlined include file
// You can insert code here by setting driver_inc_after_class in file clkndata.tpl
`endif // CLKNDATA_DRIVER_SV
我们现在可以使用与以前相同的脚本简单地重新运行uvm代码生成器和仿真。 仿真器log说明DUT被正确地驱动了:
# mydata data = f4
此消息表明,我们的DUT 现在正在通过 clkndata 接口接收事务。验证环境仍然只向 DUT 发送一个transaction,如何配置发送多个transaction?

发送多个transaction

uvm代码生成器生成的代码默认发送单个transaction,可以使用common template file中的设置轻松更改此值。
Filename common.tpl
dut_top = mydut
top_default_seq_count = 10
修改后再重新生成uvm代码。
`ifndefTOP_SEQ_LIB_SV
`define TOP_SEQ_LIB_SV


class top_default_seq extends uvm_sequence #(uvm_sequence_item);


`uvm_object_utils(top_default_seq)


top_config      m_config;
clkndata_agent  m_clkndata_agent;
// Number of times to repeat child sequences
int m_seq_count = 10;


extern function new(string name = "");
extern task body();
extern task pre_start();
extern task post_start();


`ifndef UVM_POST_VERSION_1_1
// Functions to support UVM 1.2 objection API in UVM 1.1
extern function uvm_phase get_starting_phase();
extern function void set_starting_phase(uvm_phase phase);
`endif




endclass : top_default_seq


function top_default_seq::new(string name = "");
super.new(name);
endfunction : new




task top_default_seq::body();
`uvm_info(get_type_name(), "Default sequence starting", UVM_HIGH)




repeat (m_seq_count)
  begin
  fork
    if (m_clkndata_agent.m_config.is_active == UVM_ACTIVE)
    begin
      clkndata_default_seq seq;
      seq = clkndata_default_seq::create("seq");
      seq.set_item_context(this, m_clkndata_agent.m_sequencer);
      if ( !seq.randomize() )
        `uvm_error(get_type_name(), "Failed to randomize sequence")
        seq.m_config = m_clkndata_agent.m_config;
        seq.set_starting_phase( get_starting_phase() );
        seq.start(m_clkndata_agent.m_sequencer, this);
      end
    join
end


`uvm_info(get_type_name(), "Default sequence completed", UVM_HIGH)
endtask : body




task top_default_seq::pre_start();
uvm_phase phase = get_starting_phase();
if (phase != null)
phase.raise_objection(this);
endtask: pre_start


task top_default_seq::post_start();
uvm_phase phase = get_starting_phase();
if (phase != null)
phase.drop_objection(this);
endtask: post_start


`ifndef UVM_POST_VERSION_1_1
function uvm_phase top_default_seq::get_starting_phase();
return starting_phase;
endfunction: get_starting_phase


function void top_default_seq::set_starting_phase(uvm_phase phase);
starting_phase = phase;
endfunction: set_starting_phase
`endif
//Youcaninsertcodeherebysettingtop_seq_incinfilecommon.tpl


`endif // TOP_SEQ_LIB_SV



现在运行仿真脚本,将看到 DUT 接收 10 个transaction而不是1个transaction。 我们可以通过类似的方式实现driver、monitor、fcov收集。

任何包含文件都必须放在名为 ./include 的目录中或者可以使用common template file设置inc_path选择其他目录名称。




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 仿真器
    +关注

    关注

    14

    文章

    988

    浏览量

    83002
  • UVM
    UVM
    +关注

    关注

    0

    文章

    181

    浏览量

    18974
  • 生成器
    +关注

    关注

    7

    文章

    302

    浏览量

    20254
  • DUT
    DUT
    +关注

    关注

    0

    文章

    182

    浏览量

    12001

原文标题:Easier UVM Code Generator Part 1: 运行仿真

文章出处:【微信号:芯片验证工程师,微信公众号:芯片验证工程师】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    图像处理:HDMI显示代码的UVM仿真

    本篇完成对HDMI显示代码的UVM仿真,梳理一下在windows-modelsim工具下UVM仿真环境的建立,调试以及遇到的问题。 仿真架构
    的头像 发表于 11-10 15:35 4801次阅读
    图像处理:HDMI显示代码的<b class='flag-5'>UVM</b><b class='flag-5'>仿真</b>

    labview2011 C code generator使用

    谁能提供labview2011 C code generator的详细使用说明?谢谢!!
    发表于 10-28 17:09

    请问如何使用HAL Code Generator配置FlexRay?

    本帖最后由 一只耳朵怪 于 2018-6-19 08:42 编辑 在使用HAL Code Generator配置TMS570LS3137时,无法点开FlexRay。请问如何配置FlexRay.谢谢。
    发表于 06-16 04:30

    HAL code generator 生成的sys_startup.c中的for(;;)

    想问下用HAL Code Generator生成的代码直接加载到CCS5.3中程序的sys_startup.c中会不会有很多for(;;)呢?写好程序好全速调试的时候没有反应,单步调试时发现是在
    发表于 08-08 07:21

    IC验证“UVM验证平台加入objection机制和virtual interface机制“(七)

    。但是在运行上节例子时,仿真平台确实关闭了。在每个phase中,UVM会检查是否有objection被提起 (raise_objection),如果有,那么等待这个objection被撤销
    发表于 12-09 18:28

    请问一下在UVM中的UVMsequences是什么意思啊

    uvm_object基类扩展得到。UVM sequences不是在仿真的开始,而是在仿真的过程中生成并分配内存的,也没有类似uvm_comp
    发表于 04-11 16:43

    谈谈UVM中的uvm_info打印

    \_file, \`uvm\_line)。当uvm\_report\_enabled(xxx)函数返回为1时,才会执行uvm\_report\_info(xxx)。  参数和变量分析:
    发表于 03-17 16:41

    如何使用Vivado System Generator for DSP进行以太网硬件协同仿真

    了解如何使用Vivado System Generator for DSP进行点对点以太网硬件协同仿真。 System Generator提供硬件协同仿真,可以将FPGA中
    的头像 发表于 11-23 06:02 4342次阅读

    Modelsim uvm库编译及执行

    第一句话是设置uvm环境变量,指定uvm的dpi位置。 第二句话是创建work工作目录。 第三句话是编译源文件,并且通过-L指定几个编译库。 第三句是执行仿真,调用uvm
    的头像 发表于 12-01 11:25 3373次阅读
    Modelsim <b class='flag-5'>uvm</b>库编译及执行

    Companion Transport Layer RTL Code Generator Tool

    Companion Transport Layer RTL Code Generator Tool
    发表于 01-27 23:45 9次下载
    Companion Transport Layer RTL <b class='flag-5'>Code</b> <b class='flag-5'>Generator</b> Tool

    e² studio Code Generator 用户手册: RX API Reference

    e² studio Code Generator 用户手册: RX API Reference
    发表于 03-23 19:34 0次下载
    e² studio <b class='flag-5'>Code</b> <b class='flag-5'>Generator</b> 用户手册: RX API Reference

    Easier UVM Code Generator Part 2:添加用户定义的代码

    在本文中,我们将进一步实现monitor和coverage collector components,以便在仿真期间收集功能覆盖信息。
    的头像 发表于 05-20 09:45 464次阅读

    Easier UVM Code Generator Part 4:生成层次化的验证环境

    本文使用Easier UVM Code Generator生成包含多个agent和interface的uvm验证环境。
    的头像 发表于 06-06 09:13 666次阅读

    e² studio Code Generator 用户手册: RX API Reference

    e² studio Code Generator 用户手册: RX API Reference
    发表于 07-10 19:26 0次下载
    e² studio <b class='flag-5'>Code</b> <b class='flag-5'>Generator</b> 用户手册: RX API Reference

    [CS+] Renesas Starter Kit+ for RX71M Code Generator Tutorial 手册

    [CS+] Renesas Starter Kit+ for RX71M Code Generator Tutorial 手册
    发表于 07-12 18:45 1次下载
    [CS+] Renesas Starter Kit+ for RX71M <b class='flag-5'>Code</b> <b class='flag-5'>Generator</b> Tutorial 手册