
Студенты обожают ChatGPT. В идеале, они хотят закоротить профессора и чатгопоту напрямую, то есть посылать задачу от профессора гопоте, пересылать ответ профессору, возражения слать гопоте назад итд - пока не получится решения. Лучше всего это делать скриптом, чтобы студент вообще не был вовлечен в решение задачи и занимался своими студенческими делами, пока чатгопота и профессор разговаривают.
Как же обломать крылья этой мечте? Запрещать чатгпт бессмысленно, но как сделать так, чтобы с чатгпт стало сильно труднее чем без него? Чтобы студенты пинали его и так и сяк, но решения бы не получалось, а вот у студентов, которые решили сесть и подумать сами - решение бы получалось?
Можно использовать факт, что гопота - это статический анализатор текста. “Статический” означает что если какой-то информации в тексте задачи нет, а также ее нет в тренировочных данных гопоты - то для гопоты этой информации нет во вселенной вообще, оно пытается гадать и попадает пальцем в небо. Хотя во вселенной такая информация вполне может существовать - просто чтобы ее получить, нужно запустить некую программу.
Иными словами, чтобы не дать гопоте прорваться, нужно чтобы критичная для решения задачи информация не присутствовала в условии, а возникала в процессе решения в результате процесса, который гопота не может повторить. Например:
Критичная информация: количество тактов между событиями. Процесс, который гопота не может повторить: симуляция на уровне регистровых передач.
Критичная информация: задержка на пути комбинационной логики. Процесс, который гопота не может повторить: логический синтез из языков описания аппаратуры.
Мы с соратниками по Школе Синтеза Цифровых Схем сконструировали такую задачу и я опробовал ее на ~30 студентах, которые контактировали меня в LinkedIn с просьбой дать им рекомендацию. Я попросил каждого написать конвейерный блок на языке описания аппаратуры SystemVerilog, который реализует вычисление простой формулы с плавающей точкой. Формула у каждого студента индивидуальна. Два требования: блок студента должен использовать данные мною подблоки для сложения, умножения и вычитания, а также данное мною тестовое окружение.

Вот как выглядит задание:
Please read the following article and implement two exercises from it, but using a different formula. Not b²-4*a*c, but (b - c) * (5 - c - a) + a:
First Exercise 3:
Exercise 3. A pipelined implementation capable of accepting the formula arguments back-to-back, getting each clock cycle a new set of arguments, indefinitely and without gaps.
once it is ready, show it to me and implement Exercise 2:
Exercise 2. An FSM-based implementation that uses a minimal number of arithmetic blocks but uses the fact that these blocks are pipelined inside. This assumption can reduce the number of FSM states.
Once you are done, we will schedule a Zoom call and I will ask you some follow-up questions.
Подблоки, которые требуется использовать, являются кентаврами, сконструированными из кода в двух разных репозиториях гитхаба:
Врапперы для импортированных подблоков в репозитории задач домашки Школы Синтеза, yuri-panchul/systemverilog-homework.
FPU открытого RISC-V процессора Wally, openhwgroup/cvw.
Для решения задачи необходимо знать латентность каждого подблока. Но этой информации в условии задачи нет. Чтобы узнать латентность, нужно сделать одно из трех действий:
Проанализировать кучу кода из двух репозиторий.
Запустить код в симуляторе и понять латентность из временных диаграмм.
Прочитать книжку издательства Elsevier, которая еще не вышла.
Гопота не может сделать ни первое, ни второе, ни третье. Оно также не может понять как проверяет решение тестовое окружение. Поэтому многие студенты пробуют, приму ли я решение, в котором и подблоки, и тестовое окружение - тоже сгенерировано ChatGPT:

Некоторые хитрые студенты заявляли с энтузиазмом "отличная задача, я напишу еще и подблоки для арифметических операций" - на что я отвечал "нет уж, я же написал в заметке чтобы вы не писали своих подблоков, а использовали как черный ящик те подблоки которые я вам дал ("we require every operation to be treated as a black box"). Суть упражнения - проверить как вы можете работать в команде, с подблоками, написанными другими людьми и с чужим тестовым окружением. Решение с вашими подблоками я не приму".
Другие студенты присылали мне временные диаграммы с вопросом, правильна ли она. Код они мне присылать стеснялись, так как наверняка от него сильно пахло чат-гопотой, и перед тем как это чистить, присылали диаграмму.
Я смотрел на диаграмму и видел, что в ней явно не мои подблоки и не моя testbench, и вообще вместо 64-битных чисел с плавающей точкой стоят 32-битные целые числа. Но зато (!) результат появлялся аккурат на шестом такте, как на иллюстрации в моей заметке (хотя он должен был при правильном решении появляться не на шестом). Все понятно, человек скормил чатугопоте картинку из моей заметки и одну фразу из задания и попросил сделать как на картинке.
Пришлось в явной форме дописать в заметку, что результат появляется не на шестом такте, что картинка абстрактная, и что ему нужно самому определить на каком такте появляется результат, исходя из латентности подблоков:
Note: the diagram does not show the real pipeline latency (i.e. the result does not have to be ready on the 6th clock). A student has to figure out the actual latency based on the latencies of the sub-blocks and his microarchitecture.
Еще была попытка разговорить меня дополнительными вопросами, чтобы мои ответы скормить чатугпт в качестве промпта. По‑видимому стратегия студента была довести его триаду «тест‑блок‑подблоки» до кондиции, когда блок станет проходить и его тест с его подблоками, и мой тест с моими подблоками. Когда я понял, что происходит, я просто сказал студенту «вы должны справиться на основе информации в заметке и диаграммах в ней».
Короче из 30 человек до конца эпопеи дошли двое, причем ни один, ни другой чатгпт скорее всего не использовали. Правда один сделал решение с неоптимальным энергопотреблением (пришлось просветить его в этом аспекте творчества), а другой сделал вариант ошибки, при которой новые данные переписывали старые, но сам ее исправил после моего предложения помедитировать над временными диаграммами денек.

Итак я описал два приема сбивания с толку чатгопоту с помощью требований, что:
Решение должно быть совместимым с заданным тестовым окружением, которое гопота не может проанализировать. Например гопота не может статически проанализировать последовательность вталкиваний данных в очередь и последующих выталкиваний. См. testbench.sv, строки 310-367.
Замечу что человеку для решения задачи не нужно анализировать тестовое окружение. Ему нужно понять, какая латентность подблоков и сделать корректный дизайн на основе описания в заметке.Решение должно использовать заданные подблоки, которые гопота проанализировать не может. Подблоки гопота не может проанализировать потому что информация разбросана по разным файлам, а финальный набор подблоков - это кентавр из кода двух репозиториев, который еще и отредактирован скриптом перед запуском симуляции.
Но эти два приема - не единственные, которые вызвали трудности у студентов, которые пытались запинать чатгпт вместо того, чтобы сесть и разобраться, как самому решать задачи такого рода. В этой задаче гопоту сбивает с толку еще и микроархитектурный аспект, но я предоставлю обсуждение его комментаторам.
В диаграммах я использовал иконки с сайта Freepik - Flaticon: Centaur, Themis и Student.