You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

185 rivejä
6.0 KiB

  1. import uvm_pkg::*;
  2. typedef enum bit[1:0] { FIXED, INCR, WRAP } B_TYPE;
  3. // Class: axi_transaction
  4. //
  5. class axi_transaction#(d_width = 16, a_width = 16) extends uvm_sequence_item;
  6. typedef axi_transaction#(d_width, a_width) this_type_t;
  7. `uvm_object_param_utils(axi_transaction#(d_width, a_width));
  8. // Group: Variables
  9. bit [8:0] id;
  10. rand bit [a_width-1:0] addr;
  11. rand bit write;
  12. rand bit [7:0] data [][];
  13. rand bit [2:0] b_size;
  14. rand bit [3:0] b_len;
  15. rand B_TYPE b_type;
  16. bit b_last;
  17. bit [1:0] b_resp;
  18. bit [1:0] r_resp [];
  19. // Group: Constraints
  20. constraint b_size_val { 8*(2**b_size) <= d_width; }
  21. constraint data_size {
  22. /* solve order constraints */
  23. solve b_len before data;
  24. solve b_size before data;
  25. /* rand variable constraints */
  26. data.size() == b_len+1;
  27. foreach (data[i] )
  28. data[i].size() == 2**b_size;
  29. }
  30. constraint b_len_val {
  31. /* solve order constraints */
  32. solve b_type before b_len;
  33. /* rand variable constraints */
  34. if(b_type == FIXED)
  35. b_len inside { 0, 1 };
  36. else if(b_type == WRAP)
  37. b_len inside { 1, 3, 7, 15 };
  38. }
  39. constraint addr_val {
  40. /* solve order constraints */
  41. solve b_type before addr;
  42. solve b_size before addr;
  43. /* rand variable constraints */
  44. if(b_type == WRAP)
  45. addr == int'(addr/2**b_size) * 2**b_size;
  46. }
  47. constraint addr_val_align {
  48. /* solve order constraints */
  49. solve b_size before addr;
  50. /* rand variable constraints */
  51. addr == int'(addr/2**b_size) * 2**b_size;
  52. }
  53. constraint addr_val_unalign {
  54. /* solve order constraints */
  55. solve b_size before addr;
  56. /* rand variable constraints */
  57. addr != int'(addr/2**b_size) * 2**b_size;
  58. }
  59. // Constructor: new
  60. function new(string name = "axi_transaction");
  61. super.new(name);
  62. endfunction: new
  63. // Function: do_copy
  64. extern function void do_copy(uvm_object rhs);
  65. // Function: do_compare
  66. extern function bit do_compare(uvm_object rhs, uvm_comparer comparer);
  67. // Function: convert2string
  68. extern function string convert2string();
  69. // Function: do_print
  70. extern function void do_print(uvm_printer printer);
  71. // Function: do_record
  72. // extern function void do_record(uvm_recorder recorder);
  73. // Function: do_pack
  74. // extern function void do_pack();
  75. // Function: do_unpack
  76. // extern function void do_unpack();
  77. endclass: axi_transaction
  78. /*----------------------------------------------------------------------------*/
  79. /* Functions */
  80. /*----------------------------------------------------------------------------*/
  81. function void axi_transaction::do_print(uvm_printer printer);
  82. /* chain the print with parent classes */
  83. super.do_print(printer);
  84. /* list of local properties to be printed: */
  85. printer.print_field("ID", id, $bits(id), UVM_UNSIGNED);
  86. printer.print_field("Addr", addr, $bits(addr), UVM_HEX);
  87. printer.print_generic("Data", "dynamic array", 8*2**b_size*(b_len+1), $sformatf("%u", data));
  88. printer.print_field("Burst Size", b_size, $bits(b_size), UVM_UNSIGNED);
  89. printer.print_field("Burst Length", b_len+1, $bits(b_len), UVM_UNSIGNED);
  90. printer.print_generic("Burst Type", "B_TYPE", $bits(b_len), b_type.name());
  91. endfunction: do_print
  92. function string axi_transaction::convert2string();
  93. string s;
  94. /* chain the convert2string with parent classes */
  95. s = super.convert2string();
  96. /* list of local properties to be printed: */
  97. // guide 0---4---8--12--16--20--24--28--32--36--40--44--48--
  98. s = {s, $sformatf("ID : %0d\n", id)};
  99. s = {s, $sformatf("Addr : 0x%0h\n", addr)};
  100. s = {s, $sformatf("Data : 0x%0u\n", data)};
  101. s = {s, $sformatf("Busrt Type : %s\n", b_type.name())};
  102. s = {s, $sformatf("Burst Size : %0d\n", b_size)};
  103. s = {s, $sformatf("Busrt Length : %0d\n", b_len+1)};
  104. s = {s, $sformatf("Busrt resp : 0x%0h\n", b_resp)};
  105. s = {s, $sformatf("Read resp : %0u\n", r_resp)};
  106. return s;
  107. endfunction: convert2string
  108. function void axi_transaction::do_copy(uvm_object rhs);
  109. this_type_t rhs_;
  110. if (!$cast(rhs_, rhs)) begin
  111. `uvm_error({this.get_name(), ".do_copy()"}, "Cast failed!");
  112. return;
  113. end
  114. // `uvm_info({this.get_name(), ".do_copy()"}, "Cast succeded.", UVM_HIGH);
  115. /* chain the copy with parent classes */
  116. super.do_copy(rhs);
  117. /* list of local properties to be copied */
  118. this.id = rhs_.id;
  119. this.addr = rhs_.addr;
  120. this.data = rhs_.data;
  121. this.b_type = rhs_.b_type;
  122. this.b_size = rhs_.b_size;
  123. this.b_len = rhs_.b_len;
  124. this.b_resp = rhs_.b_resp;
  125. this.r_resp = rhs_.r_resp;
  126. endfunction: do_copy
  127. function bit axi_transaction::do_compare(uvm_object rhs, uvm_comparer comparer);
  128. this_type_t rhs_;
  129. if (!$cast(rhs_, rhs)) begin
  130. `uvm_error({this.get_name(), ".do_compare()"}, "Cast failed!");
  131. return 0;
  132. end
  133. // `uvm_info({this.get_name(), ".do_compare()"}, "Cast succeded.", UVM_HIGH);
  134. /* chain the compare with parent classes */
  135. do_compare = super.do_compare(rhs, comparer);
  136. /* list of local properties to be compared: */
  137. do_compare &= (
  138. this.id == rhs_.id &&
  139. this.addr == rhs_.addr &&
  140. this.b_type == rhs_.b_type &&
  141. this.b_size == rhs_.b_size &&
  142. this.b_len == rhs_.b_len &&
  143. this.b_resp == rhs_.b_resp
  144. );
  145. foreach(data[i,j]) begin
  146. do_compare &= this.data[i][j] == rhs_.data[i][j];
  147. end
  148. foreach ( r_resp[i] ) begin
  149. do_compare &= this.r_resp[i] == rhs_.r_resp[i];
  150. end
  151. endfunction: do_compare