// // Template for VMM-compliant transaction descriptor // // Name of transaction descriptor class // `ifndef TR__SV `define TR__SV `include "vmm.sv" class TR extends vmm_data; static vmm_log log = new("TR", "class"); // ToDo: Modify/add symbolic transaction identifiers to match typedef enum {READ, WRITE } kinds_e; rand kinds_e kind; // ToDo: Add relevant class properties to define all transactions // ToDo: Modify/add symbolic transaction identifiers to match typedef enum {IS_OK, ERROR} status_e; rand status_e status; constraint TR_valid { // ToDo: Define constraint to make descriptor valid status == IS_OK; } // ToDo: Add constraint blocks to prevent error injection function new(); super.new(this.log); endfunction:new virtual function string psdisplay(string prefix = ""); // ToDo: Implement this method endfunction:psdisplay virtual function bit is_valid(bit silent = 1, input int kind = -1); // ToDo: Implement this method endfunction:is_valid virtual function vmm_data allocate(); TR tr = new; allocate = tr; endfunction:allocate virtual function vmm_data copy(vmm_data cpy = null); TR to; // Copying to a new instance? if (cpy == null) to = new; else // Copying to an existing instance. Correct type? if (!$cast(to, cpy)) begin `vmm_fatal(this.log, "Attempting to copy to a non TR instance"); return null; end super.copy_data(to); to.kind = this.kind; // ToDo: Copy additional class properties copy = to; endfunction:copy virtual function bit compare(vmm_data to, output string diff, input int kind = -1); TR tr; compare = 0; if (to == null) begin `vmm_fatal(this.log, "Cannot compare to NULL instance"); return 0; end if (!$cast(tr,to)) begin `vmm_fatal(this.log, "Attempting to compare to a non TR instance"); return 0; end if (this.kind != tr.kind) begin $sformat(diff, "Kind %0s != %0s", this.kind, tr.kind); return 0; end // ToDo: Compare additional class properties compare = 1; endfunction:compare virtual function int unsigned byte_size(int kind = -1); // ToDo: Implement this method endfunction:byte_size virtual function int unsigned byte_pack(ref logic [7:0] bytes[], input int unsigned offset = 0, input int kind = -1); // ToDo: Implement this method endfunction:byte_pack virtual function int unsigned byte_unpack(const ref logic [7:0] bytes[], input int unsigned offset = 0, input int len = -1, input int kind = -1); // ToDo: Implement this method endfunction:byte_unpack endclass:TR `vmm_channel(TR) `vmm_atomic_gen(TR, "TR") `vmm_scenario_gen(TR, "TR") `endif