📄 m_f_bfm.sv
字号:
//// Template for VMM-compliant full-duplex physical-level monitor//// <XACT> Name of transactor// <IF> Name of physical interface// <passive> Name of modport in physical interface// <TR> Name of input/output transaction descriptor class//`ifndef XACT__SV`define XACT__SV`include "vmm.sv"`include "IF.sv"`include "TR.sv"typedef class XACT;class XACT_callbacks extends vmm_xactor_callbacks; // ToDo: Add additional relevant callbacks // ToDo: Use a task if callbacks can be blocking // Called at start of observed transaction virtual function void pre_tx_trans(XACT xactor, TR tr); endfunction: pre_tx_trans // Called at end of observed transaction virtual function void post_tx_trans(XACT xactor, TR tr); endfunction: post_tx_trans // Called at start of observed transaction virtual function void pre_rx_trans(XACT xactor, TR tr); endfunction: pre_rx_trans // Called at end of observed transaction virtual function void post_rx_trans(XACT xactor, TR tr); endfunction: post_rx_transendclass:XACT_callbacksclass XACT_cfg; // ToDo: Add transactor configuration class properties rand int mode;endclass:XACT_cfgclass XACT extends vmm_xactor; int OBS_ON_TX; int OBS_ON_RX; protected XACT_cfg cfg; local XACT_cfg reset_cfg; protected TR tx_factory; local TR reset_tx_factory; protected TR rx_factory; local TR reset_rx_factory; TR_channel tx_chan; TR_channel rx_chan; virtual IF.passive sigs; extern function new(string inst, int stream_id, virtual IF.passive sigs, XACT_cfg cfg = null, TR_channel tx_chan = null, TR_channel rx_chan = null, TR tx_factory = null, TR rx_factory = null); extern virtual function void reconfigure(XACT_cfg cfg); extern virtual function void reset_xactor(reset_e rst_type = SOFT_RST); extern protected virtual task main(); extern protected virtual task tx_monitor(); extern protected virtual task rx_monitor();endclass:XACTfunction XACT::new(string inst, int stream_id, virtual IF.passive sigs, XACT_cfg cfg, TR_channel tx_chan, TR_channel rx_chan, TR tx_factory, TR rx_factory); super.new("XACT Transactor", inst, stream_id); this.OBS_ON_TX = this.notify.configure(-1, vmm_notify::ON_OFF); this.OBS_ON_RX = this.notify.configure(-1, vmm_notify::ON_OFF); this.sigs = sigs; if (cfg == null) cfg = new; this.cfg = cfg; this.reset_cfg = cfg; if (tx_chan == null) tx_chan = new("XACT Tx Channel", inst); this.tx_chan = tx_chan; if (rx_chan == null) rx_chan = new("XACT Rx Channel", inst); this.rx_chan = rx_chan; if (tx_factory == null) tx_factory = new; this.tx_factory = tx_factory; this.reset_tx_factory = tx_factory; if (rx_factory == null) rx_factory = new; this.rx_factory = rx_factory; this.reset_rx_factory = rx_factory;endfunction: newfunction void XACT::reconfigure(XACT_cfg cfg); if (!this.notify.is_on(XACTOR_IDLE)) begin `vmm_warning(this.log, "Transactor should be reconfigured only when IDLE"); end this.cfg = cfg; // ToDo: Notify any running threads of the new configurationendfunction: reconfigurefunction void XACT::reset_xactor(reset_e rst_type); super.reset_xactor(rst_type); this.tx_chan.flush(); this.rx_chan.flush(); // ToDo: Reset other state information if (rst_type != SOFT_RST) begin // ToDo: Reset state if FIRM or above end if (rst_type == PROTOCOL_RST) begin // ToDo: Reset state if PROTOCOL end if (rst_type == HARD_RST) begin // ToDo: Reset state if HARD or above this.cfg = this.reset_cfg; this.tx_factory = this.reset_tx_factory; this.rx_factory = this.reset_rx_factory; endendfunction: reset_xactortask XACT::main(); super.main(); fork tx_monitor(); rx_monitor(); joinendtask: maintask XACT::tx_monitor(); forever begin TR tr; // ToDo: Wait for start of transaction $cast(tr, this.tx_factory.copy()); `vmm_callback(XACT_callbacks, pre_tx_trans(this, tr)); tr.notify.indicate(vmm_data::STARTED); this.notify.indicate(this.OBS_ON_TX, tr); `vmm_trace(this.log, "Starting Tx transaction..."); // ToDo: Observe transaction `vmm_trace(this.log, "Completed Tx transaction..."); `vmm_debug(this.log, tr.psdisplay(" ")); this.notify.reset(this.OBS_ON_TX); tr.notify.indicate(vmm_data::ENDED); `vmm_callback(XACT_callbacks, post_tx_trans(this, tr)); this.tx_chan.sneak(tr); endendtask: tx_monitortask XACT::rx_monitor(); forever begin TR tr; // ToDo: Wait for start of transaction $cast(tr, this.rx_factory.copy()); `vmm_callback(XACT_callbacks, pre_rx_trans(this, tr)); tr.notify.indicate(vmm_data::STARTED); this.notify.indicate(this.OBS_ON_RX, tr); `vmm_trace(this.log, "Starting Rx transaction..."); // ToDo: Observe transaction `vmm_trace(this.log, "Completed Tx transaction..."); `vmm_debug(this.log, tr.psdisplay(" ")); this.notify.reset(this.OBS_ON_RX); tr.notify.indicate(vmm_data::ENDED); `vmm_callback(XACT_callbacks, post_rx_trans(this, tr)); this.rx_chan.sneak(tr); endendtask: rx_monitor`endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -