test_sequence.spec 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. # test_sequence.spec — проверочная последовательность для spec_server.
  2. status
  3. params
  4. defaults
  5. params
  6. set dur 100
  7. set mask 0x0001
  8. start ttl
  9. waitidle 1000
  10. status
  11. set dur 20
  12. set mask 0x0003
  13. set freq 2500000
  14. set phase 0
  15. set env 2 8191
  16. # scale <= 8191: пик всех четырёх таблиц ровно 8191,
  17. # выше срез [26:13] переполняется
  18. set pulse 10
  19. start rf
  20. waitidle 1000
  21. status
  22. # Почему между звеньями waitbuf, а не wait. Маска и длительность — немедленные
  23. # параметры: ttl_controller защёлкивает их (pend_mask/pend_dur) в тот момент,
  24. # когда старт до него доходит. Пока команда лежит в буфере axi_opcode_ctrl, она
  25. # ещё ничего не защёлкнула — поменяй маску сейчас, и уже поставленное в очередь
  26. # событие уедет с чужой. waitbuf ждёт снятия buf_valid, то есть момента, когда
  27. # команда ушла из буфера в тракт и параметры зафиксированы.
  28. #
  29. # Глубина очереди — три события (буфер + слот ttl_controller + идущее), поэтому
  30. # цепочка идёт без разрывов между окнами.
  31. set dur 20
  32. set mask 0xFFFF
  33. set pulse 10
  34. start rf
  35. waitbuf 1000
  36. set dur 50
  37. set mask 0x0000
  38. start ttl
  39. waitbuf 1000
  40. set dur 1000
  41. set mask 0xFFFF
  42. start ttl
  43. waitidle 5000
  44. status
  45. set dur 20
  46. set mask 0xFFFF
  47. set pulse 10
  48. start rf
  49. waitbuf 1000
  50. start rf
  51. waitbuf 1000
  52. start rf
  53. waitidle 5000
  54. status
  55. # ---------------------------------------------------------------------------
  56. # Секвенсор: та же пачка из трёх РЧ-импульсов подряд, но загруженная в BRAM и
  57. # запущенная одной командой. seqbegin переводит cmd_send в режим загрузки —
  58. # то же самое "opcode, потом param", что и в live-режиме, только вместо
  59. # event_controller слово дописывается в память секвенсора по
  60. # автоинкрементному указателю. Контракты (Найквист, env_id, длина огибающей
  61. # и т.д.) проверяются ТЕМИ ЖЕ обработчиками, что и в live-режиме — просто на
  62. # "теневой" структуре состояния для загрузки, а не на боевой. seqend
  63. # возвращает cmd_send к live-пути.
  64. #
  65. # Внутри загруженной программы waitbuf не нужен: слова уже лежат в BRAM в
  66. # нужном порядке до старта, между ними нет сетевого окна, в которое можно
  67. # было бы влезть с изменением маски/длительности — тот самый гоночный
  68. # сценарий, который выше решался через waitbuf, здесь структурно невозможен.
  69. # ---------------------------------------------------------------------------
  70. seqbegin
  71. set dur 20
  72. set mask 0xFFFF
  73. set pulse 10
  74. set env 3 8191
  75. start rf
  76. set dur 20
  77. set mask 0x0000
  78. set pulse 10
  79. set env 1 8191
  80. start rf
  81. set dur 20
  82. set mask 0xFFFF
  83. set pulse 10
  84. set env 2 8191
  85. start rf
  86. seqend
  87. status
  88. seqrun
  89. waitseq 1000
  90. waitidle 5000
  91. status
  92. # То же самое для цепочки TTL-guard / РЧ / TTL-guard из блока выше — там
  93. # между звеньями waitbuf обязателен. В загруженной программе он не нужен по
  94. # той же причине.
  95. seqbegin
  96. set dur 20
  97. set mask 0xFFFF
  98. set pulse 10
  99. start rf
  100. set dur 50
  101. set mask 0x0000
  102. start ttl
  103. set dur 1000
  104. set mask 0xFFFF
  105. start ttl
  106. seqend
  107. seqrun
  108. waitseq 1000
  109. waitidle 5000
  110. status
  111. # ---------------------------------------------------------------------------
  112. # seqabort — прерывание проигрывания программы до её естественного конца.
  113. # Первое событие короткое и успевает начаться до host-задержки в 5 мс, второе
  114. # (TTL на 2 мс) должно быть прервано и не доиграть до конца.
  115. # ---------------------------------------------------------------------------
  116. seqbegin
  117. set dur 2000
  118. set mask 0xFFFF
  119. set pulse 1000
  120. start rf
  121. set dur 2000
  122. set mask 0xFFFF
  123. start ttl
  124. seqend
  125. seqrun
  126. wait 5
  127. seqabort
  128. waitidle 5000
  129. status
  130. defaults
  131. params
  132. echo === готово, все команды приняты ===
  133. # Проверка отказов по контрактам вынесена в test_contracts.spec: там команды
  134. # заведомо ошибочные, и код возврата у прогона будет ненулевой.
  135. #
  136. # python spec_client.py --host <плата> --run test_contracts.spec -k