Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.37 KB | None | 0 0
  1. `timescale 1ns/1ps
  2. `include "uvm_macros.svh"
  3. import uvm_pkg :: *;
  4.  
  5. `define ADDR_WIDTH_IN_BITS 8
  6. `define DATA_WIDTH_IN_BITS 8
  7.  
  8. //-----------------------------------------------------------------------------
  9. // Interface
  10. //-----------------------------------------------------------------------------
  11. interface my_interface(input logic clk,
  12. input logic rstn /* Active Low Reset */);
  13. bit valid;
  14. logic [`ADDR_WIDTH_IN_BITS - 1 : 0] start_addr;
  15. reg [`DATA_WIDTH_IN_BITS - 1 : 0] data_reg;
  16. wire [`DATA_WIDTH_IN_BITS - 1 : 0] data;
  17. int unsigned length_in_bytes;
  18.  
  19. assign data = data_reg;
  20. endinterface : my_interface
  21.  
  22. typedef virtual my_interface my_vif;
  23. typedef class my_agent;
  24.  
  25. //-----------------------------------------------------------------------------
  26. // Agent Configuration Class
  27. //-----------------------------------------------------------------------------
  28. class my_agent_cfg extends uvm_object;
  29. // virtual interface
  30. my_vif vif;
  31. // The length of time, in ps, that reset will stay active
  32. int unsigned reset_time_ps = 10;
  33. // Minimum length of payload data
  34. int unsigned min_payload_length = 5;
  35. // Maximum length of payload data
  36. int unsigned max_payload_length = 100;
  37. uvm_active_passive_enum is_active = UVM_ACTIVE;
  38.  
  39. `uvm_object_utils_begin(my_agent_cfg)
  40. `uvm_field_enum(uvm_active_passive_enum, is_active, UVM_DEFAULT)
  41. `uvm_field_int(reset_time_ps, UVM_DEFAULT | UVM_DEC)
  42. `uvm_field_int(min_payload_length, UVM_DEFAULT | UVM_DEC)
  43. `uvm_field_int(max_payload_length, UVM_DEFAULT | UVM_DEC)
  44. `uvm_object_utils_end
  45.  
  46. function new(string name="my_agent_cfg");
  47. super.new(name);
  48. endfunction : new
  49.  
  50. function void is_valid();
  51. if (max_payload_length < min_payload_length) begin
  52. `uvm_error(get_name(),
  53. $sformatf("Value of max_payload_length is shall be greater or equal to value of min_payload_length, configured values of max_payload_length:%0d, min_payload_length:%0d",
  54. max_payload_length, min_payload_length))
  55. end
  56. if (reset_time_ps <= 0) begin
  57. `uvm_error(get_name(), $sformatf("reset_time_ps shall be greater than 0"))
  58. end
  59. endfunction : is_valid
  60. endclass : my_agent_cfg
  61.  
  62. //-----------------------------------------------------------------------------
  63. // Sequence Item Class
  64. //-----------------------------------------------------------------------------
  65. class my_seq_item extends uvm_sequence_item;
  66. // Random varialbes
  67. rand logic [`ADDR_WIDTH_IN_BITS - 1 : 0] start_addr;
  68. rand logic [`DATA_WIDTH_IN_BITS - 1 : 0] data[];
  69. rand int unsigned payload_length;
  70. // Non random variables
  71. my_agent_cfg cfg;
  72.  
  73. `uvm_object_utils_begin(my_seq_item)
  74. `uvm_field_int (start_addr, UVM_DEFAULT | UVM_HEX)
  75. `uvm_field_int (payload_length, UVM_DEFAULT | UVM_DEC)
  76. `uvm_field_array_int (data, UVM_DEFAULT | UVM_HEX)
  77. `uvm_object_utils_end
  78.  
  79. constraint length_cn {
  80. payload_length inside {[cfg.min_payload_length : cfg.max_payload_length]};
  81. data.size == payload_length;
  82. }
  83. constraint order_cn {
  84. solve payload_length before data;
  85. }
  86.  
  87. function new(string name="my_seq_item");
  88. super.new(name);
  89. endfunction : new
  90.  
  91. function string convert2string();
  92. convert2string = $sformatf("start_addr:%0h, payload_length:%0d, data[0]:%0h, data[%0d]:%0h",
  93. start_addr, payload_length, data[0], payload_length-1, data[payload_length-1]);
  94. endfunction : convert2string
  95. endclass : my_seq_item
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement