在芯片验证环境使用宏定义方式举例讲解

作为一名芯片验证工程师,使用宏定义的方式会节省你的工作时间。当然这也不是唯一实现节省时间的方法,不管怎样,技多不压身,下面就怎么定义并使用给大家举个例子介绍下。

你的环境中好几个文件里面要用到一个task,但是这个task需要传不同的实参,这个时候你只要在你的环境的一个全局文件里面定义好,然后把这个全局文件include在一个package文件中,这样就会减少一些不必要的重复工作。

(下图是女儿画的我,哈哈哈)


我们还是从一个例子来一探究竟吧。

`ifndef EXP_HANDSOME_TEST__SV

`define EXP_HANDSOME_TEST__SV

class exp_test_base extends uvm_test;

  `uvm_component_utils(exp_test_base)

  exp_env env;

  extern function new(string name="exp_test_base",uvm_component parent);

  extern virtual function void build_phase(uvm_phase phase);

  extern virtual function void connect_phase(uvm_phase phase);

  extern virtual task wait_everthing_done();

endclass:exp_test_base

function exp_test_base::new(string name="exp_test_base",uvm_component parent);

  super.new(name,parent);

endfunction:new

function void exp_test_base::build_phase(uvm_phase phase);

  super.build_phase(phase);

  //create the env object

  env = exp_env::type_id::create("env",this);

...

endfunction:build_phase

function void exp_test_base::connect_phase(uvm_phase phase);

  super.connect_phase(phase);

...

endfunction:connect_phase

task exp_test_base::wait_everthing_done();

      fork

        forever begin

          #100;

          if (env.is_everything_done() == 1)

            break;

        end

        begin

          #50000;

          `uvm_fatal(get_name(),"wait for everything done time out")

        end

      join_any

      #0;

      disable fork;

      `uvm_info(get_name(),"Everything is done!!",UVM_LOW)

endtask:wait_everthing_done

到这里我们就会用到下面这个例子的宏定义,这个宏定义在后文可以找到

//////////////////////  your test case name 就是粗斜体  ////////////////////////////////////

`exp_test_run_begin(exp_handsome_007,exp_test_base)//宏定义方式的应用

      env.your_memory.preload_data("sram_init.txt");//举个例子来实现

    ...

`exp_test_run_end//宏定义方式的应用

`endif

好了你要的在这,在另一个全局的定义变量的文件中定义上面使用到的宏定义,如下

`define exp_test_run_begin(T,B) \

  class ``T extends ``B; \

  `uvm_component_utils(``T) \

  function new(string name = `"``T`", uvm_component parent=null);\

    super.new(name,parent);\

  endfunction : new \

  virtual function void build_phase(uvm_phase phase);\

    super.build_phase(phase);\

  endfunction : build_phase \

  virtual task run_phase(uvm_phase phase);\

      phase.raise_objection(this);\

      begin


`define exp_test_run_end \

      end \

      wait_everthing_done(); \

      phase.drop_objection(this); \

    endtask:run_phase \

  endclass

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容