亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? xbus_bus_monitor.sv

?? This is OVM 2.0 source code .Very useful for developing system verilog Env
?? SV
字號(hào):
// $Id: xbus_bus_monitor.sv,v 1.15 2008/03/31 10:03:49 jlrose Exp $//----------------------------------------------------------------------//   Copyright 2007-2008 Mentor Graphics Corporation//   Copyright 2007-2008 Cadence Design Systems, 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.//----------------------------------------------------------------------`ifndef XBUS_BUS_MONITOR_SV`define XBUS_BUS_MONITOR_SV//------------------------------------------------------------------------------//// CLASS: slave_address_map_info//// The following class is used to determine which slave should respond // to a transfer on the bus//------------------------------------------------------------------------------class slave_address_map_info extends ovm_object;  protected int min_addr;  protected int max_addr;   function new(string name = "slave_address_map_info");    super.new(name);  endfunction  `ovm_object_utils_begin(slave_address_map_info)    `ovm_field_int(min_addr, OVM_ALL_ON)    `ovm_field_int(max_addr, OVM_ALL_ON)  `ovm_object_utils_end  function void set_address_map (int min_addr, int max_addr);     this.min_addr = min_addr;    this.max_addr = max_addr;  endfunction : set_address_map  // get the min addr  function bit [15:0] get_min_addr();    return min_addr;  endfunction : get_min_addr  // get the max addr  function bit [15:0] get_max_addr();    return max_addr;  endfunction : get_max_addrendclass : slave_address_map_info// Enumerated for xbus bus statetypedef enum {RST_START, RST_STOP, NO_OP, ARBI, ADDR_PH, ADDR_PH_ERROR,   DATA_PH} xbus_bus_state;//------------------------------------------------------------------------------//// CLASS: xbus_status////------------------------------------------------------------------------------class xbus_status extends ovm_object;  xbus_bus_state bus_state;  function new(string name = "xbus_status");    super.new(name);  endfunction  `ovm_object_utils_begin(xbus_status)    `ovm_field_enum(xbus_bus_state, bus_state, OVM_ALL_ON)  `ovm_object_utils_endendclass : xbus_status//------------------------------------------------------------------------------//// CLASS: xbus_bus_monitor////------------------------------------------------------------------------------class xbus_bus_monitor extends ovm_monitor;  // The virtual interface used to view HDL signals.  protected virtual xbus_if xbmi;  // Property indicating the number of transactions occuring on the xbus.  protected int unsigned num_transactions = 0;  // The following two bits are used to control whether checks and coverage are  // done both in the bus monitor class and the interface.  bit checks_enable = 1;   bit coverage_enable = 1;  // Analysis ports for the item_collected and state notifier.  ovm_analysis_port #(xbus_transfer) item_collected_port;  ovm_analysis_port #(xbus_status) state_port;  // The state of the xbus  protected xbus_status status;  // The following property is used to store slave address map  protected slave_address_map_info slave_addr_map[string];  // The following property holds the transaction information currently  // being captured (by the collect_address_phase and data_phase methods).   protected xbus_transfer trans_collected;  // Events needed to trigger covergroups  protected event cov_transaction;  protected event cov_transaction_beat;  // Fields to hold trans data and wait_state.  No coverage of dynamic arrays.  protected bit [15:0] addr;  protected bit [7:0] data;  protected int unsigned wait_state;  // Transfer collected covergroup  covergroup cov_trans @cov_transaction;    option.per_instance = 1;    trans_start_addr : coverpoint trans_collected.addr {      option.auto_bin_max = 16; }    trans_dir : coverpoint trans_collected.read_write;    trans_size : coverpoint trans_collected.size {      bins sizes[] = {1, 2, 4, 8};      illegal_bins invalid_sizes = default; }    trans_addrXdir : cross trans_start_addr, trans_dir;    trans_dirXsize : cross trans_dir, trans_size;  endgroup : cov_trans  // Transfer collected data covergroup  covergroup cov_trans_beat @cov_transaction_beat;    option.per_instance = 1;    beat_addr : coverpoint addr {      option.auto_bin_max = 16; }    beat_dir : coverpoint trans_collected.read_write;    beat_data : coverpoint data {      option.auto_bin_max = 8; }    beat_wait : coverpoint wait_state {      bins waits[] = { [0:9] };      bins others = { [10:$] }; }    beat_addrXdir : cross beat_addr, beat_dir;    beat_addrXdata : cross beat_addr, beat_data;  endgroup : cov_trans_beat  // Provide implementations of virtual methods such as get_type_name and create  `ovm_component_utils_begin(xbus_bus_monitor)    `ovm_field_int(checks_enable, OVM_ALL_ON)    `ovm_field_int(coverage_enable, OVM_ALL_ON)    `ovm_field_int(num_transactions, OVM_ALL_ON)    `ovm_field_aa_object_string(slave_addr_map, OVM_ALL_ON)  `ovm_component_utils_end  // new - constructor  function new (string name, ovm_component parent);    super.new(name, parent);    cov_trans = new();    cov_trans.set_inst_name({get_full_name(), ".cov_trans"});    cov_trans_beat = new();    cov_trans_beat.set_inst_name({get_full_name(), ".cov_trans_beat"});    trans_collected = new();    item_collected_port = new("item_collected_port", this);    state_port = new("state_port", this);    status = new("status");  endfunction : new  // set_slave_configs  function void set_slave_configs(string slave_name,    int min_addr, int max_addr);    slave_addr_map[slave_name] = new();    slave_addr_map[slave_name].set_address_map(min_addr, max_addr);  endfunction : set_slave_configs  // Assign the virtual interface variable  function void assign_vi(virtual interface xbus_if xi);    xbmi = xi;  endfunction  // run phase  task run();    fork      observe_reset();      collect_transactions();    join  endtask : run  // observe_reset  task observe_reset();    fork      forever begin        @(posedge xbmi.sig_reset);        status.bus_state = RST_START;        state_port.write(status);      end      forever begin        @(negedge xbmi.sig_reset);        status.bus_state = RST_STOP;        state_port.write(status);      end    join  endtask : observe_reset  // collect_transactions  virtual protected task collect_transactions();    forever begin      collect_arbitration_phase();      collect_address_phase();      collect_data_phase();      ovm_report_info(get_type_name(),$psprintf("Transfer collected :\n%s",         trans_collected.sprint()), OVM_HIGH);      if (checks_enable)        perform_transfer_checks();      if (coverage_enable)        perform_transfer_coverage();       item_collected_port.write(trans_collected);    end  endtask : collect_transactions  // collect_arbitration_phase  task collect_arbitration_phase();    string tmpStr;    @(posedge xbmi.sig_clock iff (xbmi.sig_grant != 0));    status.bus_state = ARBI;    state_port.write(status);    void'(this.begin_tr(trans_collected));    // Check which grant is asserted to determine which master is performing    // the transfer on the bus.    for (int j = 0; j <= 15; j++) begin      if (xbmi.sig_grant[j] === 1) begin        $sformat(tmpStr,"masters[%0d]", j);        trans_collected.master = tmpStr;        break;         end     end  endtask : collect_arbitration_phase  // collect_address_phase  task collect_address_phase();    @(posedge xbmi.sig_clock);    trans_collected.addr = xbmi.sig_addr;    case (xbmi.sig_size)      2'b00 : trans_collected.size = 1;      2'b01 : trans_collected.size = 2;      2'b10 : trans_collected.size = 4;      2'b11 : trans_collected.size = 8;    endcase    trans_collected.data = new[trans_collected.size];    case ({xbmi.sig_read,xbmi.sig_write})      2'b00 : begin        trans_collected.read_write = NOP;        status.bus_state = NO_OP;        state_port.write(status);      end      2'b10 : begin        trans_collected.read_write = READ;        status.bus_state = ADDR_PH;        state_port.write(status);      end      2'b01 : begin        trans_collected.read_write = WRITE;        status.bus_state = ADDR_PH;        state_port.write(status);      end      2'b11 : begin        status.bus_state = ADDR_PH_ERROR;        state_port.write(status);        if (checks_enable)          ovm_report_error(get_type_name(),            "Read and Write true at the same time", OVM_NONE);      end                endcase  endtask : collect_address_phase  // collect_data_phase  task collect_data_phase();    int i;    if (trans_collected.read_write != NOP) begin      check_which_slave();      for (i = 0; i < trans_collected.size; i++) begin        status.bus_state = DATA_PH;        state_port.write(status);        @(posedge xbmi.sig_clock iff xbmi.sig_wait === 0);        trans_collected.data[i] = xbmi.sig_data;      end      num_transactions++;      this.end_tr(trans_collected);    end  endtask : collect_data_phase  // check_which_slave  function void check_which_slave();    string slave_name;    bit slave_found;    slave_found = 1'b0;    if(slave_addr_map.first(slave_name))      do begin        if (slave_addr_map[slave_name].get_min_addr() <= trans_collected.addr          && trans_collected.addr <= slave_addr_map[slave_name].get_max_addr())         begin          trans_collected.slave = slave_name;          slave_found = 1'b1;        end        if (slave_found == 1'b1)          break;      end    while (slave_addr_map.next(slave_name));      assert(slave_found) else begin        ovm_report_error(get_type_name(),          $psprintf("Master attempted a transfer at illegal address 16'h%0h",           trans_collected.addr), OVM_NONE);      end  endfunction : check_which_slave  // perform_transfer_checks  function void perform_transfer_checks();    check_transfer_size();    check_transfer_data_size();  endfunction : perform_transfer_checks  // check_transfer_size  function void check_transfer_size();   if (trans_collected.read_write != NOP) begin    check_transfer_size : assert(trans_collected.size == 1 ||       trans_collected.size == 2 || trans_collected.size == 4 ||       trans_collected.size == 8) else begin      ovm_report_error(get_type_name(),        "Invalid transfer size!", OVM_NONE);    end   end  endfunction : check_transfer_size  // check_transfer_data_size  function void check_transfer_data_size();    if (trans_collected.size != trans_collected.data.size())      ovm_report_error(get_type_name(),        "Transfer size field / data size mismatch.", OVM_NONE);  endfunction : check_transfer_data_size  // perform_transfer_coverage  function void perform_transfer_coverage();    if (trans_collected.read_write != NOP) begin      -> cov_transaction;      for (int unsigned i = 0; i < trans_collected.size; i++) begin        addr = trans_collected.addr + i;        data = trans_collected.data[i];        wait_state = trans_collected.wait_state[i];        -> cov_transaction_beat;      end    end  endfunction : perform_transfer_coverageendclass : xbus_bus_monitor`endif // XBUS_BUS_MONITOR_SV

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
天堂成人国产精品一区| 中文字幕欧美激情一区| 午夜影视日本亚洲欧洲精品| 色综合一个色综合| 亚洲男女一区二区三区| 91电影在线观看| 天堂va蜜桃一区二区三区| 欧美一区二区三区在线观看视频| 午夜影视日本亚洲欧洲精品| 91精品黄色片免费大全| 极品美女销魂一区二区三区| 国产性天天综合网| 色综合久久综合网| 丝袜美腿亚洲综合| 国产亚洲污的网站| 91国模大尺度私拍在线视频| 婷婷激情综合网| 久久久久国产精品麻豆| 91丨porny丨中文| 日韩精品国产精品| 国产日产精品一区| 欧美三级欧美一级| 国产一区二区三区综合| 亚洲欧美激情插| 日韩一区二区三区视频| 国产91露脸合集magnet| 亚洲一区二区在线观看视频 | 成人午夜视频网站| 亚洲欧美一区二区三区孕妇| 欧美日韩一区二区在线观看视频| 久久99久国产精品黄毛片色诱| 久久嫩草精品久久久精品| 99r国产精品| 看电视剧不卡顿的网站| 欧美韩日一区二区三区| 精品视频一区 二区 三区| 国产中文一区二区三区| 亚洲精品乱码久久久久久| 精品国产一区二区三区久久久蜜月 | 国产成人精品亚洲777人妖| 亚洲色欲色欲www| 日韩视频一区二区三区在线播放| www.日韩在线| 韩国在线一区二区| 亚洲成人先锋电影| 亚洲视频你懂的| 久久精品在这里| 日韩亚洲欧美在线观看| 91黄色免费网站| 成人av片在线观看| 久草精品在线观看| 午夜婷婷国产麻豆精品| 综合欧美亚洲日本| 国产三级久久久| 日韩欧美成人一区二区| 欧美手机在线视频| 91麻豆国产精品久久| 国产精一品亚洲二区在线视频| 日日夜夜一区二区| 亚洲成人手机在线| 一区二区三区中文免费| 中文字幕在线观看一区| 国产亚洲精品福利| 久久精品亚洲乱码伦伦中文| 欧美一区二区三区小说| 欧美日韩亚洲高清一区二区| 91看片淫黄大片一级| 99天天综合性| 成人h精品动漫一区二区三区| 国产麻豆精品theporn| 美国三级日本三级久久99| 日韩有码一区二区三区| 亚洲第一电影网| 午夜精品久久久久久久久久久 | 亚洲一区二区在线免费看| 中文字幕字幕中文在线中不卡视频| 国产女主播视频一区二区| 久久精品亚洲精品国产欧美| 久久久精品国产免大香伊| 久久欧美一区二区| 国产日韩欧美精品综合| 国产日韩高清在线| 国产精品嫩草99a| 中文字幕在线不卡| 亚洲精品网站在线观看| 亚洲曰韩产成在线| 视频一区二区中文字幕| 蜜臂av日日欢夜夜爽一区| 久久99国产精品成人| 久久成人羞羞网站| 国产成人在线看| 97国产精品videossex| 色婷婷av久久久久久久| 欧美日韩国产另类一区| 91.麻豆视频| 亚洲精品一区二区三区精华液| 久久久久国产精品人| 欧美国产欧美综合| 亚洲欧洲制服丝袜| 亚洲成人在线网站| 美女视频免费一区| 成人性生交大片免费| 欧洲中文字幕精品| 日韩欧美一区在线| 国产精品美女久久久久高潮| 亚洲精品高清在线观看| 日本不卡免费在线视频| 国产福利91精品一区| 91丝袜高跟美女视频| 51精品久久久久久久蜜臀| 久久久一区二区三区捆绑**| 亚洲欧美另类小说视频| 日韩av电影天堂| 成人av网站在线观看免费| 在线观看视频一区| 2014亚洲片线观看视频免费| 亚洲色图清纯唯美| 轻轻草成人在线| av电影天堂一区二区在线观看| 欧美性感一区二区三区| 久久麻豆一区二区| 亚洲大型综合色站| 成a人片亚洲日本久久| 91精品国产综合久久福利| 国产精品色婷婷| 热久久免费视频| 一道本成人在线| 久久久精品国产免费观看同学| 亚洲综合免费观看高清完整版在线| 激情综合一区二区三区| 欧美三级韩国三级日本三斤| 国产欧美一区二区三区在线老狼| 亚洲五码中文字幕| 成人深夜福利app| 欧美一卡2卡3卡4卡| 亚洲欧美日韩在线| 国产一区二区三区在线看麻豆| 欧美区视频在线观看| 亚洲人午夜精品天堂一二香蕉| 国产一区二三区| 日韩欧美自拍偷拍| 午夜亚洲福利老司机| 日本黄色一区二区| 国产精品久久久久国产精品日日| 麻豆成人免费电影| 在线成人免费观看| 亚洲精品成人少妇| a亚洲天堂av| 国产日韩精品一区二区浪潮av| 美女mm1313爽爽久久久蜜臀| 欧美日韩三级一区二区| 亚洲精品乱码久久久久久黑人 | 亚洲日本va午夜在线影院| 国产在线一区二区| 日韩欧美成人午夜| 麻豆精品一二三| 91精品国产91久久久久久最新毛片| 亚洲日本韩国一区| 色综合久久六月婷婷中文字幕| 欧美激情一区在线| 成人一二三区视频| 日本一区二区三区四区在线视频| 精品一区二区在线播放| 精品欧美久久久| 久久精品99国产精品日本| 欧美一区二区精美| 美女mm1313爽爽久久久蜜臀| 777a∨成人精品桃花网| 午夜激情久久久| 欧美精品久久一区二区三区| 亚洲成a人v欧美综合天堂下载| 欧美日韩精品一区二区三区蜜桃| 亚洲一区自拍偷拍| 欧美日本一道本在线视频| 午夜视黄欧洲亚洲| 91精品欧美一区二区三区综合在 | 亚洲国产婷婷综合在线精品| 色婷婷av一区二区三区大白胸| 亚洲激情av在线| 欧美日韩亚州综合| 蜜臀久久久99精品久久久久久| 日韩免费视频一区| 国产mv日韩mv欧美| 日韩一区欧美一区| 欧美日韩高清在线播放| 舔着乳尖日韩一区| 欧美精品一区二区三| 国产成人在线色| 亚洲欧美另类小说| 在线看国产一区二区| 天天综合网天天综合色| 欧美第一区第二区| 国产+成+人+亚洲欧洲自线| 综合亚洲深深色噜噜狠狠网站| 91在线精品一区二区| 亚洲成a天堂v人片| 精品国产精品网麻豆系列| thepron国产精品| 午夜a成v人精品| 欧美激情艳妇裸体舞|