自动化生成uvm框架脚本

使用python写了个脚本,用于生成uvm的一些组件模版,模版内容主要是根据自己使用习惯来的,如有需要,可参考使用,如需转载,请注明出处哈~

第一行python解释器的位置需要改为你自己的path~

#! /tools/common/bin/python3
import sys
def component_basic(name):
    file_name=f"{name}.sv"
    with open(f"{file_name}","w+")as f:
        f.write(f"`ifndef {name.upper()}\n")
        f.write(f"`define {name.upper()}\n")
        f.write(f"class {name} extends uvm_agent;\n")
        f.write(f"\t`uvm_component_utils({name})\n")
        f.write(f"endclass:{name}\n")
        f.write("`endif\n")



def do_help(argv):
    print("[function]:help")
    print('''
        -help                   ----------print help information
        -agent      {name}      ----------generate an uvm agent frame
        -driver     {name}      ----------generate an uvm driver frame
        -monitor    {name}      ----------generate an uvm monitor frame
        -sequencer  {name}      ----------generate an uvm sequencer frame
        ...
        -agent_all  {name}      ----------generate agent,driver,monitor,sequencer frame

        ''')
    del argv[1]
def do_agent(argv):
    print("[create agent start]")
    pre_name=argv.pop(2)
    name=f"{pre_name}_agent"
    with open(f"{name}.sv","w+")as f:
        f.write(f"`ifndef {name.upper()}\n")
        f.write(f"`define {name.upper()}\n")
        f.write("\n")
        f.write(f"class {name} extends uvm_agent;\n")
        f.write(f"\t`uvm_component_utils({name})\n")
        f.write("\n")
        f.write(f"\tvirtual {pre_name}_interface vif;\n")
        f.write(f"\t{pre_name}_driver drv;\n")
        f.write(f"\t{pre_name}_sequencer sqr;\n")
        f.write(f"\t{pre_name}_monitor mon;\n")
        f.write('\n\tbit should_handle_reset=1;\n')
        f.write("\n")
        #########################################new()
        f.write("\tfunction new(string name,uvm_component parent);\n")
        f.write("\t\tsuper.new(name,parent);\n")
        f.write("\tendfunction:new\n")
        f.write("\n")
        ####################################################build_phase()
        f.write("\tvirtual function void build_phase(uvm_phase phase);\n")
        f.write("\t\tsuper.build_phase(phase);\n")
        f.write(f'\t\tif(!uvm_config_db#(virtual {pre_name}_interface)::get(this,"","vif",vif))\n')
        f.write(f'\t\t\t`uvm_fatal("{pre_name}_agent","virtual interface error")\n')
        f.write("\t\tif (is_active==UVM_ACTIVE)begin\n")
        f.write(f'\t\t\tdrv={pre_name}_driver::type_id::create("drv",this);\n')
        f.write(f'\t\t\tsqr={pre_name}_sequencer::type_id::create("sqr",this);\n')
        f.write(f'\t\t\tuvm_config_db#(virtual {pre_name}_interface)::set(this,"drv","vif",vif);\n')
        f.write('\t\tend\n')
        f.write(f'\t\tmon={pre_name}_monitor::type_id::create("mon",this);\n')
        f.write(f'\t\tuvm_config_db#(virtual {pre_name}_interface)::set(this,"mon","vif",vif);\n')
        f.write('\tendfunction:build_phase\n')
        f.write('\n')
        ##########################################################connect_phase()
        f.write('\tvirtual function void connect_phase(uvm_phase phase);\n')
        f.write('\t\tsuper.connect_phase(phase);\n')
        f.write('\t\tdrv.seq_item_port.connect(sqr.seq_item_export);\n')
        f.write('\tendfunction:connect_phase\n')
        f.write('\n')
        ##########################################################
        f.write('\textern virtual task main_phase(uvm_phase phase);\n')
        f.write('\textern virtual task run_phase(uvm_phase phase);\n')
        f.write('\textern virtual task wait_reset_start();\n')
        f.write('\textern virtual task wait_reset_end();\n')
        f.write('\textern virtual function void handle_reset(uvm_phase phase, string kind = "HARD");\n')
        f.write('\n')
        ##########################################################
        f.write(f"endclass:{name}\n")
        f.write('\n')
        #################################################################
        f.write(f'task {pre_name}_agent::main_phase(uvm_phase phase);\n')
        f.write('\tforever begin\n')
        f.write('\t\twait_reset_start();\n')
        f.write('\t\tif(should_handle_reset==1)begin\n\t\t\thandle_reset(phase,"HARD");\n\t\tend\n')
        f.write('\t\twait_reset_end();\n')
        f.write('\tend\n')
        f.write('endtask\n')
        f.write('\n')
        ####################################################################
        f.write(f'task {pre_name}_agent::run_phase(uvm_phase phase);\n')
        f.write('\t//todo if need\n\n')
        f.write('endtask\n')
        f.write('\n')
        ###############################################################
        f.write(f'task {name}::wait_reset_start();\n\n\t//todo if need\n\nendtask\n\n')
        ###############################################################
        f.write(f'task {name}::wait_reset_end();\n\n\t//todo if need\n\nendtask\n\n')
        ###############################################################
        f.write(f'function void {pre_name}_agent::handle_reset(uvm_phase phase, string kind = "HARD");\n\tmon.handle_reset(kind);\n\tif(drv != null) begin\n\t\tdrv.handle_reset(kind);\n\tend\n\tif(sqr != null) begin\n\t\tsqr.handle_reset(phase, kind);\n\tend\nendfunction\n\n')
        ####################################################################
        f.write(
  • 22
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: UVM(Universal Verification Methodology)是一种用于验证集成电路设计的开放标准方法学。在UVM平台中,自动生成脚本是一种增强效率和减少错误的技术。 自动生成脚本是指使用脚本语言,通过模板、规则和算法等自动化生成测试代码的过程。在UVM中,我们可以利用自动生成脚本来实现验证环境和测试用例的搭建,以及一些重复性工作的自动化。这样可以大大减少手动编码的工作量,提高代码质量,加快验证过程。 在UVM中,自动生成脚本往往通过一些验证平台工具来实现。这些工具可以根据设计规范、功能需求以及特定验证环境的要求,自动化生成相应的UVM代码。例如,可以通过指定输入信号、约束条件、运行时间等参数,生成测试用例的模板代码。同时,也可以利用一些现有的函数库和模块,实现对于通用部分的重复利用,提高代码的可重用性。 自动生成脚本UVM平台中的应用非常广泛。它可以自动化生成各种类型的验证组件,包括驱动器(driver)、监控器(monitor)、交易符号(transaction)、分析器(analyzer)等。这些自动生成的组件可以帮助验证工程师快速搭建验证环境,提高测试效率。 总而言之,UVM平台的自动生成脚本技术可以通过自动化生成测试代码,减少手动编码的工作量,提高代码质量和可重用性,从而加快验证过程。这是一项在集成电路设计验证中非常有用的技术。 ### 回答2: UVM(Universal Verification Methodology)是一种通用的验证方法学,用于验证硬件设计。它提供了一套规范和方法,帮助验证工程师快速而高效地开发和执行验证环境。而Kris是UVM平台上用于自动生成脚本的工具。 Kris通过分析设计源代码和验证环境的规格要求,自动生成UVM测试脚本。其主要优点是节省了验证工程师编写脚本的工作量,并可以减少人为错误。 使用Kris生成脚本主要分为以下几个步骤: 1.设计规格定义:验证工程师需要给出设计的规格要求,包括输入、输出的数据格式、操作流程等。 2.源代码分析:Kris会分析设计源代码,识别各个功能模块、接口和数据结构等,为后续生成脚本提供依据。 3.验证环境生成:根据设计规格和源代码信息,Kris会自动生成UVM验证环境,包括各种接口和信号的连接、配置寄存器和产生随机数据等。 4.测试脚本生成:基于验证环境和设计规格,Kris会自动生成一组完整的UVM测试脚本,包括产生输入数据、执行功能操作、检查输出数据等。 5.脚本优化和定制:生成脚本可以进一步优化和定制,以适应不同的测试需求,如特定的边界条件、错误注入和覆盖率分析。 总结来说,Kris是一种强大的工具,可以自动化生成UVM平台上的测试脚本。它大大简化了验证工程师的工作,提高了验证环境和测试脚本的开发效率,有助于加速硬件设计的验证过程。 ### 回答3: UVM(通用验证方法学)平台的自动生成脚本Kris是一种用于自动创建基于UVM架构的验证环境的工具。它可以极大地提高验证工程师的工作效率和减少错误率。 Kris具有以下功能和特点: 1. 自动生成UVM验证环境:Kris可以通过分析设计和规格文档,自动创建符合UVM标准的验证环境。它可以将设计单元实例化为验证组件,并生成各个组件之间的连接和配置代码。 2. 可扩展性:Kris支持用户自定义模板和规则。用户可以根据自己的需求和设计规范,编写自定义模板和规则集,从而定制化生成脚本。 3. 支持不同级别的自动化:Kris可以在不同的粒度上自动生成脚本。从整个芯片级别的验证环境到单个验证组件的配置代码,Kris可以生成不同级别的脚本。 4. 支持复杂性和层次结构:Kris可以处理复杂的设计结构和层次化的验证环境。它可以自动识别和处理不同级别的验证组件,并为它们生成相应的配置和连接。 5. 支持常见的设计语言和验证语言:Kris可以分析各种设计语言和验证语言的代码,并生成相应的UVM脚本。它支持常见的设计语言,如Verilog和VHDL,以及常用的验证语言,如SystemVerilog。 总而言之,Kris是一种强大的工具,可以自动生成符合UVM标准的验证环境脚本。通过自动化验证环境的创建过程,Kris可以帮助验证工程师节省大量的时间和精力,并提高验证工作的效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值