【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


相关文章
|
30天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
8天前
|
Python
自动化微信朋友圈:Python脚本实现自动发布动态
本文介绍如何使用Python脚本自动化发布微信朋友圈动态,节省手动输入的时间。主要依赖`pyautogui`、`time`、`pyperclip`等库,通过模拟鼠标和键盘操作实现自动发布。代码涵盖打开微信、定位朋友圈、准备输入框、模拟打字等功能。虽然该方法能提高效率,但需注意可能违反微信使用条款,存在风险。定期更新脚本以适应微信界面变化也很重要。
106 60
|
21天前
|
机器学习/深度学习 数据可视化 TensorFlow
使用Python实现深度学习模型的分布式训练
使用Python实现深度学习模型的分布式训练
164 73
|
27天前
|
数据采集 存储 监控
21个Python脚本自动执行日常任务(2)
21个Python脚本自动执行日常任务(2)
86 7
21个Python脚本自动执行日常任务(2)
|
2天前
|
人工智能 编译器 Python
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
|
17天前
|
数据挖掘 vr&ar C++
让UE自动运行Python脚本:实现与实例解析
本文介绍如何配置Unreal Engine(UE)以自动运行Python脚本,提高开发效率。通过安装Python、配置UE环境及使用第三方插件,实现Python与UE的集成。结合蓝图和C++示例,展示自动化任务处理、关卡生成及数据分析等应用场景。
77 5
|
1月前
|
测试技术 开发者 Python
探索Python中的装饰器:从入门到实践
装饰器,在Python中是一块强大的语法糖,它允许我们在不修改原函数代码的情况下增加额外的功能。本文将通过简单易懂的语言和实例,带你一步步了解装饰器的基本概念、使用方法以及如何自定义装饰器。我们还将探讨装饰器在实战中的应用,让你能够在实际编程中灵活运用这一技术。
38 7
|
3月前
|
Linux 区块链 Python
Python实用记录(十三):python脚本打包exe文件并运行
这篇文章介绍了如何使用PyInstaller将Python脚本打包成可执行文件(exe),并提供了详细的步骤和注意事项。
118 1
Python实用记录(十三):python脚本打包exe文件并运行
|
4月前
|
存储 Shell 区块链
怎么把Python脚本打包成可执行程序?
该文档介绍了如何将Python脚本及其运行环境打包成EXE可执行文件,以便在不具备Python环境的计算机上运行。首先确保Python脚本能够正常运行,然后通过安装PyInstaller并使用`--onefile`参数将脚本打包成独立的EXE文件。此外,还提供了去除命令行窗口和指定可执行文件图标的详细方法。这些步骤帮助用户轻松地将Python程序分发给最终用户。
怎么把Python脚本打包成可执行程序?
|
5月前
|
区块链 Python
Python脚本打包 exe,auto-py-to-exe来帮你!
Python脚本打包 exe,auto-py-to-exe来帮你!
125 0