Verwendeter Programmcode in Studienarbeit für ESY1B zum Thema "Verifikation mit SystemVerilog und Python"
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.

multiByteReadWrite.v 7.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. // ------------------ multiByteReadWrite.v ----------------------
  2. `include "timescale.v"
  3. `include "i2cSlaveTB_defines.v"
  4. module multiByteReadWrite();
  5. reg ack;
  6. reg [31:0] readData;
  7. reg [7:0] dataByteRead;
  8. //reg [7:0] dataMSB;
  9. // ------------------ write ----------------------
  10. task write;
  11. input [7:0] i2cAddr;
  12. input [15:0] regAddr;
  13. input [31:0] data;
  14. input stop;
  15. begin
  16. $write("I2C Write: At [0x%0x] = 0x%0x\n", regAddr, data);
  17. //i2c address
  18. testHarness.u_wb_master_model.wb_write(1, `TXR_REG, i2cAddr);
  19. testHarness.u_wb_master_model.wb_write(1, `CR_REG , 8'h90); //STA, WR
  20. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  21. while (dataByteRead[1] == 1'b1) //while trans in progress
  22. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  23. //$write("I2C device address sent, SR = 0x%x\n", dataByteRead );
  24. //slave reg address high byte
  25. testHarness.u_wb_master_model.wb_write(1, `TXR_REG, regAddr[15:8]);
  26. testHarness.u_wb_master_model.wb_write(1, `CR_REG , 8'h10); //WR
  27. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  28. while (dataByteRead[1] == 1'b1) //while trans in progress
  29. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  30. //$write("Slave reg address sent, SR = 0x%x\n", dataByteRead );
  31. //slave reg address low byte
  32. testHarness.u_wb_master_model.wb_write(1, `TXR_REG, regAddr[7:0]);
  33. testHarness.u_wb_master_model.wb_write(1, `CR_REG , 8'h10); //WR
  34. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  35. while (dataByteRead[1] == 1'b1) //while trans in progress
  36. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  37. //$write("Slave reg address sent, SR = 0x%x\n", dataByteRead );
  38. //data[31:24]
  39. testHarness.u_wb_master_model.wb_write(1, `TXR_REG, data[31:24]);
  40. testHarness.u_wb_master_model.wb_write(1, `CR_REG , 8'h10); //WR
  41. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  42. while (dataByteRead[1] == 1'b1) //while trans in progress
  43. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  44. //$write("Data[31:24] sent, SR = 0x%x\n", dataByteRead );
  45. //data[23:16]
  46. testHarness.u_wb_master_model.wb_write(1, `TXR_REG, data[23:16]);
  47. testHarness.u_wb_master_model.wb_write(1, `CR_REG , 8'h10); //WR
  48. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  49. while (dataByteRead[1] == 1'b1) //while trans in progress
  50. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  51. //$write("Data[23:16] sent, SR = 0x%x\n", dataByteRead );
  52. //data[15:8]
  53. testHarness.u_wb_master_model.wb_write(1, `TXR_REG, data[15:8]);
  54. testHarness.u_wb_master_model.wb_write(1, `CR_REG , 8'h10); //WR
  55. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  56. while (dataByteRead[1] == 1'b1) //while trans in progress
  57. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  58. //$write("Data[15:8] sent, SR = 0x%x\n", dataByteRead );
  59. //data[7:0]
  60. testHarness.u_wb_master_model.wb_write(1, `TXR_REG, data[7:0]);
  61. testHarness.u_wb_master_model.wb_write(1, `CR_REG , {1'b0, stop, 6'b010000}); //STO?, WR
  62. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  63. while (dataByteRead[1] == 1'b1) //while trans in progress
  64. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  65. //$write("Data[7:0] sent, SR = 0x%x\n", dataByteRead );
  66. end
  67. endtask
  68. // ------------------ read ----------------------
  69. task read;
  70. input [7:0] i2cAddr;
  71. input [15:0] regAddr;
  72. input [31:0] expectedData;
  73. output [31:0] data;
  74. input stop;
  75. begin
  76. //i2c address
  77. testHarness.u_wb_master_model.wb_write(1, `TXR_REG, i2cAddr); //write
  78. testHarness.u_wb_master_model.wb_write(1, `CR_REG , 8'h90); //STA, WR
  79. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  80. while (dataByteRead[1] == 1'b1) //while trans in progress
  81. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  82. //$write("I2C device address sent, SR = 0x%x\n", dataByteRead );
  83. #5000;
  84. //slave reg address high byte
  85. testHarness.u_wb_master_model.wb_write(1, `TXR_REG, regAddr[15:8]);
  86. testHarness.u_wb_master_model.wb_write(1, `CR_REG , {1'b0, stop, 6'b010000}); //STO?, WR
  87. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  88. while (dataByteRead[1] == 1'b1) //while trans in progress
  89. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  90. //$write("Slave reg address sent, SR = 0x%x\n", dataByteRead );
  91. #5000;
  92. //slave reg address low byte
  93. testHarness.u_wb_master_model.wb_write(1, `TXR_REG, regAddr[7:0]);
  94. testHarness.u_wb_master_model.wb_write(1, `CR_REG , {1'b0, stop, 6'b010000}); //STO?, WR
  95. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  96. while (dataByteRead[1] == 1'b1) //while trans in progress
  97. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  98. //$write("Slave reg address sent, SR = 0x%x\n", dataByteRead );
  99. #5000;
  100. //i2c address
  101. testHarness.u_wb_master_model.wb_write(1, `TXR_REG, {i2cAddr[7:1], 1'b1}); //read
  102. testHarness.u_wb_master_model.wb_write(1, `CR_REG , 8'h90); //STA, WR
  103. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  104. while (dataByteRead[1] == 1'b1) //while trans in progress
  105. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  106. //$write("I2C device address sent, SR = 0x%x\n", dataByteRead );
  107. //data[31:24]
  108. testHarness.u_wb_master_model.wb_write(1, `CR_REG , 8'h20); //RD, ACK
  109. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  110. while (dataByteRead[1] == 1'b1) //while trans in progress
  111. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  112. //$write("Data[31:24] rxed, SR = 0x%x\n", dataByteRead );
  113. testHarness.u_wb_master_model.wb_read(1, `RXR_REG, readData[31:24]);
  114. //data[23:16]
  115. testHarness.u_wb_master_model.wb_write(1, `CR_REG , 8'h20); //RD, ACK
  116. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  117. while (dataByteRead[1] == 1'b1) //while trans in progress
  118. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  119. //$write("Data[23:16] rxed, SR = 0x%x\n", dataByteRead );
  120. testHarness.u_wb_master_model.wb_read(1, `RXR_REG, readData[23:16]);
  121. //data[15:8]
  122. testHarness.u_wb_master_model.wb_write(1, `CR_REG , 8'h20); //RD, ACK
  123. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  124. while (dataByteRead[1] == 1'b1) //while trans in progress
  125. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  126. //$write("Data[15:8] rxed, SR = 0x%x\n", dataByteRead );
  127. testHarness.u_wb_master_model.wb_read(1, `RXR_REG, readData[15:8]);
  128. //data[7:0]
  129. testHarness.u_wb_master_model.wb_write(1, `CR_REG , {1'b0, 1'b0, 6'b101000}); //STO, RD, NAK
  130. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  131. while (dataByteRead[1] == 1'b1) //while trans in progress
  132. testHarness.u_wb_master_model.wb_read(1, `SR_REG , dataByteRead);
  133. //$write("Data[7:0] rxed, SR = 0x%x\n", dataByteRead );
  134. testHarness.u_wb_master_model.wb_read(1, `RXR_REG, readData[7:0]);
  135. data = readData;
  136. if (data != expectedData) begin
  137. $write("***** I2C Read ERROR: At 0x%0x. Expected 0x%0x, got 0x%0x\n", regAddr, expectedData, data);
  138. //$stop;
  139. end
  140. else
  141. $write("[read] I2C Read: At [0x%x] = 0x%0x\n", regAddr, data);
  142. end
  143. endtask
  144. endmodule