【python脚本】ICer的脚本入门训练——gen_tc

简介: 【python脚本】ICer的脚本入门训练——gen_tc

前言

【python脚本】ICer的脚本入门训练——svn_back


上一篇博客的目的,是通过处理固定流程的事物来体现脚本的必要性。而后这篇博客的目的,是熟悉脚本里的一些基本的处理思路。


gen_tc是一个芯片前端验证很常见的脚本,作用是:


1.根据已有的tc生成新的tc文件;


2.修改内部关键字;


3.输出文件;


在这个过程中,我们需要涉及到的处理包括:吃命令行,遍历输入文件,正则匹配与替换,文件输出等过程,作为我第一个学习的脚本,几十行的内容简直最合适作为入门训练。


要求

假定目前我们有一个case,文件名为:sanity_case.sv,内容就是个普普通通的case如下:

`ifndef SANITY_CASE_SV
`define SANITY_CASE_SV
class sanity_case_seq extends my_sequence;
  extern function new(string name = "sanity_case_seq");
  extern virtual task body();
  `uvm_object_utils(sanity_case_seq)
endclass: sanity_case_seq
function sanity_case_seq::new(string name = "sanity_case_seq");
  super.new(name);
endfunction: new
task sanity_case_seq::body();
  repeat(10000) begin
    `uvm_do_with(my_tr, {my_tr.par_err == 0;})
  end
  #100;
endtask: body
class sanity_case extends base_test;
  extern function new(string name = "base_test", uvm_component parent=null);
  extern virtual function void build_phase(uvm_phase phase);
  `uvm_component_utils(sanity_case)
endclass: sanity_case
function sanity_case::new(string name = "base_test", uvm_component parent=null);
    super.new(name, parent);
endfunction: new
function void sanity_case::build_phase(uvm_phase phase);
  super.build_phase(phase);
  uvm_config_db #(uvm_object_wrapper)::set(
    this,
    "env.i_agt0.sqr.main_phase",
    "default_sequence",
    sanity_case_seq::type_id::get()
  );
    uvm_config_db #(uvm_object_wrapper)::set(
    this,
    "env.i_agt1.sqr.main_phase",
    "default_sequence",
    sanity_case_seq::type_id::get()
  );
endfunction: build_phase
`endif



那么我们要做的就是,编写一个脚本 gen_tc,在当前目录执行gen_tc sanity_case.v new_case.v之后,在当前目录生成新的文件new_case.v。


实操

1.新建文件gen_tc

键入以下内容作为初始:



之后修改文件属性为可执行属性chmod a+x gen_tc,然后你就会发现你的脚本绿了:



敲一下,确认可执行,然后继续下一步:



2.读取命令参数

gen_tc脚本要吃两个参数,一般处理参数有两种常用的方式:sys.argv数组和argparse库。使用argparse的典型方式,如下面的代码,具体功能我们不做探究:

import argparse
def input_args_proc():
    parser = argparse.ArgumentParser(description="argparse info")
    parser.add_argument('-o', action='store_true', default=False, help='open this script')
    result = parser.parse_args()
    if result.o == True:
        os.system("gvim %s" % __file__)
        sys.exit(0)


gen_tc的输入参数情况比较简单,两个参数必须输入,因此不需要使用argparse,直接使用sys.argv数组即可。比如目前的输入获取方式:

def input_sys():
    if len(sys.argv) > 2:
        from_tc = sys.argv[1]
        to_tc = sys.argv[2]
    else:
        print("Input error")
        sys.exit(0)
    return from_tc, to_tc


sys.argv[0]不要使用,那是脚本自身名称。在main函数中接受该函数的返回值,读取输入参数的操作就完成了。

from_tc, to_tc = input_sys()


3.读取并修改参考tc

可以通过以下的形式形式来读取文件:

def modify_tc(file):
    with open(file, "r") as handle:
        hd = handle.readlines()
        for line in hd:
            line = line.strip("\n")
            print(line)


读取文件后,在没一行内匹配“sanity_case”或“SANITY_CASE”关键字,并将其替换为“new_case”和“NEW_CASE”,而后将字符串暂存于数组中,作为函数返回值:

def modify_tc(frm, to):
    frm_key = re.sub("\.sv","",frm) #得到sanity_case.sv里的sanity_case
    frm_uc = frm_key.upper() #纯小写
    frm_lc = frm_key.lower() #纯大写,执行的时候把这块注释删了
    to_key  = re.sub("\.sv","",to)
    to_uc = to_key.upper()
    to_lc = to_key.lower()
    out_file = []
    with open(frm, "r") as handle:
        hd = handle.readlines()
        for line in hd:
            line = line.strip("\n")
            line = re.sub(frm_uc, to_uc, line)
            line = re.sub(frm_lc, to_lc, line)
            out_file.append(line)
    return out_file


main函数中接收返回值:

out_file = modify_tc(from_tc, to_tc)


4.输出文件

输出文件的函数比较固定:

def write_list(lst, out):
    with open(out, "w") as handle:
        for line in lst:
            handle.write(line+"\n")


在main中把out_file和to_tc作为参数传给该函数即可:

write_list(out_file, to_tc)


5.执行脚本

代码编写完成后,执行脚本,打开文件new_case.sv:


`ifndef NEW_CASE_SV
`define NEW_CASE_SV
class new_case_seq extends my_sequence;
  extern function new(string name = "new_case_seq");
  extern virtual task body();
  `uvm_object_utils(new_case_seq)
endclass: new_case_seq
function new_case_seq::new(string name = "new_case_seq");
  super.new(name);
endfunction: new
task new_case_seq::body();
  repeat(10000) begin
    `uvm_do_with(my_tr, {my_tr.par_err == 0;})
  end
  #100;
endtask: body
class new_case extends base_test;
  extern function new(string name = "base_test", uvm_component parent=null);
  extern virtual function void build_phase(uvm_phase phase);
  `uvm_component_utils(new_case)
endclass: new_case
function new_case::new(string name = "base_test", uvm_component parent=null);
    super.new(name, parent);
endfunction: new
function void new_case::build_phase(uvm_phase phase);
  super.build_phase(phase);
  uvm_config_db #(uvm_object_wrapper)::set(
    this,
    "env.i_agt0.sqr.main_phase",
    "default_sequence",
    new_case_seq::type_id::get()
  );
    uvm_config_db #(uvm_object_wrapper)::set(
    this,
    "env.i_agt1.sqr.main_phase",
    "default_sequence",
    new_case_seq::type_id::get()
  );
endfunction: build_phase
`endif


相关文章
|
16天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
7天前
|
机器学习/深度学习 数据可视化 TensorFlow
使用Python实现深度学习模型的分布式训练
使用Python实现深度学习模型的分布式训练
117 73
|
13天前
|
数据采集 存储 监控
21个Python脚本自动执行日常任务(2)
21个Python脚本自动执行日常任务(2)
56 7
21个Python脚本自动执行日常任务(2)
|
3天前
|
数据挖掘 vr&ar C++
让UE自动运行Python脚本:实现与实例解析
本文介绍如何配置Unreal Engine(UE)以自动运行Python脚本,提高开发效率。通过安装Python、配置UE环境及使用第三方插件,实现Python与UE的集成。结合蓝图和C++示例,展示自动化任务处理、关卡生成及数据分析等应用场景。
26 5
|
17天前
|
测试技术 开发者 Python
探索Python中的装饰器:从入门到实践
装饰器,在Python中是一块强大的语法糖,它允许我们在不修改原函数代码的情况下增加额外的功能。本文将通过简单易懂的语言和实例,带你一步步了解装饰器的基本概念、使用方法以及如何自定义装饰器。我们还将探讨装饰器在实战中的应用,让你能够在实际编程中灵活运用这一技术。
36 7
|
17天前
|
机器学习/深度学习 人工智能 算法
深度学习入门:用Python构建你的第一个神经网络
在人工智能的海洋中,深度学习是那艘能够带你远航的船。本文将作为你的航标,引导你搭建第一个神经网络模型,让你领略深度学习的魅力。通过简单直观的语言和实例,我们将一起探索隐藏在数据背后的模式,体验从零开始创造智能系统的快感。准备好了吗?让我们启航吧!
44 3
|
18天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
5天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
98 80
|
23天前
|
存储 索引 Python
Python编程数据结构的深入理解
深入理解 Python 中的数据结构是提高编程能力的重要途径。通过合理选择和使用数据结构,可以提高程序的效率和质量
134 59
|
3天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
19 2