neuron.sv 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. // synopsys translate_off
  2. `timescale 1 ps / 1 ps
  3. // synopsys translate_on
  4. /*
  5. ______ _________
  6. w[i] =>| MULT |==>| |
  7. x[i] =>|______| | |
  8. ______ | |
  9. w[i+1] =>| MULT |==>| CASCADE | _____
  10. x[i+1] =>|______| | | b =>| ADD |
  11. . | ADDER |====>|_____|==> y
  12. . | |
  13. ______ | |
  14. w[M-1] =>| MULT |==>| |
  15. x[M-1] =>|______| |_________|
  16. */
  17. module neuron#(parameter K, N=32)(x, y, w, b, ack, stb, right, clk, rst);
  18. localparam M = 2**K;
  19. input wire [N-1:0] x [M-1:0];
  20. input wire [N-1:0] w [M-1:0];
  21. input wire [N-1:0] b;
  22. output logic [N-1:0] y;
  23. input wire clk;
  24. input wire rst;
  25. output wire [M-1:0] ack;
  26. input wire [M-1:0] stb;
  27. abus_io inner_io0[M-1:0]();
  28. abus_io inner_io1();
  29. abus_io right;
  30. wire [N-1:0] inner_w [M-1:0];
  31. wire [N-1:0] casc_w;
  32. genvar i;
  33. generate
  34. for(i=0;i<M;i++) begin: gen_mult_layer
  35. multiplier mult(
  36. .clk(clk),
  37. .rst(rst),
  38. .input_a(x[i]),
  39. .input_b(w[i]),
  40. .input_stb(stb[i]),
  41. .input_ack(ack[i]),
  42. .output_z(inner_w[i]),
  43. .output_z_ack(inner_io0[i].ack),
  44. .output_z_stb(inner_io0[i].stb)
  45. );
  46. end
  47. endgenerate
  48. adder_casc#(.K(K), .N(N)) adder0(
  49. .clk(clk),
  50. .rst(rst),
  51. .x(inner_w),
  52. .y(casc_w),
  53. .left(inner_io0),
  54. .right(inner_io1)
  55. );
  56. adder adder1 (
  57. .clk(clk),
  58. .rst(rst),
  59. .input_a(b),
  60. .input_b(casc_w),
  61. .input_stb(inner_io1.stb),
  62. .input_ack(inner_io1.ack),
  63. .output_z(y),
  64. .output_z_ack(right.ack),
  65. .output_z_stb(right.stb)
  66. );
  67. endmodule : neuron
  68. module neuron_tb;
  69. logic clk, rst;
  70. logic [31:0] x [7:0];
  71. logic [31:0] w [7:0];
  72. logic [31:0] b;
  73. logic [31:0] y;
  74. logic ack [7:0];
  75. logic stb [7:0];
  76. abus_io left[7:0]();
  77. abus_io right();
  78. neuron#(.K(3)) neu0(
  79. .clk(clk),
  80. .rst(rst),
  81. .x(x),
  82. .y(y),
  83. .w(w),
  84. .b(b),
  85. .ack(),
  86. .stb(),
  87. .right(right)
  88. );
  89. genvar k;
  90. generate
  91. for(k=0; k<8; k++) begin : io_mapper
  92. assign left[k].stb = stb[k];
  93. assign ack[k] = left[k].ack;
  94. end
  95. endgenerate
  96. initial forever #5 clk = ~clk;
  97. initial begin
  98. clk = 0;
  99. rst = 1;
  100. foreach(stb[i]) stb[i] = 0;
  101. right.ack = 0;
  102. b = 'h3f000000;
  103. w = {
  104. 'h3fa00000, 'h3fa00000, 'h3fa00000, 'h3fa00000,
  105. 'h3fa00000, 'h3fa00000, 'h3fa00000, 'h3fa00000
  106. };
  107. x = {
  108. // 'h3fa00000, 'h3fa00000, 'h3fa00000, 'h3fa00000,
  109. // 'h3fa00000, 'h3fa00000, 'h3fa00000, 'h3fa00000
  110. 'h417a0000, 'h40fa0000, 'h41fa0000, 'h427a0000,
  111. 'h407a0000, 'h40780000, 'h40440000, 'h40cc0000
  112. };
  113. #10;
  114. rst = 0;
  115. foreach(stb[i]) stb[i] = 1;
  116. #20;
  117. foreach(stb[i]) stb[i] = 0;
  118. wait(right.stb == 1);
  119. right.ack = 1;
  120. #10
  121. wait(right.stb == 0);
  122. right.ack = 0;
  123. end
  124. endmodule : neuron_tb