{"id":292668,"date":"2019-07-28T15:00:22","date_gmt":"2019-07-28T15:00:22","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=292668"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=292668","title":{"rendered":"\u0427\u0430\u0441\u0442\u044c 5\/2 \u043a\u043e\u0440\u043f. 1: \u041f\u0435\u0440\u0435\u043a\u0440\u0451\u0441\u0442\u043e\u043a \u043f\u0440\u043e\u0441\u043f\u0435\u043a\u0442\u0430 RocketChip \u0438 \u0441\u043a\u043e\u043b\u044c\u0437\u043a\u043e\u0439 \u0434\u043e\u0440\u043e\u0436\u043a\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438"},"content":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\">\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u0432\u0435\u043b\u0430\u0441\u044c \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043c \u0441 RISC-V \u044f\u0434\u0440\u043e\u043c RocketChip, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e, \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u044f\u0434\u0440\u0430 \u043d\u0430 \u00ab\u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e\u00bb \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043f\u043b\u0430\u0442\u0443 \u0441 \u041f\u041b\u0418\u0421 \u0444\u0438\u0440\u043c\u044b Altera (\u0442\u0435\u043f\u0435\u0440\u044c \u0443\u0436\u0435 Intel). \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0432 <a href=\"https:\/\/habr.com\/ru\/post\/459470\/\">\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0447\u0430\u0441\u0442\u0438<\/a> \u043d\u0430 \u044d\u0442\u043e\u0439 \u043f\u043b\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c Linux. \u0417\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u043c\u0435\u043d\u044f \u0432\u043e \u0432\u0441\u0451\u043c \u044d\u0442\u043e\u043c \u0437\u0430\u0431\u0430\u0432\u043b\u044f\u043b\u043e? \u0422\u043e, \u0447\u0442\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043c RISC-V, C \u0438 Scala, \u0438 \u0438\u0437 \u0432\u0441\u0435\u0445 \u043d\u0438\u0445 Scala \u0431\u044b\u043b\u0430 \u0441\u0430\u043c\u044b\u043c \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c (\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u043d\u0435\u0439 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440).<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b C \u0442\u043e\u0436\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e \u043e\u0431\u0438\u0434\u043d\u043e. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0435\u0441\u043b\u0438 \u0441\u0432\u044f\u0437\u043a\u0430 Scala+Chisel \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u043b\u0438\u0448\u044c \u043a\u0430\u043a <a href=\"https:\/\/en.wikipedia.org\/wiki\/Domain-specific_language\">domain-specific language<\/a> \u0434\u043b\u044f \u044f\u0432\u043d\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u0443\u0440\u044b, \u0442\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u00ab\u0437\u0430\u0442\u044f\u0433\u0438\u0432\u0430\u0442\u044c\u00bb \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430 C \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0432 \u0432\u0438\u0434\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0436\u0435 \u0446\u0435\u043b\u044c \u2014 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0445 AFL-like \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0439 \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 <a href=\"https:\/\/habr.com\/ru\/post\/452608\/\">QInst<\/a>, \u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u2014 \u043b\u0438\u0448\u044c \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<p>\u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 (\u0438 \u043d\u0435 \u043e\u0434\u0438\u043d) \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440 OpenCL \u0432 RTL. \u0422\u0430\u043a\u0436\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u043b\u0430\u0441\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u0440\u043e \u043d\u0435\u043a\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 COPILOT \u0434\u043b\u044f RISC-V \u0441 \u043f\u043e\u0445\u043e\u0436\u0438\u043c\u0438 \u0446\u0435\u043b\u044f\u043c\u0438 (\u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439), \u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u0433\u0443\u0433\u043b\u0438\u0442\u0441\u044f \u043f\u043b\u043e\u0445\u043e, \u043a \u0442\u043e\u043c\u0443 \u0436\u0435, \u044d\u0442\u043e, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0442\u043e\u0436\u0435 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442. \u041c\u0435\u043d\u044f \u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c OpenSource-\u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043d\u043e \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c, \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0437\u0430\u0431\u0430\u0432\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u0441\u0430\u043c\u043e\u043c\u0443 \u2014 \u0445\u043e\u0442\u044f \u0431\u044b \u043a\u0430\u043a \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u044b\u0439 \u0443\u0447\u0435\u0431\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u0430 \u0442\u0430\u043c \u0443\u0436 \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f&#8230;<\/p>\n<p>  <\/p>\n<p><strong>Disclaimer<\/strong> (\u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a \u043e\u0431\u044b\u0447\u043d\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044e \u043e \u00ab\u043f\u043b\u044f\u0441\u043a\u0430\u0445 \u0441 \u043e\u0433\u043d\u0435\u0442\u0443\u0448\u0438\u0442\u0435\u043b\u0435\u043c\u00bb): \u043d\u0430\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0431\u0435\u0437\u0434\u0443\u043c\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0435\u0441\u044f \u0441\u043e\u0444\u0442\u043e\u0432\u043e\u0435 \u044f\u0434\u0440\u043e, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u0441 \u043d\u0435\u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u2014 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u0442 \u043d\u0435 \u0442\u043e, \u0447\u0442\u043e \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u0430 \u0434\u0430\u0436\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f, \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u00ab\u043f\u0435\u0440\u0435\u0442\u0435\u0447\u044c\u00bb \u0432 \u043a\u0430\u043a\u043e\u043c-\u043d\u0438\u0431\u0443\u0434\u044c \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438 \u0438\/\u0438\u043b\u0438 \u044f\u0434\u0440\u043e\u043c. \u041d\u0443 \u0430 \u043f\u0440\u043e \u0442\u043e, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u00ab\u043f\u043e\u0431\u0438\u0442\u044c\u0441\u044f\u00bb, \u0434\u0443\u043c\u0430\u044e, \u0438 \u0442\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u0412 \u043e\u0431\u0449\u0435\u043c, \u0442\u0443\u0442 \u0435\u0449\u0451 \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c&#8230;<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0447\u0442\u043e \u044f \u043d\u0430\u0437\u044b\u0432\u0430\u044e \u00ab\u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439\u00bb? \u0414\u043b\u044f \u0446\u0435\u043b\u0435\u0439 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434 \u044d\u0442\u0438\u043c \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b (\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435 \u0438 \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435) \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044e\u0442 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u043a\u043e\u043c\u0430\u043d\u0434 \u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0422\u043e \u0435\u0441\u0442\u044c \u0433\u0440\u0430\u0444 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f (\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c) \u0430\u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u043c, \u0431\u0435\u0437 \u00ab\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445\u00bb \u0440\u0451\u0431\u0435\u0440. \u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438\u0437 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438, \u0437\u0430\u043c\u0435\u043d\u0438\u0432 \u0435\u0451 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u0439 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u043e\u0439, \u00ab\u0437\u0430\u0448\u0438\u0442\u044c\u00bb \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0441\u0438\u043d\u0442\u0435\u0437\u0430, \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0432 \u0435\u0451 side effect-\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438. <em>\u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u043d\u0435 \u0431\u0443\u0434\u0443\u0442, \u043d\u043e \u0432 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0445 \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0442\u0440\u0443\u0434\u0430.<\/em><\/p>\n<p>  <\/p>\n<h2 id=\"uchimsya-ponimat-c-na-samom-dele-net\">\u0423\u0447\u0438\u043c\u0441\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c C (\u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043d\u0435\u0442)<\/h2>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0430\u0440\u0441\u0438\u0442\u044c C? \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u043d\u0438\u043a\u0430\u043a \u2014 \u043d\u0435 \u0437\u0440\u044f \u0436\u0435 \u044f \u0443\u0447\u0438\u043b\u0441\u044f <a href=\"https:\/\/habr.com\/ru\/post\/452592\/\">\u043f\u0430\u0440\u0441\u0438\u0442\u044c ELF-\u0444\u0430\u0439\u043b\u044b<\/a>: \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448 \u043a\u043e\u0434 \u043d\u0430 C \/ Rust \/ \u0447\u0451\u043c-\u0442\u043e \u0435\u0449\u0451 \u0432 eBPF-\u0431\u0430\u0439\u0442\u043a\u043e\u0434, \u0438 \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0443\u0436\u0435 \u0435\u0433\u043e. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0435\u043d\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u043e, \u0447\u0442\u043e \u0432 Scala \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c <code>elf.h<\/code> \u0438 \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u041c\u043e\u0436\u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/github.com\/nativelibs4java\/JNAerator\">JNAerator<\/a> \u2014 \u0438\u043c \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0438 \u043a \u0441\u0438\u0448\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u2014 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043d\u043e \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0447\u0435\u0440\u0435\u0437 JNA (\u043d\u0435 \u043f\u0443\u0442\u0430\u0442\u044c \u0441 JNI). \u042f \u0436\u0435 \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u043d\u0430\u043f\u0438\u0448\u0443 \u0441\u0432\u043e\u0439 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434 \u0438 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0432\u044b\u043f\u0438\u0448\u0443 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 case class-\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">sealed trait SectionKind case object RegularSection extends SectionKind case object SymtabSection extends SectionKind case object StrtabSection extends SectionKind case object RelSection extends SectionKind  final case class Elf64Header(     sectionHeaders: Seq[ByteBuffer],     sectionStringTableIndex: Int ) final case class Elf64Section(     data: ByteBuffer,     linkIndex: Int,     infoIndex: Int,     kind: SectionKind ) final case class Symbol(     name: String,     value: Int,     size: Int,     shndx: Int,     isInstrumenter: Boolean ) final case class Relocation(     relocatedSection: Int,     offset: Int,     symbol: Symbol )  final case class BpfInsn(     opcode: Int,     dst: Int,     src: Int,     offset: Int,     imm: Either[Long, Symbol] ) final case class BpfProg(     name: String,     insns: Seq[BpfInsn] )<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043e\u0441\u043e\u0431\u043e \u043d\u0435 \u0431\u0443\u0434\u0443 \u2014 \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0443\u043d\u044b\u043b\u043e\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043d\u0438\u0435 \u0431\u0430\u0439\u0442\u043e\u0432 \u0438\u0437 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/12\/docs\/api\/java.base\/java\/nio\/ByteBuffer.html\"><code>java.nio.ByteBuffer<\/code><\/a> \u2014 \u0432\u0441\u0451 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 <a href=\"https:\/\/habr.com\/ru\/post\/452592\/\">\u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u043e \u0440\u0430\u0437\u0431\u043e\u0440 ELF-\u0444\u0430\u0439\u043b\u043e\u0432<\/a>. \u0421\u043a\u0430\u0436\u0443 \u043b\u0438\u0448\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c <code>opcode == 0x18<\/code> (\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 64-bit immediate \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f), \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u0434\u0432\u0430 8-\u0431\u0430\u0439\u0442\u043d\u044b\u0445 \u0441\u043b\u043e\u0432\u0430 (\u043c\u043e\u0436\u0435\u0442, \u0435\u0441\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u0430\u043a\u0438\u0435 \u043e\u043f\u043a\u043e\u0434\u044b, \u043d\u043e \u044f \u043d\u0430 \u043d\u0438\u0445 \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0442\u044b\u043a\u0430\u043b\u0441\u044f), \u043f\u0440\u0438\u0447\u0451\u043c \u044d\u0442\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0430\u0434\u0440\u0435\u0441\u0430 \u043f\u0430\u043c\u044f\u0442\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u0441 \u0440\u0435\u043b\u043e\u043a\u0430\u0446\u0438\u0435\u0439, \u043a\u0430\u043a \u044f \u0434\u0443\u043c\u0430\u043b \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>__builtin_popcountl<\/code> \u0447\u0435\u0441\u0442\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 64-\u0431\u0438\u0442\u043d\u0443\u044e <strong>\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443<\/strong> <code>0x0101010101010101<\/code>. \u041f\u043e\u0447\u0435\u043c\u0443 \u044f \u043d\u0435 \u0434\u0435\u043b\u0430\u044e \u00ab\u0447\u0435\u0441\u0442\u043d\u0443\u044e\u00bb \u0440\u0435\u043b\u043e\u043a\u0430\u0446\u0438\u044e \u0441 \u043f\u0430\u0442\u0447\u0438\u043d\u0433\u043e\u043c \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u2014 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0432\u0438\u0434\u0435\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u043c \u0432\u0438\u0434\u0435 (\u0438\u0437\u0432\u0438\u043d\u0438\u0442\u0435 \u0437\u0430 \u043a\u0430\u043b\u0430\u043c\u0431\u0443\u0440), \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0438\u0437 \u0441\u0435\u043a\u0446\u0438\u0438 <code>COMMON<\/code> \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439 \u0441\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0430 (\u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0435\u0449\u0451 \u0441 \u043f\u043b\u044f\u0441\u043a\u0430\u043c\u0438 \u0441 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u043c\u0438\/\u043d\u0435\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u043c\u0438 <code>UInt<\/code>).<\/p>\n<p>  <\/p>\n<h2 id=\"stroim-hardware-po-naboru-instrukciy\">\u0421\u0442\u0440\u043e\u0438\u043c hardware \u043f\u043e \u043d\u0430\u0431\u043e\u0440\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439<\/h2>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u043f\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e, \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043f\u0443\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u0434\u0443\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043d\u0438\u0437 \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043a\u0443\u0442 \u043f\u043e \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 \u0430\u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0433\u0440\u0430\u0444\u0443, \u043f\u0440\u0438\u0447\u0451\u043c \u0432\u0441\u0435 \u0435\u0433\u043e \u0440\u0451\u0431\u0440\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0447\u0438\u0441\u0442\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 (\u0442\u043e \u0435\u0441\u0442\u044c \u0431\u0435\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043d\u0430 \u043f\u0443\u0442\u0438), \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0449\u0430\u044f\u0441\u044f \u0438\u0437 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430\u0434 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u043c\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u0440\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 load\/store \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0437\u0430 \u043e\u0434\u0438\u043d \u0442\u0430\u043a\u0442. \u041f\u043e\u0441\u0442\u0443\u043f\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e: \u0431\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u0432 \u0432\u0438\u0434\u0435 <code>UInt<\/code>, \u0430 \u043a\u0430\u043a <code>(UInt, Bool)<\/code>: \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u0430\u0440\u044b \u2014 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u043f\u0440\u0438\u0437\u043d\u0430\u043a \u0435\u0433\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438. \u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430 \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u043e\u043a\u0430 \u0430\u0434\u0440\u0435\u0441 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0435\u043d, \u0430 \u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u043b\u044c\u0437\u044f.<\/p>\n<p>  <\/p>\n<p>\u041c\u043e\u0434\u0435\u043b\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f eBPF \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0430 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442 \u043d\u0435\u043a\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u0441 64-\u0431\u0438\u0442\u043d\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0435\u0439, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0431\u043e\u0440 \u0438\u0437 16-\u0438 (\u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0434\u0435\u0441\u044f\u0442\u0438) 64-\u0431\u0438\u0442\u043d\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432. \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432 <code>r1<\/code> \u0438 <code>r2<\/code> \u043b\u0435\u0436\u0430\u0442 \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u044b \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u2014 \u043d\u0443\u043b\u0438, \u0432\u0441\u0435 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 (\u0442\u043e\u0447\u043d\u0435\u0435, \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \u00ab\u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438\u00bb \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0441\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430)<\/li>\n<li>\u0435\u0441\u043b\u0438 \u0432\u0438\u0434\u0438\u043c \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u043e-\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e, \u0434\u043e\u0441\u0442\u0430\u0451\u043c \u0435\u0451 \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u044b-\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u0435\u0431\u044f \u0434\u043b\u044f \u0445\u0432\u043e\u0441\u0442\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u043d\u0434 \u0437\u0430\u043c\u0435\u043d\u0451\u043d \u043d\u0430 \u043f\u0430\u0440\u0443 <code>(data1 op data2, valid1 &amp;&amp; valid2)<\/code><\/li>\n<li>\u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u043c \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435, \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0441\u0442\u0440\u043e\u0438\u043c \u043e\u0431\u0435 \u0432\u0435\u0442\u0432\u0438: \u0435\u0441\u043b\u0438 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e, \u0438 \u0435\u0441\u043b\u0438 \u043d\u0435\u0442<\/li>\n<li>\u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0438\u043b\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c, \u043a\u0430\u043a-\u043d\u0438\u0431\u0443\u0434\u044c \u0432\u044b\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043c\u0441\u044f: \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 callback, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044f \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u0447\u0442\u043e \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 <code>valid<\/code> \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u043e\u0437\u0432\u0430\u043d \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438. \u0412\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043c\u044b AND-\u0438\u043c \u0441 \u0444\u043b\u0430\u0433\u043e\u043c <code>globalValid<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043f\u0435\u0440\u0435\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e \u0444\u0440\u043e\u043d\u0442\u0443 <code>valid<\/code>, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u044b \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0435\u0435, \u0430 \u043d\u0435 \u043f\u043e \u0448\u0430\u0433\u0430\u043c. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0448\u0443 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u0431\u0430\u0439\u0442\u043e\u043c \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u044b, \u0438\u043d\u0430\u0447\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c, UB. \u0422.\u0435. <code>*addr += 1<\/code> \u2014 \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u0437\u0430\u043f\u0438\u0441\u044c \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u043d\u0430\u0447\u043d\u0451\u0442\u0441\u044f, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u0447\u0442\u0435\u043d\u0438\u0435 (\u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043c\u044b \u0435\u0449\u0451 \u043d\u0435 \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c), \u0430 \u0432\u043e\u0442 <code>*addr += 1; return *addr;<\/code> \u0443 \u043c\u0435\u043d\u044f \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u043b\u0430\u0433\u043e\u043f\u043e\u043b\u0443\u0447\u043d\u043e \u0432\u044b\u0434\u0430\u0432\u0430\u043b\u043e <strong>\u043d\u043e\u043b\u044c<\/strong> \u0438\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435. \u041c\u043e\u0436\u0435\u0442, \u044d\u0442\u043e \u0438 \u0441\u0442\u043e\u0438\u043b\u043e \u0431\u044b \u043e\u0442\u043b\u0430\u0434\u0438\u0442\u044c (\u043c\u043e\u0436\u0435\u0442, \u043e\u043d\u043e \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0445\u0438\u0442\u0440\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443), \u043d\u043e \u0441\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0430\u043a \u0441\u0435\u0431\u0435 \u0438\u0434\u0435\u044f, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c, \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u0430\u0434\u0440\u0435\u0441\u0430\u043c\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0443\u0436\u0435 \u0432\u0435\u043b\u0430\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430, \u0430 \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>valid<\/code> \u043f\u0440\u043e\u043a\u0438\u043d\u0443\u0442\u044c \u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0434\u043b\u044f \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <code>BpfCircuitConstructor<\/code>, \u0438\u043c\u0435\u044e\u0449\u0438\u0439 \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b <code>doMemLoad<\/code>, <code>doMemStore<\/code> \u0438 <code>resolveSymbol<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">trait BpfCircuitConstructor { \/\/ ...   sealed abstract class LdStType(val lgsize: Int) {     val byteSize = 1 &lt;&lt; lgsize     val bitSize = byteSize * 8     val mask: UInt = if (bitSize == 64) mask64 else ((1l &lt;&lt; bitSize) - 1).U   }   case object u8  extends LdStType(0)   case object u16 extends LdStType(1)   case object u32 extends LdStType(2)   case object u64 extends LdStType(3)    def doMemLoad(addr: UInt, tpe: LdStType, valid: Bool): (UInt, Bool)   def doMemStore(addr: UInt, tpe: LdStType, data: UInt, valid: Bool): Bool    sealed trait Resolved {     def asPlainValue: UInt     def load(ctx: Context, offset: Int, tpe: LdStType, valid: Bool): LazyData     def store(offset: Int, tpe: LdStType, data: UInt, valid: Bool): Bool   }    def resolveSymbol(sym: BpfLoader.Symbol): Resolved \/\/ ... }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"integraciya-s-processornym-yadrom\">\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u044b\u043c \u044f\u0434\u0440\u043e\u043c<\/h2>\n<p>  <\/p>\n<p>\u042f \u0440\u0435\u0448\u0438\u043b \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0439\u0442\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u0443\u0442\u0451\u043c: \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u043c\u0443 \u044f\u0434\u0440\u0443 \u043f\u043e \u0448\u0442\u0430\u0442\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 RoCC (Rocket Custom Coprocessor). \u041d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u044d\u0442\u043e \u0448\u0442\u0430\u0442\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043d\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 RISC-V-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0445 \u044f\u0434\u0435\u0440, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f Rocket \u0438 BOOM (Berkeley Out-of-Order Machine), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0437\u0430\u0442\u044f\u0433\u0438\u0432\u0430\u043d\u0438\u0438 \u0432 upstream \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043e\u043a \u043f\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430\u043c, \u0438\u0437 \u043d\u0438\u0445 \u0431\u044b\u043b\u0438 \u0432\u044b\u043a\u0438\u043d\u0443\u0442\u044b \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0435 \u043c\u043d\u0435\u043c\u043e\u043d\u0438\u043a\u0438 <code>custom0<\/code> \u2014 <code>custom3<\/code>, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0435 \u0437\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0433\u043e \u044f\u0434\u0440\u0430 Rocket\/BOOM \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u043e \u0447\u0435\u0442\u044b\u0440\u0451\u0445 RoCC \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u0435\u043b\u0435\u0439, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0444\u0438\u0433, \u0435\u0441\u0442\u044c \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<p><strong>Configs.scala:<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">class WithRoccExample extends Config((site, here, up) =&gt; {   case BuildRoCC =&gt; List(     (p: Parameters) =&gt; {         val accumulator = LazyModule(new AccumulatorExample(OpcodeSet.custom0, n = 4)(p))         accumulator     },     (p: Parameters) =&gt; {         val translator = LazyModule(new TranslatorExample(OpcodeSet.custom1)(p))         translator     },     (p: Parameters) =&gt; {         val counter = LazyModule(new CharacterCountExample(OpcodeSet.custom2)(p))         counter     }) })<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 <code>LazyRoCC.scala<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u0435\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0435 \u043f\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443 \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430: \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445 \u0441 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 <code>LazyRoCC<\/code>, \u0434\u0440\u0443\u0433\u043e\u0439 \u2014 \u043e\u0442 <code>LazyRoCCModuleImp<\/code>. \u0412\u0442\u043e\u0440\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0438\u043c\u0435\u0435\u0442 \u043f\u043e\u0440\u0442 <code>io<\/code> \u0442\u0438\u043f\u0430 <code>RoCCIO<\/code>, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f \u043f\u043e\u0440\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 <code>cmd<\/code>, \u043f\u043e\u0440\u0442 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 <code>resp<\/code>, \u043f\u043e\u0440\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a L1D-\u043a\u0435\u0448\u0443 <code>mem<\/code>, \u0432\u044b\u0445\u043e\u0434\u044b <code>busy<\/code> \u0438 <code>interrupt<\/code> \u0438 \u0432\u0445\u043e\u0434 <code>exception<\/code>. \u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u043e\u0440\u0442 page table walker \u0438 FPU, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c, \u0432\u0440\u043e\u0434\u0435, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b (\u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0432 eBPF \u043d\u0435\u0442 \u0432\u0435\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0438). \u041f\u043e\u043a\u0430 \u0447\u0442\u043e \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u0442\u0430\u043a\u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c \u0445\u043e\u0442\u044c \u0447\u0442\u043e-\u0442\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 <code>interrupt<\/code> \u044f \u043a\u0430\u0441\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0443. \u0422\u0430\u043a\u0436\u0435 \u0442\u0430\u043c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u0438\u043c\u0435\u0435\u0442\u0441\u044f TileLink-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u043d\u0435\u043a\u0435\u0448\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u0430\u043c\u044f\u0442\u0438, \u043d\u043e \u044f \u0435\u0433\u043e \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0442\u0440\u043e\u0433\u0430\u0442\u044c \u0442\u043e\u0436\u0435 \u043d\u0435 \u0431\u0443\u0434\u0443.<\/p>\n<p>  <\/p>\n<h2 id=\"uporyadochivatel-zaprosov\">\u0423\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432<\/h2>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u043e\u0440\u0442 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043a\u0435\u0448\u0443, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d. \u0412 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e (\u0447\u0442\u043e \u0435\u0449\u0451 \u0445\u0443\u0434\u043e-\u0431\u0435\u0434\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432 \u043e\u0434\u043d\u0443 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e) \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043a\u0430\u043a-\u0442\u043e \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e \u0435\u0451 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c, \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0432, \u043e\u0431\u043d\u043e\u0432\u0438\u0432 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0432. \u0412 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432, \u043e\u0434\u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u041c\u043e\u0436\u0435\u0442, \u044d\u0442\u043e \u0438 \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u0438\u0434\u0435\u044f \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043d\u043e, \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b, \u0441\u043a\u0430\u0436\u0435\u043c, \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0442\u0440\u0438 \u0441\u043b\u043e\u0432\u0430 (\u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u0432\u043f\u043e\u043b\u043d\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0443\u0436\u0435 \u043b\u0435\u0436\u0430\u0442 \u0432 \u043a\u0435\u0448\u0435), \u043a\u0430\u043a-\u0442\u043e \u0438\u0445 <strong>\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e<\/strong> \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 (\u0442\u043e \u0435\u0441\u0442\u044c \u0437\u0430 \u043e\u0434\u0438\u043d \u0442\u0430\u043a\u0442) \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0441\u0445\u0435\u043c\u0430, \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u00ab\u0440\u0430\u0437\u0440\u0443\u043b\u0438\u0432\u0430\u044e\u0449\u0430\u044f\u00bb \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c\u0443 \u043f\u043e\u0440\u0442\u0443 \u043a\u0435\u0448\u0430.<\/p>\n<p>  <\/p>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f: \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043f\u043e\u0434\u044b\u043d\u0441\u0442\u0443\u043a\u0446\u0438\u0438 (7-\u0431\u0438\u0442\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 <code>funct<\/code> \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 RoCC) \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0438\u0434\u0438\u0442\u0441\u044f \u043c\u043d\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0432\u0440\u0435\u0434\u043d\u044b\u043c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u0443\u0447\u0443 \u043b\u0438\u0448\u043d\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u0430 \u043f\u0440\u043e\u0441\u0430\u0436\u0438\u0432\u0430\u0442\u044c Fmax, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0431\u0443\u0434\u0443\u0442). \u0414\u0430\u043b\u0435\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0439 \u00ab\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u043e\u0440\u00bb\/\u00ab\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u043e\u0440\u00bb \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0435. \u0412 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0436\u0438\u0432\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c. \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0442\u0430\u043a\u0442\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u0439 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u2014 \u0435\u043c\u0443 \u0438 \u0432\u044b\u0434\u0430\u0451\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 <strong>\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0442\u0430\u043a\u0442\u0435<\/strong>. \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0442\u0430\u043a\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u043d\u0443\u0436\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u0435\u043d\u044c\u043a\u043e \u043e\u0431\u043b\u043e\u0436\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u0430\u043c\u0438 (\u0443 \u043c\u0435\u043d\u044f \u0438\u0445, \u043f\u0440\u0430\u0432\u0434\u0430, \u043f\u043e\u043a\u0430 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043c\u043d\u043e\u0433\u043e, \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f, \u0430 \u0442\u0430\u043a \u2014 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0445\u043e\u0442\u044c \u0447\u0435\u0433\u043e-\u0442\u043e \u0432\u0440\u0430\u0437\u0443\u043c\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e). \u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 <code>PeekPokeTester<\/code> \u0438\u0437 \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0447\u0438\u0437\u0435\u043b\u0435\u0432\u0441\u043a\u0438\u0445 \u0434\u0438\u0437\u0430\u0439\u043d\u043e\u0432. \u0415\u0433\u043e \u044f \u0443\u0436\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/414995\/\">\u043a\u043e\u0433\u0434\u0430-\u0442\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0432\u043e\u0442 \u0442\u0430\u043a\u0430\u044f \u0448\u0442\u0443\u043a\u043e\u0432\u0438\u043d\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">class Serializer(isComputing: Bool, next: Bool) {   def monotonic(x: Bool): Bool = {     val res = WireInit(false.B)     val prevRes = RegInit(false.B)     prevRes := res &amp;&amp; isComputing     res := (x || prevRes) &amp;&amp; isComputing     res   }   private def noone(bs: Seq[Bool]): Bool = !bs.foldLeft(false.B)(_ || _)    private val previousReqs = ArrayBuffer[Bool]()   def nextReq(x: Bool): (Bool, Int) = {     val enable = monotonic(x)     val result = RegInit(false.B)     val retired = RegInit(false.B)     val doRetire = result &amp;&amp; next     val thisReq = enable &amp;&amp; !retired &amp;&amp; !doRetire     val reqWon = thisReq &amp;&amp; noone(previousReqs)     when (isComputing) {       when(reqWon) {         result := true.B       }       when(doRetire) {         result := false.B         retired := true.B       }     } otherwise {       result := false.B       retired := false.B     }     previousReqs += thisReq     (result, previousReqs.length - 1)   } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u0431\u043b\u0430\u0433\u043e\u043f\u043e\u043b\u0443\u0447\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0434 \u043d\u0430 Scala. \u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u0433\u043b\u044f\u0434\u0435\u0442\u044c\u0441\u044f, \u043c\u043e\u0436\u043d\u043e \u0434\u0430\u0436\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c <code>ArrayBuffer<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u0443\u0441\u043a\u0438 \u0441\u0445\u0435\u043c\u044b (<code>Boolean<\/code> \u2014 \u0442\u0438\u043f \u0438\u0437 Scala, <code>Bool<\/code> \u2014 \u0447\u0438\u0437\u0435\u043b\u0435\u0432\u0441\u043a\u0438\u0439 \u0442\u0438\u043f, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u00ab\u0436\u0438\u0432\u0443\u044e \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u0443\u0440\u0443\u00bb, \u0430 \u043d\u0435 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f boolean).<\/p>\n<p>  <\/p>\n<h2 id=\"rabota-s-l1d-keshom\">\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 L1D-\u043a\u0435\u0448\u043e\u043c<\/h2>\n<p>  <\/p>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043a\u0435\u0448\u043e\u043c \u043f\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0440\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 <code>io.mem.req<\/code> \u0438 \u043f\u043e\u0440\u0442 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 <code>io.mem.resp<\/code>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e\u0440\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430\u043c\u0438 <code>ready<\/code> \u0438 <code>valid<\/code>: \u043f\u0435\u0440\u0432\u044b\u043c \u043a\u0435\u0448 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441, \u0432\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441 \u0433\u043e\u0442\u043e\u0432 \u0438 \u0443\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043f\u043e \u0444\u0440\u043e\u043d\u0442\u0443 <code>valid &amp;&amp; resp<\/code> \u0437\u0430\u043f\u0440\u043e\u0441 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043d\u044f\u0442\u044b\u043c. \u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u0445 \u0435\u0441\u0442\u044c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u00ab\u043d\u0435\u043e\u0442\u0437\u044b\u0432\u043d\u043e\u0441\u0442\u0438\u00bb \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 <code>true<\/code> \u0438 \u0434\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0444\u0440\u043e\u043d\u0442\u0430 <code>valid &amp;&amp; resp<\/code> (\u044d\u0442\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>fire()<\/code>).<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0440\u0442 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 <code>resp<\/code>, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0438\u043c\u0435\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u043a <code>valid<\/code>, \u0438 \u044d\u0442\u043e \u0443\u0436\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0432\u044b\u0433\u0440\u0435\u0431\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u044b \u0437\u0430 \u043e\u0434\u0438\u043d \u0442\u0430\u043a\u0442: \u043e\u043d \u043f\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u00ab\u0432\u0441\u0435\u0433\u0434\u0430 \u0433\u043e\u0442\u043e\u0432\u00bb, \u0438 <code>fire()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e <code>valid<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u044f \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043f\u0430\u043b\u043e: \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u0442\u043e-\u043d\u0435-\u0437\u043d\u0430\u044e-\u0447\u0442\u043e, \u0434\u0430 \u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0430\u043d\u043e\u0432\u043e \u0442\u043e, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043f\u043e\u0437\u0436\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u0436\u0435 \u043a\u0430\u043a-\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e. \u041d\u043e \u0441 \u044d\u0442\u0438\u043c \u0443\u0436\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441 <code>Serializer<\/code>, \u043c\u044b \u0436\u0435 \u0435\u043c\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0434\u0430\u0451\u043c \u043f\u0440\u0438\u0437\u043d\u0430\u043a \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0443\u0436\u0435 \u0443\u0448\u0451\u043b \u0432 \u043a\u0435\u0448: <code>next = io.mem.req.fire()<\/code>. \u041e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0440\u0430\u0437\u0432\u0435 \u0447\u0442\u043e \u0441\u043b\u0435\u0434\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0432 \u00ab\u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u00bb \u043e\u0442\u0432\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0448\u0451\u043b \u2014 \u043d\u0435 \u0440\u0430\u043d\u044c\u0448\u0435 \u0438 \u043d\u0435 \u043f\u043e\u0437\u0436\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>holdUnless<\/code>. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">  class Constructor extends BpfCircuitConstructor {     val serializer = new Serializer(isComputing, io.mem.req.fire())     override def doMemLoad(addr: UInt, tpe: LdStType, valid: Bool): (UInt, Bool) = {       val (doReq, thisTag) = serializer.nextReq(valid)       when (doReq) {         io.mem.req.bits.addr := addr         require((1 &lt;&lt; io.mem.req.bits.tag.getWidth) &gt; thisTag)         io.mem.req.bits.tag := thisTag.U         io.mem.req.bits.cmd := M_XRD         io.mem.req.bits.typ := (4 | tpe.lgsize).U         io.mem.req.bits.data := 0.U         io.mem.req.valid := true.B       }        val doResp = isComputing &amp;&amp;         serializer.monotonic(doReq &amp;&amp; io.mem.req.fire()) &amp;&amp;         io.mem.resp.valid &amp;&amp;         io.mem.resp.bits.tag === thisTag.U &amp;&amp;         io.mem.resp.bits.cmd === M_XRD        (io.mem.resp.bits.data holdUnless doResp, serializer.monotonic(doResp))     }     override def doMemStore(addr: UInt, tpe: LdStType, data: UInt, valid: Bool): Bool = {       val (doReq, thisTag) = serializer.nextReq(valid)       when (doReq) {         io.mem.req.bits.addr := addr         require((1 &lt;&lt; io.mem.req.bits.tag.getWidth) &gt; thisTag)         io.mem.req.bits.tag := thisTag.U         io.mem.req.bits.cmd := M_XWR         io.mem.req.bits.typ := (4 | tpe.lgsize).U         io.mem.req.bits.data := data         io.mem.req.valid := true.B       }       serializer.monotonic(doReq &amp;&amp; io.mem.req.fire())     }     override def resolveSymbol(sym: BpfLoader.Symbol): Resolved = sym match {       case BpfLoader.Symbol(symName, _, size, ElfConstants.Elf64_Shdr.SHN_COMMON, false) if size &lt;= 8 =&gt;         RegisterReference(regs.getOrElseUpdate(symName, RegInit(0.U(64.W))))     }   }<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u043f\u043e\u0434\u044b\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<h2 id=\"ne-vsyo-to-v-kuche-chto-globalnaya-peremennaya\">\u041d\u0435 \u0432\u0441\u0451 \u0442\u043e \u0432 \u043a\u0443\u0447\u0435, \u0447\u0442\u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f<\/h2>\n<p>  <\/p>\n<p>\u0425\u043c, \u0430 \u043a\u0430\u043a\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440? \u0420\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0447\u0435\u0433\u043e \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c? \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 AFL! \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u043e\u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">#include &lt;stdint.h&gt;  extern uint8_t *__afl_area_ptr; extern uint64_t prev;  void inst_branch(uint64_t tag) {     __afl_area_ptr[((prev &gt;&gt; 1) ^ tag) &amp; 0xFFFF] += 1;     prev = tag; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0432 \u043d\u0435\u0439 \u0435\u0441\u0442\u044c \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 (\u0430 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u2014 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442) \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0430\u0439\u0442\u0430 \u0438\u0437 <code>__afl_area_ptr<\/code>, \u043d\u043e \u0432\u043e\u0442 \u043d\u0430 \u0440\u043e\u043b\u044c <code>prev<\/code> \u043f\u0440\u044f\u043c\u043e-\u0442\u0430\u043a\u0438 \u043d\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440!<\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438 \u043d\u0443\u0436\u0435\u043d \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>Resolved<\/code>: \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u043a\u0430\u043a \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u0430\u043a \u0438 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u043d\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u044f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u044b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 1, 2, 4 \u0438\u043b\u0438 8 \u0431\u0430\u0439\u0442, \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e \u043d\u0443\u043b\u0435\u0432\u043e\u043c\u0443 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e <code>prev<\/code> \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432\u044b\u0447\u0438\u0442\u0430\u043d \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430, \u0438 \u043b\u0438\u0448\u044c \u043f\u043e\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u043d.<\/p>\n<p>  <\/p>\n<h2 id=\"a-teper-instrumentaciya\">\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/h2>\n<p>  <\/p>\n<p>\u0412 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043b\u0435\u0436\u0430\u0449\u0438\u0439 \u0438 \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u0435\u043b\u044c \u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c RoCC. \u0427\u0442\u043e \u0436\u0435 \u0442\u0435\u043f\u0435\u0440\u044c? \u0417\u0430\u043d\u043e\u0432\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0451 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u043f\u0440\u043e\u0434\u0438\u0440\u0430\u044f\u0441\u044c \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430? \u041c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439, \u0435\u0441\u043b\u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0434\u0430\u043d\u043d\u044b\u043c \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c <code>funct<\/code>. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u043e\u0436\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u043e\u043c\u0443\u0447\u0438\u0442\u044c\u0441\u044f: \u044f \u0434\u0430\u0436\u0435 \u043d\u0430\u0443\u0447\u0438\u043b\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f SignalTap, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u0442\u043b\u0430\u0434\u043a\u0430 \u043f\u043e\u0447\u0442\u0438 \u0432 \u0441\u043b\u0435\u043f\u0443\u044e, \u0434\u0430 \u0435\u0449\u0451 \u0438 \u0441 \u043f\u044f\u0442\u0438\u043c\u0438\u043d\u0443\u0442\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0435\u0439 \u043f\u043e\u0441\u043b\u0435 \u043c\u0430\u043b\u0435\u0439\u0448\u0435\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f (\u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f bootrom \u2014 \u0442\u0430\u043c \u0432\u0441\u0451 \u0431\u044b\u0441\u0442\u0440\u043e) \u2014 \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0431\u044b\u043b \u043f\u043e\u0434\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u043a\u043e\u043c\u0430\u043d\u0434 \u0438 \u0441\u043b\u0435\u0433\u043a\u0430 \u00ab\u043f\u043e\u0434\u0440\u0438\u0445\u0442\u043e\u0432\u0430\u043d\u00bb \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u0434\u043b\u044f \u0443\u0447\u0451\u0442\u0430 \u0442\u043e\u0433\u043e \u0444\u0430\u043a\u0442\u0430, \u0447\u0442\u043e \u0447\u0442\u043e \u0431\u044b \u043d\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u043f\u0440\u043e \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e, \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0432\u0448\u0438\u0439\u0441\u044f RoCC \u0435\u0449\u0451 \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 long latency \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440, \u043a\u0430\u043a \u043f\u0440\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u043c\u0430\u0445\u0435 \u043a\u0435\u0448\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u2014 \u044d\u0442\u043e \u043f\u0430\u0440\u0430 ([\u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438], [\u043d\u0430\u0431\u043e\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0431\u043b\u043e\u043a\u0438 data path \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0433\u043e \u044f\u0434\u0440\u0430]). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>default<\/code> (\u043d\u0435\u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u043d\u0430\u044f \u0438\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f) \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a (\u0432\u0437\u044f\u0442\u043e \u043a\u0430\u043a \u0435\u0441\u0442\u044c \u0438\u0437 <code>IDecode.scala<\/code>, \u0432 \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u043e\u043c \u0425\u0430\u0431\u0440\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442, \u043f\u0440\u044f\u043c\u043e \u0441\u043a\u0430\u0436\u0435\u043c, \u043d\u0435\u043a\u0440\u0430\u0441\u0438\u0432\u043e):<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">def default: List[BitPat] =                 \/\/           jal                                                                   renf1             fence.i                 \/\/   val     | jalr                                                                | renf2           |                 \/\/   | fp_val| | renx2                                                             | | renf3         |                 \/\/   | | rocc| | | renx1       s_alu1                          mem_val             | | | wfd         |                 \/\/   | | | br| | | |   s_alu2  |       imm    dw     alu       | mem_cmd   mem_type| | | | mul       |                 \/\/   | | | | | | | |   |       |       |      |      |         | |           |     | | | | | div     | fence                 \/\/   | | | | | | | |   |       |       |      |      |         | |           |     | | | | | | wxd   | | amo                 \/\/   | | | | | | | | scie      |       |      |      |         | |           |     | | | | | | |     | | | dp                 List(N,X,X,X,X,X,X,X,X,A2_X,   A1_X,   IMM_X, DW_X,  FN_X,     N,M_X,        MT_X, X,X,X,X,X,X,X,CSR.X,X,X,X,X)<\/code><\/pre>\n<p>  <\/p>\n<p>\u2026 \u0430 \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 <em>\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439<\/em> \u0432 Rocket core \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">class IDecode(implicit val p: Parameters) extends DecodeConstants {   val table: Array[(BitPat, List[BitPat])] = Array(     BNE-&gt;       List(Y,N,N,Y,N,N,Y,Y,N,A2_RS2, A1_RS1, IMM_SB,DW_X,  FN_SNE,   N,M_X,        MT_X, N,N,N,N,N,N,N,CSR.N,N,N,N,N),     BEQ-&gt;       List(Y,N,N,Y,N,N,Y,Y,N,A2_RS2, A1_RS1, IMM_SB,DW_X,  FN_SEQ,   N,M_X,        MT_X, N,N,N,N,N,N,N,CSR.N,N,N,N,N),     BLT-&gt;       List(Y,N,N,Y,N,N,Y,Y,N,A2_RS2, A1_RS1, IMM_SB,DW_X,  FN_SLT,   N,M_X,        MT_X, N,N,N,N,N,N,N,CSR.N,N,N,N,N),     BLTU-&gt;      List(Y,N,N,Y,N,N,Y,Y,N,A2_RS2, A1_RS1, IMM_SB,DW_X,  FN_SLTU,  N,M_X,        MT_X, N,N,N,N,N,N,N,CSR.N,N,N,N,N),     BGE-&gt;       List(Y,N,N,Y,N,N,Y,Y,N,A2_RS2, A1_RS1, IMM_SB,DW_X,  FN_SGE,   N,M_X,        MT_X, N,N,N,N,N,N,N,CSR.N,N,N,N,N),     BGEU-&gt;      List(Y,N,N,Y,N,N,Y,Y,N,A2_RS2, A1_RS1, IMM_SB,DW_X,  FN_SGEU,  N,M_X,        MT_X, N,N,N,N,N,N,N,CSR.N,N,N,N,N), \/\/ ...<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 RISC-V (\u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 RocketChip, \u0430 \u0432 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u043a\u043e\u043c\u0430\u043d\u0434 \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435) \u0448\u0442\u0430\u0442\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 ISA \u043d\u0430 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e I (\u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438), \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 M (\u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0435), A (atomics) \u0438 \u0442.\u0434.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">  def decode(inst: UInt, table: Iterable[(BitPat, List[BitPat])]) = {     val decoder = DecodeLogic(inst, default, table)     val sigs = Seq(legal, fp, rocc, branch, jal, jalr, rxs2, rxs1, scie, sel_alu2,                    sel_alu1, sel_imm, alu_dw, alu_fn, mem, mem_cmd, mem_type,                    rfs1, rfs2, rfs3, wfd, mul, div, wxd, csr, fence_i, fence, amo, dp)     sigs zip decoder map {case(s,d) =&gt; s := d}      this }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0431\u044b\u043b \u0437\u0430\u043c\u0435\u043d\u0451\u043d \u043d\u0430<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0442\u0430\u043a\u043e\u0439 \u0436\u0435, \u043d\u043e \u0441 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u043e\u043c \u0434\u043b\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438 \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 rocc<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"scala\">def decode(inst: UInt, table: Iterable[(BitPat, List[BitPat])], handlers: Seq[OpcodeHandler]) = {     val decoder = DecodeLogic(inst, default, table)     val sigs=Seq(legal, fp, rocc_explicit, branch, jal, jalr, rxs2, rxs1, scie, sel_alu2,                    sel_alu1, sel_imm, alu_dw, alu_fn, mem, mem_cmd, mem_type,                    rfs1, rfs2, rfs3, wfd, mul, div, wxd, csr, fence_i, fence, amo, dp)     sigs zip decoder map {case(s,d) =&gt; s := d}      if (handlers.isEmpty) {       handler_rocc := false.B       handler_rocc_funct := 0.U     } else {       val handlerTable: Seq[(BitPat, List[BitPat])] = handlers.map {         case OpcodeHandler(pattern, funct) =&gt; pattern -&gt; List(Y, BitPat(funct.U))       }       val handlerDecoder = DecodeLogic(inst, List(N, BitPat(0.U)), handlerTable)       Seq(handler_rocc, handler_rocc_funct) zip handlerDecoder map { case (s,d) =&gt; s:=d }     }      rocc := rocc_explicit || handler_rocc      this   }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0418\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0441\u0430\u043c\u044b\u043c \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u044d\u0442\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"diff\">   io.rocc.exception := wb_xcpt &amp;&amp; csr.io.status.xs.orR    io.rocc.cmd.bits.status := csr.io.status    io.rocc.cmd.bits.inst := new RoCCInstruction().fromBits(wb_reg_inst) +  when (wb_ctrl.handler_rocc) { +    io.rocc.cmd.bits.inst.opcode := 0x0b.U \/\/ custom0 +    io.rocc.cmd.bits.inst.funct := wb_ctrl.handler_rocc_funct +    io.rocc.cmd.bits.inst.xd := false.B +    io.rocc.cmd.bits.inst.rd := 0.U +  }    io.rocc.cmd.bits.rs1 := wb_reg_wdata    io.rocc.cmd.bits.rs2 := wb_reg_rs2<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u0435\u043b\u044e: \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f, \u0430 <code>funct<\/code> \u0440\u0430\u0432\u0435\u043d \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0432\u0435\u0440\u043d\u0443\u043b \u0434\u0435\u043a\u043e\u0434\u0435\u0440. \u041d\u043e \u0435\u0441\u0442\u044c \u0438 \u0447\u0443\u0442\u044c \u043c\u0435\u043d\u0435\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435: \u0434\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0443\u0445\u043e\u0434\u0438\u0442 \u043d\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u0435\u043b\u044c (\u0438\u0445 \u0436\u0435 \u0447\u0435\u0442\u044b\u0440\u0435 \u2014 \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0437?), \u0430 \u0432 \u0440\u043e\u0443\u0442\u0435\u0440, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0438\u0434, \u0447\u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0438\u043c\u0435\u0435\u0442 <code>opcode == custom0<\/code> (\u0434\u0430, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c, \u043f\u0440\u0438\u0447\u0451\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0443\u043b\u0435\u0432\u044b\u043c \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u0435\u043b\u0435\u043c!).<\/p>\n<p>  <\/p>\n<h2 id=\"proverka\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430<\/h2>\n<p>  <\/p>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0443 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u043d\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0434\u043e\u0432\u0435\u0441\u0442\u0438 \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u043e \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 production-\u0443\u0440\u043e\u0432\u043d\u044f. \u041a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c, \u043d\u0430\u0434\u043e \u043d\u0430\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 (\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0441\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430) \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0437\u0430\u0434\u0430\u0447. \u041f\u043e\u043a\u0430 \u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044e, \u0447\u0442\u043e \u043e\u043d\u043e \u0445\u043e\u0442\u044c \u043a\u0430\u043a-\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0442\u0435\u043f\u043b\u0438\u0447\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">#include &lt;stdint.h&gt;  uint64_t counter;  uint64_t funct1(uint64_t x, uint64_t y) {   return __builtin_popcountl(x); }  uint64_t funct2(uint64_t x, uint64_t y) {   return (x + y) * (x - y); }  uint64_t instMUL() {   counter += 1;   *((uint64_t *)0x81005000) = counter;   return 0; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 <code>bootrom\/sdboot\/sd.c<\/code> \u0432 <code>main<\/code> \u0441\u0442\u0440\u043e\u0447\u043a\u0438<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">#include \"\/path\/to\/freedom-u-sdk\/riscv-pk\/machine\/encoding.h\"  \/\/ ...  \/\/\/\/ \u0426\u0435\u043b\u0438\u043a\u043e\u043c \u0432\u0437\u044f\u0442\u043e \u0438\u0437 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e RoCC  #define STR1(x) #x #define STR(x) STR1(x) #define EXTRACT(a, size, offset) (((~(~0 &lt;&lt; size) &lt;&lt; offset) &amp; a) &gt;&gt; offset)  #define CUSTOMX_OPCODE(x) CUSTOM_##x #define CUSTOM_0 0b0001011 #define CUSTOM_1 0b0101011 #define CUSTOM_2 0b1011011 #define CUSTOM_3 0b1111011  #define CUSTOMX(X, rd, rs1, rs2, funct) \\   CUSTOMX_OPCODE(X)                   | \\   (rd                   &lt;&lt; (7))       | \\   (0x7                  &lt;&lt; (7+5))     | \\   (rs1                  &lt;&lt; (7+5+3))   | \\   (rs2                  &lt;&lt; (7+5+3+5)) | \\   (EXTRACT(funct, 7, 0) &lt;&lt; (7+5+3+5+5))  #define CUSTOMX_R_R_R(X, rd, rs1, rs2, funct)           \\   asm (\"mv a4, %[_rs1]\\n\\t\"                             \\        \"mv a5, %[_rs2]\\n\\t\"                             \\        \".word \"STR(CUSTOMX(X, 15, 14, 15, funct))\"\\n\\t\" \\        \"mv %[_rd], a5\"                                  \\        : [_rd] \"=r\" (rd)                                \\        : [_rs1] \"r\" (rs1), [_rs2] \"r\" (rs2)             \\        : \"a4\", \"a5\");  int main(void) { \/\/ ...    \/\/ \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c RoCC extension   write_csr(mstatus, MSTATUS_XS &amp; (MSTATUS_XS &gt;&gt; 1));    \/\/ \u041a\u043b\u0430\u0434\u0451\u043c \u0432 bootrom \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0435   uint64_t res;   CUSTOMX_R_R_R(0, res, 0xabcdef, 0x123456, 1);   CUSTOMX_R_R_R(0, res, 0xabcdef, 0x123456, 2);    \/\/ ... \u0438 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438   uint64_t x = 1;   for (int i = 0; i &lt; 123; ++i) x *= *(volatile uint8_t *)0x80000000;   kputc('0' + x % 10); \/\/ \u041e\u041f\u0422\u0418\u041c\u0418\u0417\u0410\u0422\u041e\u0420 \u041d\u0415 \u041a\u041e\u0420\u041c\u0418\u0422\u042c!!! \/\/ ... }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u044b\u0437\u043e\u0432 <code>write_csr<\/code> \u043d\u0443\u0436\u0435\u043d, \u0447\u0442\u043e\u0431\u044b \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 <code>custom0<\/code>&#8212;<code>custom3<\/code>. \u0411\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u043b\u0433\u043e \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u043f\u043e\u0447\u0435\u043c\u0443 \u043b\u043e\u0432\u0438\u0442\u0441\u044f illegal instruction, \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u0435\u043b\u044c, \u0430 \u043e\u043d, \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043f\u0440\u043e\u0441\u0442\u043e \u044f\u0432\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d. \u041f\u043b\u044f\u0441\u043a\u0438 \u0441 <code>define<\/code>-\u0430\u043c\u0438 \u043d\u0443\u0436\u043d\u044b \u043f\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0440\u0438 \u00ab\u0437\u0430\u0430\u043f\u0441\u0442\u0440\u0438\u043c\u043b\u0438\u0432\u0430\u043d\u0438\u0438\u00bb binutils \u043c\u043d\u0435\u043c\u043e\u043d\u0438\u043a\u0438 <code>customX<\/code> \u0431\u044b\u043b\u0438 \u0432\u044b\u043a\u0438\u043d\u0443\u0442\u044b \u043a\u0430\u043a \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f RocketChip, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0430\u0439\u0442\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u0438\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0432 sdboot \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0443\u0440\u0435\u0437\u0430\u043d\u043d\u0430\u044f, \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u043b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432 \u043a\u043e\u0434, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u043d\u0438\u0445 \u0432 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0435.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ \/hdd\/trosinenko\/rocket-tools\/bin\/riscv32-unknown-elf-gdb -q  -ex \"target remote :3333\" -ex \"set directories bootrom\" builds\/zeowaa-e115\/sdboot.elf Reading symbols from builds\/zeowaa-e115\/sdboot.elf...done. Remote debugging using :3333 0x0000000000000000 in ?? () (gdb) x\/d 0x81005000 0x81005000:     123 (gdb) set variable $pc=0x10000 (gdb) c Continuing. ^C Program received signal SIGINT, Interrupt. 0x0000000000010488 in crc16_round (data=&lt;optimized out&gt;, crc=&lt;optimized out&gt;) at sd.c:151 151             crc ^= data; (gdb) x\/d 0x81005000 0x81005000:     246<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c funct1<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">$ \/hdd\/trosinenko\/rocket-tools\/bin\/riscv32-unknown-elf-gdb -q  -ex \"target remote :3333\" -ex \"set directories bootrom\" builds\/zeowaa-e115\/sdboot.elf Reading symbols from builds\/zeowaa-e115\/sdboot.elf...done. Remote debugging using :3333 0x0000000000010194 in main () at sd.c:247 247             CUSTOMX_R_R_R(0, res, 0xabcdef, 0x123456, 1); (gdb) set variable $a5=0 (gdb) set variable $pc=0x10194 (gdb) set variable $a4=0xaa (gdb) display\/10i $pc-10 1: x\/10i $pc-10    0x1018a &lt;main+46&gt;:   sw      a3,124(a3)    0x1018c &lt;main+48&gt;:   addiw   a0,a0,1110    0x10190 &lt;main+52&gt;:   mv      a4,s0    0x10192 &lt;main+54&gt;:   mv      a5,a0 =&gt; 0x10194 &lt;main+56&gt;:   0x2f7778b    0x10198 &lt;main+60&gt;:   mv      s0,a5    0x1019a &lt;main+62&gt;:   lbu     a5,0(a1)    0x1019e &lt;main+66&gt;:   addiw   a3,a3,-1    0x101a0 &lt;main+68&gt;:   mul     a2,a2,a5    0x101a4 &lt;main+72&gt;:   bnez    a3,0x1019a &lt;main+62&gt; (gdb) display\/x $a5 2: \/x $a5 = 0x0 (gdb) si 0x0000000000010198      247             CUSTOMX_R_R_R(0, res, 0xabcdef, 0x123456, 1); 1: x\/10i $pc-10    0x1018e &lt;main+50&gt;:   li      a0,25    0x10190 &lt;main+52&gt;:   mv      a4,s0    0x10192 &lt;main+54&gt;:   mv      a5,a0    0x10194 &lt;main+56&gt;:   0x2f7778b =&gt; 0x10198 &lt;main+60&gt;:   mv      s0,a5    0x1019a &lt;main+62&gt;:   lbu     a5,0(a1)    0x1019e &lt;main+66&gt;:   addiw   a3,a3,-1    0x101a0 &lt;main+68&gt;:   mul     a2,a2,a5    0x101a4 &lt;main+72&gt;:   bnez    a3,0x1019a &lt;main+62&gt;    0x101a6 &lt;main+74&gt;:   li      a5,10 2: \/x $a5 = 0x4 (gdb) set variable $a4=0xaabc (gdb) set variable $pc=0x10194 (gdb) si 0x0000000000010198      247             CUSTOMX_R_R_R(0, res, 0xabcdef, 0x123456, 1); 1: x\/10i $pc-10    0x1018e &lt;main+50&gt;:   li      a0,25    0x10190 &lt;main+52&gt;:   mv      a4,s0    0x10192 &lt;main+54&gt;:   mv      a5,a0    0x10194 &lt;main+56&gt;:   0x2f7778b =&gt; 0x10198 &lt;main+60&gt;:   mv      s0,a5    0x1019a &lt;main+62&gt;:   lbu     a5,0(a1)    0x1019e &lt;main+66&gt;:   addiw   a3,a3,-1    0x101a0 &lt;main+68&gt;:   mul     a2,a2,a5    0x101a4 &lt;main+72&gt;:   bnez    a3,0x1019a &lt;main+62&gt;    0x101a6 &lt;main+74&gt;:   li      a5,10 2: \/x $a5 = 0x9<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p><a href=\"https:\/\/github.com\/atrosinenko\/simpleinst\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434<\/a><\/p>\n<\/div>\n<p>               <script class=\"js-mediator-script\">!function(e){function t(t,n){if(!(n in e)){for(var r,a=e.document,i=a.scripts,o=i.length;o--;)if(-1!==i[o].src.indexOf(t)){r=i[o];break}if(!r){r=a.createElement(\"script\"),r.type=\"text\/javascript\",r.async=!0,r.defer=!0,r.src=t,r.charset=\"UTF-8\";var d=function(){var e=a.getElementsByTagName(\"script\")[0];e.parentNode.insertBefore(r,e)};\"[object Opera]\"==e.opera?a.addEventListener?a.addEventListener(\"DOMContentLoaded\",d,!1):e.attachEvent(\"onload\",d):d()}}}t(\"\/\/mediator.mail.ru\/script\/2820404\/\",\"_mediator\")}(window);<\/script>     <br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/461577\/\"> https:\/\/habr.com\/ru\/post\/461577\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\">\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u0432\u0435\u043b\u0430\u0441\u044c \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043c \u0441 RISC-V \u044f\u0434\u0440\u043e\u043c RocketChip, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e, \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u044f\u0434\u0440\u0430 \u043d\u0430 \u00ab\u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e\u00bb \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043f\u043b\u0430\u0442\u0443 \u0441 \u041f\u041b\u0418\u0421 \u0444\u0438\u0440\u043c\u044b Altera (\u0442\u0435\u043f\u0435\u0440\u044c \u0443\u0436\u0435 Intel). \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0432 <a href=\"https:\/\/habr.com\/ru\/post\/459470\/\">\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0447\u0430\u0441\u0442\u0438<\/a> \u043d\u0430 \u044d\u0442\u043e\u0439 \u043f\u043b\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c Linux. \u0417\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u043c\u0435\u043d\u044f \u0432\u043e \u0432\u0441\u0451\u043c \u044d\u0442\u043e\u043c \u0437\u0430\u0431\u0430\u0432\u043b\u044f\u043b\u043e? \u0422\u043e, \u0447\u0442\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043c RISC-V, C \u0438 Scala, \u0438 \u0438\u0437 \u0432\u0441\u0435\u0445 \u043d\u0438\u0445 Scala \u0431\u044b\u043b\u0430 \u0441\u0430\u043c\u044b\u043c \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c (\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u043d\u0435\u0439 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440).<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b C \u0442\u043e\u0436\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e \u043e\u0431\u0438\u0434\u043d\u043e. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0435\u0441\u043b\u0438 \u0441\u0432\u044f\u0437\u043a\u0430 Scala+Chisel \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u043b\u0438\u0448\u044c \u043a\u0430\u043a <a href=\"https:\/\/en.wikipedia.org\/wiki\/Domain-specific_language\">domain-specific language<\/a> \u0434\u043b\u044f \u044f\u0432\u043d\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u0443\u0440\u044b, \u0442\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u00ab\u0437\u0430\u0442\u044f\u0433\u0438\u0432\u0430\u0442\u044c\u00bb \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430 C \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0432 \u0432\u0438\u0434\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0436\u0435 \u0446\u0435\u043b\u044c \u2014 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0445 AFL-like \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0439 \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 <a href=\"https:\/\/habr.com\/ru\/post\/452608\/\">QInst<\/a>, \u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u2014 \u043b\u0438\u0448\u044c \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-292668","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/292668","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=292668"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/292668\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=292668"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=292668"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=292668"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}