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.

testHarness.v 2.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. // -------------------------- testHarness.v -----------------------
  2. `include "timescale.v"
  3. module testHarness ();
  4. reg rst;
  5. reg clk;
  6. reg i2cHostClk;
  7. wire sda;
  8. wire scl;
  9. wire sdaOutEn;
  10. wire sdaOut;
  11. wire sdaIn;
  12. wire [2:0] adr;
  13. wire [7:0] masterDout;
  14. wire [7:0] masterDin;
  15. wire we;
  16. wire stb;
  17. wire cyc;
  18. wire ack;
  19. wire scl_pad_i;
  20. wire scl_pad_o;
  21. wire scl_padoen_o;
  22. wire sda_pad_i;
  23. wire sda_pad_o;
  24. wire sda_padoen_o;
  25. // tb passthrough
  26. reg tb_readEn;
  27. reg tb_writeEn;
  28. reg [15:0] tb_addr;
  29. reg [15:0] tb_dataIn;
  30. wire [15:0] tb_dataOut;
  31. initial begin
  32. $dumpfile("wave.vcd");
  33. $dumpvars(0, testHarness);
  34. end
  35. i2cSlave u_i2cSlave(
  36. .clk(clk),
  37. .rst(rst),
  38. .sda(sda),
  39. .scl(scl),
  40. .tb_readEn(tb_readEn),
  41. .tb_writeEn(tb_writeEn),
  42. .tb_addr(tb_addr),
  43. .tb_dataIn(tb_dataIn),
  44. .tb_dataOut(tb_dataOut)
  45. );
  46. i2c_master_top #(.ARST_LVL(1'b1)) u_i2c_master_top (
  47. .wb_clk_i(clk),
  48. .wb_rst_i(rst),
  49. .arst_i(rst),
  50. .wb_adr_i(adr),
  51. .wb_dat_i(masterDout),
  52. .wb_dat_o(masterDin),
  53. .wb_we_i(we),
  54. .wb_stb_i(stb),
  55. .wb_cyc_i(cyc),
  56. .wb_ack_o(ack),
  57. .wb_inta_o(),
  58. .scl_pad_i(scl_pad_i),
  59. .scl_pad_o(scl_pad_o),
  60. .scl_padoen_o(scl_padoen_o),
  61. .sda_pad_i(sda_pad_i),
  62. .sda_pad_o(sda_pad_o),
  63. .sda_padoen_o(sda_padoen_o)
  64. );
  65. wb_master_model #(.dwidth(8), .awidth(3)) u_wb_master_model (
  66. .clk(clk),
  67. .rst(rst),
  68. .adr(adr),
  69. .din(masterDin),
  70. .dout(masterDout),
  71. .cyc(cyc),
  72. .stb(stb),
  73. .we(we),
  74. .sel(),
  75. .ack(ack),
  76. .err(1'b0),
  77. .rty(1'b0)
  78. );
  79. assign sda = (sda_padoen_o == 1'b0) ? sda_pad_o : 1'bz;
  80. assign sda_pad_i = sda;
  81. pullup(sda);
  82. assign scl = (scl_padoen_o == 1'b0) ? scl_pad_o : 1'bz;
  83. assign scl_pad_i = scl;
  84. pullup(scl);
  85. // ****************************** Clock section ******************************
  86. //approx 48MHz clock
  87. `define CLK_HALF_PERIOD 10
  88. always begin
  89. #`CLK_HALF_PERIOD clk <= 1'b0;
  90. #`CLK_HALF_PERIOD clk <= 1'b1;
  91. end
  92. // ****************************** reset ******************************
  93. task reset;
  94. begin
  95. rst <= 1'b1;
  96. @(posedge clk);
  97. @(posedge clk);
  98. @(posedge clk);
  99. @(posedge clk);
  100. @(posedge clk);
  101. @(posedge clk);
  102. rst <= 1'b0;
  103. @(posedge clk);
  104. @(posedge clk);
  105. @(posedge clk);
  106. end
  107. endtask
  108. endmodule