使用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(