Guest User

Untitled

a guest
May 21st, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.71 KB | None | 0 0
  1. from myhdl import *
  2.  
  3. @block
  4. def grant_selector(request, grant, request_bit):
  5.  
  6. if request_bit == 0:
  7. @always_comb
  8. def selector():
  9. grant.next = request[request_bit]
  10.  
  11. else:
  12. @always_comb
  13. def selector():
  14.  
  15. if request[request_bit:] != 0:
  16. grant.next = False
  17.  
  18. else:
  19. grant.next = request[request_bit]
  20.  
  21. return selector
  22.  
  23. @block
  24. def request_rotate(request, reordered_request, rotate):
  25. bits = len(request)
  26.  
  27. if rotate > 0:
  28. @always_comb
  29. def reorder():
  30. reordered_request.next[:rotate] = request[bits-rotate:]
  31. reordered_request.next[rotate:] = request[:bits-rotate]
  32.  
  33. else:
  34. @always_comb
  35. def reorder():
  36. reordered_request.next = request
  37.  
  38. return reorder
  39.  
  40.  
  41. @block
  42. def grant_derotate(grant, rotated_grant, rotate):
  43. bits = len(grant)
  44.  
  45. if rotate > 0:
  46. @always_comb
  47. def reorder():
  48. grant.next[bits-rotate:] = rotated_grant[:rotate]
  49. grant.next[:bits-rotate] = rotated_grant[rotate:]
  50.  
  51. else:
  52. @always_comb
  53. def reorder():
  54. grant.next = rotated_grant
  55.  
  56. return reorder
  57.  
  58.  
  59. @block
  60. def rr_arbiter(clk, req, grant):
  61. '''The architecture here is we generate a list of rotated requests
  62. (with associated block to do the rotation). The specific rotated request
  63. is set by the arbiter_position index.
  64.  
  65. The grant bit is then set if all the lower bits than it in the rotated
  66. request are not set, and that bit is.
  67.  
  68. Of course, that means the resultant grant bit vector is rotated, so we
  69. need to derotate it. This is done by broadcasting to a set of signals
  70. that are then each derotated, and the correct derotated signal is
  71. selected using the arbiter_position index.
  72.  
  73. The policy is for arbiter_position index to increment on every cycle.
  74. '''
  75. n = len(req)
  76. assert len(req) == len(grant)
  77.  
  78. arbiter_position = intbv(0, min=0, max=n)
  79.  
  80. rotated_reqs = [Signal(intbv(0)[n:]) for each in range(n)]
  81.  
  82. sel_rotators = []
  83. for p, rotated_req in enumerate(rotated_reqs):
  84. sel_rotators.append(request_rotate(req, rotated_req, p))
  85.  
  86. rot_grant_bits = [Signal(False) for each in range(n)]
  87. current_rotated_req = Signal(intbv(0)[n:])
  88. grant_selectors = []
  89. for p, grant_bit in enumerate(rot_grant_bits):
  90. grant_selectors.append(
  91. grant_selector(current_rotated_req, grant_bit, p))
  92.  
  93. rotated_grant = Signal(intbv(0)[n:])
  94. # We need to clone this to all the output rotations
  95. rotated_grants = [Signal(intbv(0)[n:]) for each in range(n)]
  96. # This maps to a set of grants which the multiplexor selects
  97. grants = [Signal(intbv(0)[n:]) for each in range(n)]
  98.  
  99. grant_derotators = []
  100. for p, (each_grant, each_rotated_grant) in enumerate(
  101. zip(grants, rotated_grants)):
  102. grant_derotators.append(
  103. grant_derotate(each_grant, each_rotated_grant, p))
  104.  
  105. @always_comb
  106. def assign_grant_bits():
  107. for i in range(n):
  108. rotated_grant[i].next = rot_grant_bits[i]
  109.  
  110. @always_comb
  111. def assign_rotated_grants():
  112. for i in range(n):
  113. rotated_grants[i].next = rotated_grant
  114.  
  115. @always(clk.posedge)
  116. def assign_req():
  117. arbiter_position.next = arbiter_position + 1 % n
  118. grant.next = grants[arbiter_position]
  119. current_rotated_req.next = rotated_reqs[arbiter_position]
  120.  
  121. return (sel_rotators, grant_selectors, grant_derotators,
  122. assign_grant_bits, assign_rotated_grants, assign_req)
  123.  
  124. def convert():
  125. clk = Signal(False)
  126. req = Signal(intbv(0)[4:])
  127. grant = Signal(intbv(0)[4:])
  128.  
  129. inst = rr_arbiter(clk, req, grant)
  130. inst.convert()
  131.  
  132.  
  133. if __name__ == '__main__':
  134. convert()
Add Comment
Please, Sign In to add comment