⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tb_env.sv

📁 VMM 文档加源码, synopsys公司很好的验证资料
💻 SV
字号:
// // -------------------------------------------------------------//    Copyright 2004-2008 Synopsys, Inc.//    All Rights Reserved Worldwide// //    Licensed under the Apache License, Version 2.0 (the//    "License"); you may not use this file except in//    compliance with the License.  You may obtain a copy of//    the License at// //        http://www.apache.org/licenses/LICENSE-2.0// //    Unless required by applicable law or agreed to in//    writing, software distributed under the License is//    distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR//    CONDITIONS OF ANY KIND, either express or implied.  See//    the License for the specific language governing//    permissions and limitations under the License.// -------------------------------------------------------------// //// Description : FIFO Testbench vmm_environment class//// This class instantiates all the permanent testbench top-level components//   * FIFO Atomic Generator//   * FIFO Master//   * FIFO Monitor//   * Scoreboard//`ifndef TB_ENV__SV`define TB_ENV__SV`include "tb_top.v"`include "fifo_vip.sv"`include "dut_sb.sv"`include "sb_callbacks.sv"class env_cfg;  bit on_emulator = 0;  // How many transactions to generate before test ends?  rand int trans_cnt;  constraint env_cfg_valid {    trans_cnt > 5;  }  constraint reasonable {    if (on_emulator) {        trans_cnt >   10000000;        trans_cnt < 1000000000;    } else {        trans_cnt < 1000;    }  }  constraint emulation {      }endclass: env_cfgclass tb_env extends vmm_env ;  vmm_log log;  vmm_hw_arch arch;  env_cfg cfg;                                                                                  vmm_hw_in_port  reset_req_prt;  vmm_hw_out_port reset_ack_prt;  fifo_trans_channel gen2mas;                   fifo_trans_channel mon2scb;                                                            fifo_trans_atomic_gen gen;                                                         fifo_master            mst;             fifo_monitor           mon;           dut_sb                scb;                                         // Constructor  extern function new();  // VMM Environment Steps  extern virtual function void gen_cfg();  extern virtual function void build();  extern virtual task reset_dut();  extern virtual task cfg_dut();  extern virtual task start();  extern virtual task wait_for_end();  extern virtual task stop();  extern virtual task cleanup();  extern virtual task report();endclass: tb_env  function tb_env::new();   super.new("TB_ENV");       log = new("dut", "env");                                                this.cfg = new() ;`ifdef VMM_HW_ARCH_NULL  begin     vmm_hw_arch_null a = new;     this.arch = a;  end`endifendfunction//-----------------------------------------------------------------------------// gen_cfg() - Generate a randomized testbench configuration//-----------------------------------------------------------------------------    function void tb_env::gen_cfg() ;  super.gen_cfg() ;  if (cfg.randomize() == 0)                                                  `vmm_fatal(log, "Failed to randomize testbench configuration");      endfunction//-----------------------------------------------------------------------------// build() - Build the testbench, xactors, scoreboard, callbacks//-----------------------------------------------------------------------------    function void tb_env::build() ;   vmm_hw_in_port ip;   vmm_hw_out_port op;   super.build() ;   arch.clk_control(tb_top.tb_clk, tb_top.hw_rst.bfm.tb_ctl);   arch.clk_control(tb_top.tb_clk, tb_top.bfm_write.clk1);   this.reset_req_prt = arch.create_in_port(tb_top.hw_rst.bfm.reset_req_if, "");   this.reset_ack_prt = arch.create_out_port(tb_top.hw_rst.bfm.reset_ack_if, "");   gen2mas = new ("FIFO Trans Channel", "gen2mas") ;                          mon2scb = new ("FIFO Trans Channel", "mon2scb") ;                          gen = new ("FIFO Atomic Gen", 1, gen2mas) ;   ip = arch.create_in_port(tb_top.bfm_write.msg1, "");   mst = new ("FIFO trans master", 1, ip, gen2mas);   op = arch.create_out_port(tb_top.bfm_write.msg2, "");   mon = new ("FIFO trans monitor", 1, op, mon2scb);   scb = new(cfg.trans_cnt);   begin     fifo_master_sb_callbacks  fifo_mst_sb_cb  = new(scb);     fifo_monitor_sb_callbacks  fifo_mon_sb_cb  = new(scb);     mst.append_callback(fifo_mst_sb_cb);     mon.append_callback(fifo_mon_sb_cb);   end   gen.stop_after_n_insts = cfg.trans_cnt ;   arch.init_sim();endfunction: build//-----------------------------------------------------------------------------// reset_dut() - Reset the DUT//-----------------------------------------------------------------------------  task tb_env::reset_dut();   bit [1023:0] junk;   time stamp;   super.reset_dut();   $display("pre reset_req_prt");    this.reset_req_prt.send(1'b1);   $display("pre reset_ack_prt");    this.reset_ack_prt.receive(junk, stamp);   $display("Done with reset stuff..."); endtask:reset_dut//-----------------------------------------------------------------------------// cfg_dut() - Configure the DUT//-----------------------------------------------------------------------------task tb_env::cfg_dut();       super.cfg_dut() ;endtask: cfg_dut//-----------------------------------------------------------------------------// start() - Start each of the xactors//-----------------------------------------------------------------------------    task tb_env::start();   super.start();   mon.start_xactor();                              mst.start_xactor();   gen.start_xactor();endtask: start//-----------------------------------------------------------------------------// wait_for_end() - Wait until the test completes//-----------------------------------------------------------------------------task tb_env::wait_for_end();   super.wait_for_end();   fork                                       gen.notify.wait_for(fifo_trans_atomic_gen::DONE);       scb.notify.wait_for(scb.DONE);                    join                                              endtask: wait_for_end            //-----------------------------------------------------------------------------// stop() - Stop each of the xactors//-----------------------------------------------------------------------------    task tb_env::stop();   super.stop() ;   gen.stop_xactor();          mst.stop_xactor();         mon.stop_xactor();     endtask: stop//-----------------------------------------------------------------------------// cleanup() - Cleanup the testbench, report any scoreboard errors etc.//-----------------------------------------------------------------------------task tb_env::cleanup();  super.cleanup() ;   scb.cleanup();    endtask//-----------------------------------------------------------------------------// report() - Report Statistics from the testbench//-----------------------------------------------------------------------------task tb_env::report() ;  super.report() ;endtask`endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -