Advertisement
Guest User

Untitled

a guest
Jun 24th, 2018
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.42 KB | None | 0 0
  1. ipblock my_arm {
  2. iptype "armsystem";
  3. ipparm "exec=gcddrive";
  4. }
  5.  
  6. ipblock m_req(out data : ns(32)) {
  7. iptype "armsystemsource";
  8. ipparm "core=my_arm";
  9. ipparm "address=0x80000000";
  10. }
  11.  
  12. ipblock m_ack(in data : ns(32)) {
  13. iptype "armsystemsink";
  14. ipparm "core=my_arm";
  15. ipparm "address=0x80000004";
  16. }
  17.  
  18. ipblock m_data_out(out data : ns(32)) {
  19. iptype "armsystemsource";
  20. ipparm "core=my_arm";
  21. ipparm "address=0x80000008";
  22. }
  23.  
  24. ipblock m_data_in(in data : ns(32)) {
  25. iptype "armsystemsink";
  26. ipparm "core=my_arm";
  27. ipparm "address=0x8000000C";
  28. }
  29.  
  30. dp euclid(in m_in, n_in : ns(32);
  31. in go : ns( 1);
  32. out ready : ns( 1);
  33. out gcd : ns(32)) {
  34. reg m, n : ns(32);
  35. sig done : ns(1);
  36.  
  37. always { done = ((m==0) | (n==0));
  38. ready = done;
  39. gcd = (m > n) ? m : n;
  40. m = go ? m_in : ((m > n) ? m - n : m);
  41. n = go ? n_in : ((n >= m) ? n - m : n);
  42. }
  43. }
  44.  
  45. dp tb_euclid {
  46. sig m, n : ns(32);
  47. sig ready : ns(1);
  48. sig go : ns(1);
  49. sig gcd : ns(32);
  50. use euclid(m, n, go, ready, gcd);
  51.  
  52. use my_arm;
  53.  
  54. sig req, ack, data_out, data_in : ns(32);
  55. use m_req(req);
  56. use m_ack(ack);
  57. use m_data_out(data_out);
  58. use m_data_in(data_in);
  59.  
  60. reg r_req : ns(1);
  61. reg r_done : ns(1);
  62. reg r_m, r_n : ns(32);
  63.  
  64. always { r_req = req;
  65. r_done = ready;
  66. data_in = gcd;
  67. m = r_m;
  68. n = r_n;
  69. }
  70. sfg ack1 { ack = 1; }
  71. sfg ack0 { ack = 0; }
  72. sfg getm { r_m = data_out; }
  73. sfg getn { r_n = data_out; }
  74. sfg start{ go = 1; }
  75. sfg wait { go = 0; }
  76. }
  77.  
  78. fsm ctl_tb_euclid(tb_euclid) {
  79. initial s0;
  80. state s1, s2, s3, s4, s5, s6;
  81.  
  82. @s0 (ack0, wait) -> s1;
  83.  
  84. // read m
  85. @s1 if (r_req) then (getm, ack1, wait) -> s2;
  86. else (ack0, wait) -> s1;
  87. // read n
  88. @s2 if (~r_req) then (getn, ack0, wait) -> s3;
  89. else (ack1, wait) -> s2;
  90.  
  91. // compute
  92. @s3 (start, ack0) -> s4;
  93. @s4 if (r_done) then (ack0, wait) -> s5;
  94. else (ack0, wait) -> s4;
  95.  
  96. // output result
  97. @s5 if (r_req) then (ack1, wait) -> s6;
  98. else (ack0, wait) -> s5;
  99. @s6 if (~r_req) then (ack0, wait) -> s1;
  100. else (ack1, wait) -> s6;
  101. }
  102.  
  103. system S {
  104. tb_euclid;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement