{"id":466183,"date":"2025-07-06T21:00:11","date_gmt":"2025-07-06T21:00:11","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=466183"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=466183","title":{"rendered":"<span>\u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043d\u0430 \u043a\u043e\u043b\u0435\u043d\u043a\u0435 \u0447.4. \u041a\u043e\u043d\u0432\u0435\u0439\u0435\u0440<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/2y\/98\/ri\/2y98rixlc8wiwcqge13wz3xg2-g.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/2y\/98\/ri\/2y98rixlc8wiwcqge13wz3xg2-g.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/2y\/98\/ri\/2y98rixlc8wiwcqge13wz3xg2-g.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> \u0412 <a href=\"https:\/\/habr.com\/ru\/articles\/922858\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0447\u0430\u0441\u0442\u0438<\/a> \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 M (\u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0435), \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u043e\u0434 \u041f\u041b\u0418\u0421 Cyclone IV. \u041f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 Quartus \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u0441 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u0435\u0451 \u043d\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e, \u0438 \u044d\u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u044b\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u044f\u043c. <\/p>\n<h2>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c<\/h2>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u0448\u0438\u0431\u043a\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u0432 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u044f\u0434\u0440\u0430 (core_tb.v), \u0442\u0430\u043c \u0433\u0434\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430 \u043f\u0430\u043c\u044f\u0442\u044c. \u041f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0431\u043b\u043e\u043a, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043f\u043e \u0442\u0430\u043a\u0442\u043e\u0432\u043e\u043c\u0443 \u0441\u0438\u0433\u043d\u0430\u043b\u0443, \u043a\u0430\u043a \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u0438\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440, \u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435.<\/p>\n<pre><code class=\"vhdl\">reg [31:0] i_data; \/\/ \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f reg [31:0] old_data; \/\/ \u0434\u0430\u043d\u043d\u044b\u0435 always@(posedge clock) begin i_data &lt;= rom[i_addr[31:2]]; old_data &lt;= rom[d_addr[31:2]]; end <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0442\u0430\u043a\u0442\u0435 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f <em>\u044d\u0442\u043e\u0439 \u0436\u0435<\/em> \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438. \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u0440\u0430\u0437\u043e\u0431\u044c\u0451\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u044d\u0442\u0430\u043f\u044b, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0442\u0430\u043a\u0442\u0435, \u0438 \u043f\u043e\u043a\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u0430\u043f \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0430\u0440\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e, \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0443\u0436\u0435 \u0441 \u043d\u043e\u0432\u043e\u0439. \u0422\u0430\u043a\u0430\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u043e\u043c, \u0438 \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u043e\u043d \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432 intel \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 <a href=\"https:\/\/habr.com\/ru\/articles\/182002\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a>. \u041f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0430\u0434\u0438\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u0445, \u043d\u0430\u0434\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0432 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b. \u0417\u0432\u0443\u0447\u0438\u0442 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043d\u043e \u043d\u0435\u0434\u0435\u043b\u044e \u043d\u0430 \u043e\u0442\u043b\u0430\u0434\u043a\u0443 \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0442\u0430\u043a\u0438 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c. \u0412 \u043e\u0431\u0449\u0435\u043c \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u043f\u0440\u043e\u0432\u043e\u043b\u043e\u0447\u043a\u0438 \u043d\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b, \u043f\u0438\u0448\u0435\u043c \u0442\u0443\u0434\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0434\u0430\u043b\u043e \u044f\u0434\u0440\u043e, \u0438 \u043c\u0435\u043d\u044f\u0435\u043c \u0438\u0445 \u0432 \u043c\u0435\u0441\u0442\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<pre><code class=\"vhdl\">reg [31:0] old_data_out; reg [31:0] old_addr; reg [1:0] old_width; reg old_data_w; reg old_data_r; always@(posedge clock) begin old_data_out &lt;= d_data_out; old_addr &lt;= d_addr; old_width &lt;= d_width; old_data_w &lt;= data_w; old_data_r &lt;= data_r; end  wire [1:0] addr_tail = old_addr[1:0]; ... <\/code><\/pre>\n<p>\u0415\u0449\u0451 \u043e\u0434\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0440\u0443\u0433\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440, \u0441\u0432\u044f\u0437\u0430\u043d\u0430 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u043d\u0435 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0430\u043a\u0442\u043e\u0432\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u043d\u0430\u0434\u043e \u0437\u0430\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b. \u041e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043b\u0438\u0448\u043d\u0435\u0435 \u0432 `ifdef SIMULATION.<\/p>\n<pre><code class=\"vhdl\">`ifdef SIMULATION reg clock = 0; reg reset = 1; `else input wire clock; input wire reset; `endif ... <\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432 \u0438\u0442\u043e\u0433\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u044f\u0434\u0440\u0430 core_tb.v (\u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0446\u0435\u043b\u0438\u043a\u043e\u043c).<\/p>\n<h2>\u042f\u0434\u0440\u043e<\/h2>\n<p>\u0421\u043d\u0430\u0440\u0443\u0436\u0438 \u0432\u0441\u0451 \u0441\u043b\u043e\u043c\u0430\u043b\u0438, \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u0434\u0451\u043c \u043f\u0440\u0438\u0441\u043f\u043e\u0441\u0430\u0431\u043b\u0438\u0432\u0430\u0442\u044c \u044f\u0434\u0440\u043e \u043a \u043d\u043e\u0432\u044b\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c. \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u043a\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d \u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<\/p>\n<pre><code class=\"vhdl\">module RiscVCore ( input clock, input reset,  output [31:0] instruction_address, input  [31:0] instruction_data,  output [31:0] data_address, output [1:0]  data_width, input  [31:0] data_in, output [31:0] data_out, output        data_read, output        data_write ); <\/code><\/pre>\n<h3>\u042d\u0442\u0430\u043f 0, \u0437\u0430\u043f\u0440\u043e\u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 (Fetch)<\/h3>\n<p>\u041a\u0430\u043a \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043f\u0443\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445? \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430 \u0448\u0438\u043d\u0443 \u0430\u0434\u0440\u0435\u0441\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"vhdl\">wire [31:0] stage0_pc; assign instruction_address = stage0_pc; <\/code><\/pre>\n<p>\u041f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c\u0441\u044f, \u043e\u0442\u043a\u0443\u0434\u0430 \u043e\u043d\u043e \u0432\u0437\u044f\u043b\u043e\u0441\u044c, \u043f\u043e\u0442\u043e\u043c \u043a\u0430\u043a \u0440\u0443\u043a\u0438 \u0434\u043e\u0439\u0434\u0443\u0442, \u0442\u043e\u0433\u0434\u0430 \u0438 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c. \u041d\u0430 \u044d\u0442\u043e\u043c \u043d\u0443\u043b\u0435\u0432\u0430\u044f \u0441\u0442\u0430\u0434\u0438\u044f \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0430\u0441\u044c. \u0412\u043e\u043e\u0431\u0449\u0435 \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c\u0441\u044f \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0441\u0442\u043e\u0438\u0442 \u0434\u0430\u0442\u044c \u0438\u043c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b \u043f\u043e \u043d\u043e\u043c\u0435\u0440\u0443 \u044d\u0442\u0430\u043f\u0430 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043e\u043d\u0438 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f. \u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u044d\u0442\u0430\u043f\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438, \u043d\u043e \u043f\u043e\u043a\u0430 \u044f\u0434\u0440\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0435 (280 \u0441\u0442\u0440\u043e\u043a), \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0432\u043e\u0437\u0438\u0442\u044c\u0441\u044f.<\/p>\n<h3>\u042d\u0442\u0430\u043f 1, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u0430\u043d\u043d\u044b\u0445 (Decode, Execute)<\/h3>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0443\u0436\u0435 \u043f\u0440\u0438\u0435\u0445\u0430\u043b\u043e \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u043c \u0435\u0433\u043e \u0438 \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u044c.<\/p>\n<pre><code class=\"vhdl\">wire [31:0] instruction = instruction_data; <\/code><\/pre>\n<p>\u041f\u0440\u0438\u0448\u043b\u0430 \u043f\u043e\u0440\u0430 \u0437\u0430\u0434\u0443\u043c\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0448 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440, \u0430 \u0447\u0442\u043e\u0431\u044b \u0434\u0443\u043c\u0430\u043b\u043e\u0441\u044c \u043b\u0443\u0447\u0448\u0435, \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043e\u0434\u043d\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0438\u0437 \u0442\u0435\u0441\u0442\u0430.<\/p>\n<pre><code class=\"cpp\">sw  a5,0(sp)    \/\/ *(sp + 0) = a5 lw  a4,0(sp)    \/\/ a4 = *(sp + 0) <\/code><\/pre>\n<p>\u041f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043d\u0430 \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u0435\u0434\u0432\u0435\u0449\u0430\u043b\u043e.<\/p>\n<pre><code class=\"cpp\">core_init_matrix(results[0].size,   results[i].memblock[2],   (ee_s32)results[i].seed1   | (((ee_s32)results[i].seed2) &lt;&lt; 16),  \/\/ &lt;- \u043e\u0442\u0441\u044e\u0434\u0430 \u043a\u0430\u043a-\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c   &amp;(results[i].mat)); <\/code><\/pre>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u044f &#171;\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f&#187; \u0438 &#171;\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f&#187; \u043f\u0430\u043c\u044f\u0442\u044c \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430 \u0437\u0432\u0443\u0447\u0430\u0442 \u043f\u0430\u0440\u0430\u0434\u043e\u043a\u0441\u0430\u043b\u044c\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e\u0434 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u0437\u043e\u0432\u0430, \u043d\u043e \u0437\u0434\u0435\u0441\u044c \u0432\u0441\u0451 \u0438\u043d\u0430\u0447\u0435. \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0438 \u0432\u044b\u0434\u0430\u043b\u0430 \u0430\u0434\u0440\u0435\u0441 \u043d\u0430 \u0448\u0438\u043d\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0442\u0430\u043a\u0442\u0435. \u0421 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0435\u0449\u0451 \u0445\u0443\u0436\u0435, \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u044f\u0434\u0440\u0430 \u0432\u0441\u0451 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0440\u0430\u0437\u0443, \u043d\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c RMW (read-modify-write). \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0435 \u0432\u0441\u0451 32-\u0431\u0438\u0442\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u044c (\u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 <strong>data_width<\/strong>), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u0432\u044f\u0437\u043a\u0435 \u043d\u0430\u0434\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u0442, \u0438 \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0412 \u0438\u0442\u043e\u0433\u0435 \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 \u0432\u0438\u0434\u0430 &#171;\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c&#187;, &#171;\u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c&#187; \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u043e\u0448\u0438\u0431\u043a\u0435, \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u044b \u0431\u0443\u0434\u0443\u0442 \u0441\u0442\u0430\u0440\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u0427\u0438\u043d\u0438\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c 8-\u0431\u0438\u0442\u043d\u043e\u0439*4, \u0442\u043e\u0433\u0434\u0430 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0437\u0430 1 \u0442\u0430\u043a\u0442. \u041c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441\u0430 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0448\u0438\u043d\u044b \u0438 \u0435\u0441\u043b\u0438 \u0441\u043e\u0432\u043f\u0430\u043b\u0438, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043d\u043e \u0442\u0443\u0442 \u0432\u043e\u043f\u0440\u043e\u0441, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441 volatile \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438, \u0431\u0443\u0434\u0435\u0442 \u043b\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0431\u0430\u0439\u0442 \u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e (\u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u0442, \u0437\u0430\u043c\u0435\u043d\u0438\u0442 \u0431\u0430\u0439\u0442, \u0437\u0430\u043f\u0438\u0448\u0435\u0442). \u0412 \u043e\u0431\u0449\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c, \u043a\u0430\u043a \u043e\u0431\u043e\u0439\u0442\u0438 \u044d\u0442\u0443 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u043d\u043e \u044d\u0442\u043e \u0432\u0441\u0451 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435.<\/p>\n<h4>\u0413\u0434\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440<\/h4>\n<p>\u0410 \u043c\u044b \u043f\u043e\u043a\u0430 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435: \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0442\u0430\u043a\u0442\u0435. \u0417\u043d\u0430\u0447\u0438\u0442 \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u0430\u043f \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440, \u0438 \u0442\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441, \u0441\u0442\u043e\u0438\u0442 \u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u0442\u0438\u043f\u0430\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0442\u043e\u0436\u0435 \u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430 \u0438\u043b\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443? \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0443\u0434\u043b\u0438\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 \u0432\u0440\u0435\u0434\u043d\u043e, \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u0442\u0430\u0434\u0438\u0439, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430, \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0447\u0430\u0441\u0442\u043e\u0442\u0443. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0437\u0430\u043f\u0438\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u0425\u043e\u0442\u044f \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0441 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u044b, \u043d\u043e \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u043c\u0435\u043d\u044b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439.<\/p>\n<h4>\u0424\u043b\u0430\u0433\u0438 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430<\/h4>\n<p>\u0412\u044b\u0448\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u043b\u0438 \u043f\u0440\u043e \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432, \u0441\u0435\u0439\u0447\u0430\u0441 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f, \u043a\u0430\u043a \u0435\u0433\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c, \u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u0449\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e. \u041f\u043e \u043a\u0430\u043a\u0438\u043c \u043f\u043e\u0432\u043e\u0434\u0430\u043c \u0433\u0438\u043f\u043e\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d? \u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439, \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u0442\u0430\u043f \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u043e\u0442\u0430\u043a\u0442\u043e\u0432\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0430\u043c \u0441\u0435\u0431\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442. \u0422\u0443\u0442 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e, \u0435\u0441\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u0435\u0449\u0451 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u0430, \u0437\u043d\u0430\u0447\u0438\u0442, \u043d\u0430\u0434\u043e \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u044d\u0442\u0430\u043f (\u043f\u0443\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u0443\u0444\u0444\u0438\u043a\u0441 <strong>wait<\/strong>) \u0438 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u044d\u0442\u0430\u043f\u0443, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043f\u043e\u043a\u0430 \u043d\u0435\u0442 (<strong>empty<\/strong>). \u0412\u0442\u043e\u0440\u043e\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0435\u0449\u0451 \u043d\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u044d\u0442\u0430\u043f\u0430 (<strong>jam_up<\/strong>). \u041f\u043e\u0434\u043e\u0431\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442, \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0435\u0449\u0451 \u043d\u0435 \u0443\u0441\u043f\u0435\u043b\u0430 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440, \u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0443\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<br \/> \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0444\u043b\u0430\u0436\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430.<\/p>\n<pre><code class=\"vhdl\">wire stage1_jam_up; \/\/\u0441\u0442\u0430\u0434\u0438\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0434\u0438\u0435\u0439 reg stage1_empty; \/\/\u0441\u0442\u0430\u0434\u0438\u044f \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u044d\u0442\u0430\u043f\u0430 wire stage1_pause = stage1_empty || stage1_jam_up; \/\/\u0441\u0442\u0430\u0434\u0438\u0438 \u043f\u043e\u043a\u0430 \u043d\u0435\u043b\u044c\u0437\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \/\/\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u044d\u0442\u0430\u043f\u0430 wire [31:0] pc; \/\/pc &lt;= stage0_pc  always@(posedge clock or posedge reset) begin if (reset == 1) begin stage1_empty &lt;= 1; end else begin stage1_empty &lt;= 0; end end <\/code><\/pre>\n<p><strong>stage1_jam_up<\/strong> \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u044d\u0442\u0430\u043f\u043e\u043c.<br \/> \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043d\u0435 \u0441\u0440\u0430\u0437\u0443, \u0443 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0434\u0438\u0438 \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u0430 \u043a \u0440\u0430\u0431\u043e\u0442\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u044d\u0442\u0430\u043f \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043b \u0435\u0439 \u0434\u0430\u043d\u043d\u044b\u0435. \u0417\u0430 \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0444\u043b\u0430\u0433 <strong>stage1_empty<\/strong>. \u0421\u0435\u0439\u0447\u0430\u0441 \u043e\u043d \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430 \u0441\u0431\u0440\u043e\u0441 \u0440\u0430\u0431\u043e\u0442\u044b, \u043d\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u044d\u0448\u0430 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u0445\u043e\u0434\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438. \u041a\u0441\u0442\u0430\u0442\u0438 \u0433\u043e\u0432\u043e\u0440\u044f, \u0435\u0441\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043c\u043d\u043e\u0433\u043e\u0442\u0430\u043a\u0442\u043e\u0432\u0430\u044f, \u0442\u043e \u043d\u0430\u043c \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0430\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \u044d\u0442\u0430\u043f 0 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f.<\/p>\n<pre><code class=\"vhdl\">wire stage1_wait = stage1_pause || stage1_working; assign stage0_pc = stage1_wait ? pc : (is_op_branch &amp;&amp; branch_fired) ? pc_branch : is_op_jal ? pc_jal : is_op_jalr ? pc_jalr : pc + 4; <\/code><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u0434\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043d\u0430 \u0447\u0442\u043e \u0436\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0434\u0438\u0438. \u041d\u0430 \u043e\u0434\u043d\u043e\u0442\u0430\u043a\u0442\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0410\u041b\u0423 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f, \u043b\u0438\u0448\u044c \u0431\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u043a\u0438\u043d\u0443\u043b\u0438 (\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u043a\u0430 \u043d\u0435\u0442). \u0412\u043e\u0442 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u043b\u0443\u0447\u0448\u0435 \u043b\u0438\u0448\u043d\u0438\u0439 \u0440\u0430\u0437 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0435\u0433\u043e \u043b\u0438\u0448\u043d\u0435\u0433\u043e.<\/p>\n<pre><code class=\"vhdl\">assign data_read = is_op_load &amp;&amp; !stage1_pause; assign data_write = is_op_store &amp;&amp; !stage1_pause; <\/code><\/pre>\n<p>\u0423\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0433\u043e\u0442\u0430\u043a\u0442\u043e\u0432\u043e\u0435, \u0435\u043c\u0443 \u0442\u043e\u0436\u0435 \u043d\u0435 \u0434\u0430\u0451\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0431\u0435\u0437 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<pre><code class=\"vhdl\">wire [31:0] rd_mul; wire is_mul_wait; RiscVMul mul( .clock(clock), .reset(reset), .enabled(!stage1_pause &amp;&amp; is_op_multiply), .op_funct3(op_funct3), .reg_s1(reg_s1), .reg_s2(reg_s2), .rd_mul(rd_mul), .is_mul_wait(is_mul_wait) ); <\/code><\/pre>\n<p>\u0421 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. \u0411\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u043e\u0442\u0430\u043a\u0442\u043e\u0432\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439.<\/p>\n<pre><code class=\"vhdl\">wire stage1_working = is_mul_wait; <\/code><\/pre>\n<p>\u0417\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u0444\u0430\u043a\u0442 \u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0434\u0438\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435 \u0432\u0441\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043f\u0438\u0448\u0443\u0442 \u0432 <strong>rd<\/strong>.<\/p>\n<pre><code class=\"vhdl\">wire write_rd_instruction = is_op_load || is_op_alu || is_op_alu_imm  || is_op_load_upper || is_op_add_upper || is_op_jal || is_op_jalr; wire is_rd_changed = (!(stage1_working || op_rd == 0)) &amp;&amp; write_rd_instruction; \u0418 \u0432\u044b\u0434\u0430\u0451\u043c \u0441\u0430\u043c\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0434\u0438\u0438. wire [31:0] stage1_rd = \/*is_op_load ? rd_load :*\/ is_op_multiply ? rd_mul : is_op_alu || is_op_alu_imm ? rd_alu : is_op_load_upper ? rd_load_upper : is_op_add_upper ? rd_add_upper : is_op_jal || is_op_jalr ? rd_jal : 0; <\/code><\/pre>\n<h3>\u042d\u0442\u0430\u043f 2, \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u0445 (Write)<\/h3>\n<p>\u041d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u0434\u0435\u043b\u0430\u043b\u0438, \u0437\u0434\u0435\u0441\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0438 \u0432\u044b\u0434\u0430\u0442\u044c \u0444\u043b\u0430\u0433\u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u043c \u0442\u043e, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043b \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u044d\u0442\u0430\u043f, \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b.<\/p>\n<pre><code class=\"vhdl\">reg [2:0] stage2_funct3; reg stage2_is_op_load; reg stage2_is_op_store; reg [31:0] stage2_addr; reg [31:0] stage2_rd; reg[4:0] stage2_op_rd; reg stage2_is_rd_changed; reg stage2_empty; \/\/\u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0441\u0442\u0430\u0434\u0438\u044f \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0430  always@(posedge clock or posedge reset) begin if (reset == 1) begin stage2_funct3 &lt;= 0; stage2_is_op_load &lt;= 0; stage2_is_op_store &lt;= 0; stage2_addr &lt;= 0; stage2_rd &lt;= 0; stage2_op_rd &lt;= 0; stage2_is_rd_changed &lt;= 0; stage2_empty &lt;= 0; end else begin stage2_funct3 &lt;= op_funct3; stage2_is_op_load &lt;= is_op_load; stage2_is_op_store &lt;= is_op_store; stage2_addr &lt;= data_address; stage2_rd &lt;= stage1_rd; stage2_op_rd &lt;= op_rd; stage2_is_rd_changed &lt;= is_rd_changed; stage2_empty &lt;= stage1_wait; end end <\/code><\/pre>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438, \u0438\u0445 \u0435\u0449\u0451 \u043d\u0430\u0434\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f <strong>funct3<\/strong>. \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 <strong>rd<\/strong> \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u043e \u043d\u0430 \u044d\u0442\u043e\u0442 \u044d\u0442\u0430\u043f.<\/p>\n<pre><code class=\"vhdl\">wire load_signed = ~stage2_funct3[2]; wire [31:0] rd_load = stage2_funct3[1:0] == 0 ? {{24{load_signed &amp; data_in[7]}}, data_in[7:0]} : \/\/0-byte                       stage2_funct3[1:0] == 1 ? {{16{load_signed &amp; data_in[15]}}, data_in[15:0]} : \/\/1-half                       data_in; \/\/2-word <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u044b, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430.<\/p>\n<pre><code class=\"vhdl\">wire [31:0] stage2_rd_result = stage2_is_op_load ? rd_load : stage2_rd; <\/code><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0434\u0438\u0438, \u0438 \u043f\u0440\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0438 \u0441 \u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u043c \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u043b\u0430\u0436\u043e\u043a.<\/p>\n<pre><code class=\"vhdl\">wire stage2_rs1_equal = (stage2_op_rd == op_rs1) &amp;&amp; (type_r || type_i || type_s || type_b); wire stage2_rs2_equal = (stage2_op_rd == op_rs2) &amp;&amp; (type_r || type_s || type_b); wire stage2_rd_fired = stage2_is_rd_changed &amp;&amp; (stage2_rs1_equal || stage2_rs2_equal); <\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u043f\u043e\u0442\u043e\u043c \u0447\u0442\u0435\u043d\u0438\u0435, \u0442\u043e\u0436\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u043b\u0430\u0436\u043e\u043a.<\/p>\n<pre><code class=\"vhdl\">wire stage2_memory_fired = (stage2_is_op_store &amp;&amp; (is_op_load || is_op_store) &amp;&amp; stage2_addr[31:2] == data_address[31:2]); <\/code><\/pre>\n<p>\u0412\u044b\u043a\u0438\u0434\u044b\u0432\u0430\u043d\u0438\u0435 \u0444\u043b\u0430\u0436\u043a\u0430 <strong>is_op_load<\/strong> \u0438\u0437 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044e \u043e\u0448\u0438\u0431\u043e\u043a crc \u0432 \u0442\u0435\u0441\u0442\u0435 (\u0434\u0430 \u043a\u0430\u043a \u0442\u0430\u043a?), \u043d\u043e \u043a\u0430\u043a \u0432\u044b\u0448\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c, \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0435\u0441\u0442\u044c. \u0424\u043b\u0430\u0436\u043e\u043a <strong>is_op_store<\/strong> \u0437\u0434\u0435\u0441\u044c \u043d\u0443\u0436\u0435\u043d \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0434\u0432\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u0430\u0439\u0442\u0430, \u043b\u0435\u0436\u0430\u0449\u0438\u0445 \u0432 \u043e\u0434\u043d\u043e\u043c 32-\u0431\u0438\u0442\u043d\u043e\u043c \u0441\u043b\u043e\u0432\u0435. \u0415\u0441\u043b\u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043e\u0434\u0438\u043d \u0438 \u0442\u0443\u0442 \u0436\u0435 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439, \u0442\u043e \u0434\u043b\u044f \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043e \u043d\u0435\u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<br \/> \u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u0444\u043b\u0430\u0436\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c, \u0434\u043e\u043b\u0436\u0435\u043d \u043b\u0438 \u0436\u0434\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u044d\u0442\u0430\u043f (\u043e\u043d \u0436\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f).<\/p>\n<pre><code class=\"vhdl\">assign stage1_jam_up = !stage2_empty &amp;&amp; (stage2_rd_fired || stage2_memory_fired); <\/code><\/pre>\n<p>\u0412\u043e\u043f\u0440\u043e\u0441 \u043e \u0442\u043e\u043c, \u043a \u043a\u0430\u043a\u043e\u043c\u0443 \u044d\u0442\u0430\u043f\u0443 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u044d\u0442\u043e\u0442 \u0444\u043b\u0430\u0436\u043e\u043a, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u0438\u0441\u043a\u0443\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u043c. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u044f\u0446\u0438\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043d\u0430\u0434\u043e \u0432\u044b\u043d\u043e\u0441\u0438\u0442\u044c \u043d\u0430 \u044d\u0442\u0430\u043f 1, \u0432\u0435\u0434\u044c \u0441 \u0440\u043e\u0441\u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u043e\u0439 \u0438\u0437 \u043d\u0438\u0445 \u043d\u0430\u0434\u043e 2, \u0430 \u043a\u0430\u043a\u043e\u0439 1 \u0440\u0435\u0433\u0438\u0441\u0442\u0440.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0432\u044b\u043d\u0435\u0441\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0438 \u043f\u043e\u0434\u0430\u0434\u0438\u043c \u043d\u0430 \u0432\u0445\u043e\u0434 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"vhdl\">RiscVRegs regs( .clock(clock), .reset(reset),  .enable_write_pc(!stage1_wait), .pc_val(pc), \/\/\u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0430\u0434\u0440\u0435\u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 .pc_next(stage0_pc), \/\/\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0430\u0434\u0440\u0435\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438  .rs1_index(op_rs1), \/\/\u0447\u0438\u0442\u0430\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b-\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b .rs2_index(op_rs2), .rs1(reg_s1), .rs2(reg_s2),  .enable_write_rd(stage2_is_rd_changed &amp;&amp; !stage2_empty), \/\/\u043f\u0438\u0448\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 .rd_index(stage2_op_rd), .rd(stage2_rd_result) ); <\/code><\/pre>\n<p>\u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u0434 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u041f\u041b\u0418\u0421, \u0438 \u043d\u0430\u0434\u043e \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0431\u043d\u0443\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043f\u0440\u0438 \u0441\u0431\u0440\u043e\u0441\u0435.<\/p>\n<pre><code class=\"vhdl\">`ifdef SIMULATION integer i; initial begin for (i = 1; i &lt; `REG_COUNT; i = i + 1) begin regs[i] = 0; end end `endif <\/code><\/pre>\n<h2>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h2>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c icarus \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0440\u0430\u0437\u044a\u0435\u0445\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0430\u043a\u0442\u044b.<br \/> \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0435\u0449\u0451 \u043d\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d.<\/p>\n<pre><code class=\"cpp\">     98c:81c70693          addia3,a4,-2020 # 81c &lt;core_list_init+0x104&gt;      990:00c686b3          adda3,a3,a2      994:01c10613          addia2,sp,28 <\/code><\/pre>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/uz\/zw\/zc\/uzzwzcrlmhj6q5dnm1f1nh6z88q.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/uz\/zw\/zc\/uzzwzcrlmhj6q5dnm1f1nh6z88q.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/uz\/zw\/zc\/uzzwzcrlmhj6q5dnm1f1nh6z88q.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> \u0421\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u04303 \u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 98c \u0438 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 990 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u0435\u0441\u044c \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440. <strong>stage2_rd_fired<\/strong> \u043d\u0435 \u0434\u0430\u0451\u0442 \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0434\u0438\u0438, \u0430 <strong>stage1_wait<\/strong> \u043d\u0435 \u0434\u0430\u0451\u0442 \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0441\u0442\u0430\u0434\u0438\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0442\u0435\u0441\u0442\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. <\/p>\n<pre><code>2K performance run parameters for coremark. CoreMark Size    : 666 Total ticks      : 4363 Total time (secs): 43 Iterations\/Sec   : 0 Iterations       : 1 Compiler version : GCC12.2.0 Compiler flags   : compiler_flags Memory location  : STACK seedcrc          : 0xe9f5 [0]crclist       : 0xe714 [0]crcmatrix     : 0x1fd7 [0]crcstate      : 0x8e3a [0]crcfinal      : 0xe714 Correct operation validated. See README.md for run and reporting rules. CoreMark end 4654 core_tb.v:131: $finish called at 941319 (1ns) <\/code><\/pre>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/za\/gw\/pk\/zagwpkswoxswxuuga8pcoejm7vo.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/za\/gw\/pk\/zagwpkswoxswxuuga8pcoejm7vo.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/za\/gw\/pk\/zagwpkswoxswxuuga8pcoejm7vo.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/qx\/_o\/vm\/qx_ovmugv3vzruttxq8m5dlxygq.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/qx\/_o\/vm\/qx_ovmugv3vzruttxq8m5dlxygq.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/qx\/_o\/vm\/qx_ovmugv3vzruttxq8m5dlxygq.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p> 43 \u0442\u0438\u043a\u0430, 2.3 CM\/\u041c\u0413\u0446 \u0432 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u0441 \u043c\u043d\u043e\u0433\u043e\u0442\u0430\u043a\u0442\u043e\u0432\u044b\u043c \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u0430 45.7 \u041c\u0413\u0446, 2943 LUT \u043d\u0430 Cyclone IV. \u041e\u0434\u043d\u043e\u0442\u0430\u043a\u0442\u043e\u0432\u043e\u0435 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430 37 \u0442\u0438\u043a\u043e\u0432, \u0442\u043e \u0435\u0441\u0442\u044c 2.7 CM\/\u041c\u0413\u0446, \u043d\u043e \u0437\u0430 \u0441\u0447\u0451\u0442 \u0440\u0443\u0447\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e 5 \u041c\u0413\u0446. <\/p>\n<pre><code>Total ticks      : 3745 Total time (secs): 37 CoreMark end 4026 core_tb.v:131: $finish called at 814357 (1ns) <\/code><\/pre>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/9f\/7k\/g5\/9f7kg5-8bsnjibnhll8wqk85orc.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/9f\/7k\/g5\/9f7kg5-8bsnjibnhll8wqk85orc.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/9f\/7k\/g5\/9f7kg5-8bsnjibnhll8wqk85orc.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/u1\/sv\/uw\/u1svuwwt1tzsv6jn40vvhoyv44s.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/u1\/sv\/uw\/u1svuwwt1tzsv6jn40vvhoyv44s.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/u1\/sv\/uw\/u1svuwwt1tzsv6jn40vvhoyv44s.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h2>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>\u041a\u0442\u043e-\u0442\u043e \u0441\u043a\u0430\u0436\u0435\u0442, \u0431\u0435\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u0435, \u043a\u043e\u0440\u0435\u043c\u0430\u0440\u043a\u0438 \u043d\u0430 \u043c\u0435\u0433\u0430\u0433\u0435\u0440\u0446\u044b \u043f\u0430\u0434\u0430\u044e\u0442. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0442\u0430\u043c \u0443 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432. \u0418\u043d\u043e\u0433\u0434\u0430 \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0439 \u043f\u043e \u043d\u043e\u043c\u0435\u0440\u0430\u043c, \u0430 \u0438\u043d\u043e\u0433\u0434\u0430 \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e \u0434\u0432\u0430 \u0442\u0430\u043a\u0442\u0430.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/1v\/lg\/2y\/1vlg2yfrhqnag1jrktdcnugrirk.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/1v\/lg\/2y\/1vlg2yfrhqnag1jrktdcnugrirk.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/1v\/lg\/2y\/1vlg2yfrhqnag1jrktdcnugrirk.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0422\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0441\u0432\u0435\u0436\u0438\u0439, \u0431\u0435\u0437 \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u0446\u0435\u043f\u043e\u0447\u0435\u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u0435\u0433\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u0451\u0448\u0435\u0432\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u0443\u043d\u0443\u0442\u044c \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u044d\u0442\u0430\u043f, \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044f \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0438\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430. \u042d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0430\u043d\u0430\u043b\u043e\u0433 fusion \u043d\u0430 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u043a\u0430\u0445. \u0410 \u043f\u0440\u0438 \u0447\u0451\u043c \u0442\u0443\u0442 fusion, \u043e\u0431\u043e\u0441\u043d\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e. \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f\u0434\u0435\u0440 \u0432 \u0440\u044f\u0434 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a \u043e\u0434\u043d\u043e\u043c\u0443 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u0443, \u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435\u0435 \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u043d\u0430 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0435 \u044f\u0434\u0440\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0441 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0432 \u0444\u0430\u0439\u043b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0442\u0430\u043a\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0432\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0435\u0441\u043b\u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u043d\u0443\u0436\u0435\u043d \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0435\u0440\u0432\u043e\u0439. \u041e\u0441\u0442\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u043f\u0440\u043e\u0441, \u0437\u0430\u0447\u0435\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u043c, \u043a\u043e\u0433\u0434\u0430 \u0446\u0435\u043b\u0435\u0432\u044b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 (\u0432\u0438\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u0448\u0438\u043d\u044b \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430).<br \/> \u0418 \u0442\u0430\u043a, \u043f\u0435\u0440\u0435\u0434 \u0441\u0430\u043c\u044b\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0437\u0430\u0432\u0435\u0434\u0451\u043c \u0435\u0449\u0451 \u043f\u0430\u0440\u0443 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u043e\u0434\u043e\u0447\u043a\u043e\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430, \u0430 \u043f\u043e\u0442\u043e\u043c \u0441\u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u043c \u0438\u0445 \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f <strong>rd<\/strong>. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0430\u0434\u043e \u0443\u0431\u0440\u0430\u0442\u044c.<\/p>\n<pre><code class=\"vhdl\">assign stage1_jam_up = !stage2_empty &amp;&amp; (\/*stage2_rd_fired ||*\/ stage2_memory_fired);  wire [31:0] reg_s1_file; wire [31:0] reg_s2_file;  assign reg_s1 = (stage2_is_rd_changed &amp;&amp; stage2_rs1_equal) ? stage2_rd_result : reg_s1_file; assign reg_s2 = (stage2_is_rd_changed &amp;&amp; stage2_rs2_equal) ? stage2_rd_result : reg_s2_file;  \/\/\u043d\u0430\u0431\u043e\u0440 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 RiscVRegs regs( ... .rs1(reg_s1_file), .rs2(reg_s2_file), ... ); <\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u0430\u043a\u043e\u0439 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u043f\u0440\u0430\u0432\u043a\u0438 \u043d\u0430\u0448 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043e\u043f\u044f\u0442\u044c \u043b\u0435\u0442\u0430\u0435\u0442. \u041a\u043e\u0440\u0435\u043c\u0430\u0440\u043a\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b, \u043c\u043e\u0436\u043d\u043e \u0441\u043f\u0430\u0442\u044c \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e.<\/p>\n<pre><code>Total ticks      : 3106 Total time (secs): 31 CoreMark end 3342 core_tb.v:131: $finish called at 676031 (1ns) <\/code><\/pre>\n<p>31 \u0442\u0438\u043a, 3.2 CM\/\u041c\u0413\u0446 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0442\u0430\u043a\u0442\u043e\u0432\u043e\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430. \u0414\u043b\u044f \u043c\u043d\u043e\u0433\u043e\u0442\u0430\u043a\u0442\u043e\u0432\u043e\u0433\u043e \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0435\u043b\u0430 \u0434\u043e 44.8 \u041c\u0413\u0446, \u043d\u043e \u0441 \u0442\u0435\u0441\u0442\u043e\u043c \u0432\u0441\u0451 \u0442\u0430\u043a \u0436\u0435 \u0432\u0435\u0440\u043d\u0443\u043b\u043e\u0441\u044c \u043d\u0430 \u043c\u0435\u0441\u0442\u043e, 37 \u0442\u0438\u043a\u043e\u0432, 2.7 CM\/\u041c\u0413\u0446.<\/p>\n<h2>\u0424\u0430\u0439\u043b\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h2>\n<p>\u041e\u0431\u0432\u044f\u0437\u043a\u0430<\/p>\n<details class=\"spoiler\">\n<summary>core_tb.v<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"vhdl\">`include \"common.vh\" `timescale 1ns \/ 1ns  `ifdef SIMULATION module core_tb; `define MEMORY_SIZE (2**16\/4) `else module core_tb(clock, reset, out); `define MEMORY_SIZE (2**14\/4) `endif  `ifdef SIMULATION reg clock = 0; reg reset = 1; `else input wire clock; input wire reset; `endif output reg out; reg [1:0] reset_counter = 2; reg [31:0] rom [0:`MEMORY_SIZE-1]; \/\/\u043f\u0430\u043c\u044f\u0442\u044c wire [31:0] i_addr; reg [31:0] i_data; wire [31:0] d_addr; wire [31:0] d_data_in; wire [31:0] d_data_out; wire data_r; wire data_w; wire [1:0] d_width; \/\/0-byte, 1-half, 2-word wire [3:0] byte_mask;  reg [31:0] timer; reg [31:0] timer_divider;  `ifdef SIMULATION integer i, fdesc, fres; initial while(1) #1 clock = !clock; initial begin $dumpfile(\"core_tb.vcd\"); $dumpvars(); for (i = 0; i &lt; `MEMORY_SIZE; i = i + 1) rom[i] = 32'b0; \/\/$readmemh(\"code.hex\", rom); fdesc = $fopen(\"code.bin\", \"rb\"); fres = $fread(rom, fdesc, 0, `MEMORY_SIZE); $fclose(fdesc); #3000000 $finish(); end  always@(posedge clock) begin reset_counter &lt;= reset_counter == 0 ? 0 : reset_counter - 1; reset &lt;= reset_counter != 0; end `endif  RiscVCore core0 ( .clock(clock), .reset(reset), \/\/.irq,  .instruction_address(i_addr), .instruction_data(i_data),  .data_address(d_addr), .data_width(d_width), .data_in(d_data_in), .data_out(d_data_out), .data_read(data_r), .data_write(data_w) );  \/\/\u0448\u0438\u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u0430 always@(posedge clock) begin i_data &lt;= rom[i_addr[31:2]]; end  \/\/\u0442\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \/\/\u0434\u0435\u043b\u0430\u0435\u043c \u043d\u0435\u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f, \u0442\u043e\u0447\u043d\u0435\u0435 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u0439 \u043f\u043e \u0431\u0430\u0439\u0442\u0430\u043c reg [31:0] old_data; reg [31:0] old_data_out; reg [31:0] old_addr; reg [1:0] old_width; reg old_data_w; reg old_data_r; always@(posedge clock) begin old_data &lt;= (data_r || data_w) ? rom[d_addr[31:2]] : 32'hz; old_data_out &lt;= d_data_out; old_addr &lt;= d_addr; old_width &lt;= d_width; old_data_w &lt;= data_w; old_data_r &lt;= data_r; end  wire [1:0] addr_tail = old_addr[1:0];  \/\/\u0432\u0435\u0448\u0430\u0435\u043c \u043d\u0430 \u043e\u0431\u0449\u0443\u044e \u0448\u0438\u043d\u0443 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0438 \u043f\u0430\u043c\u044f\u0442\u044c assign d_data_in = !old_data_r ? 32'hz : old_addr == 32'h40000008 ? timer : old_addr &lt; `MEMORY_SIZE * 4 ? (old_data &gt;&gt; (addr_tail * 8)) : 32'hz; \/\/TODO data_read \u043d\u0435 \u043d\u0443\u0436\u0435\u043d?  \/\/\u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0430\u0441\u043a\u0430 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u044f\u0434\u0440\u0435, \u0437\u0434\u0435\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 assign byte_mask = old_width == 0 ? 4'b0001 &lt;&lt; addr_tail :                    old_width == 1 ? 4'b0011 &lt;&lt; addr_tail :                                   4'b1111;  \/\/\u0440\u0430\u0437 \u0434\u043b\u044f \u043f\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f \u043d\u0430\u0434\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u0441\u0434\u0432\u0438\u0433 \/\/\u0442\u043e \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0441\u043b\u043e\u0432 \u0434\u0435\u0448\u0435\u0432\u043b\u0435 \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0430 \u0434\u0432\u0430 \u0431\u0430\u0439\u0442\u0430 \/\/TODO \u043d\u0443\u0436\u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u043b\u043e\u0432\u0430? wire [31:0] aligned_out = old_data_out &lt;&lt; addr_tail * 8; wire [31:0] new_data = !old_data_w ? 32'hz : {byte_mask[3] ? aligned_out[31:24] : old_data[31:24], byte_mask[2] ? aligned_out[23:16] : old_data[23:16], byte_mask[1] ? aligned_out[15:8] : old_data[15:8], byte_mask[0] ? aligned_out[7:0] : old_data[7:0]};   always@(posedge clock) begin if (old_data_w) begin rom[old_addr[31:2]] &lt;= new_data; end if (data_w &amp;&amp; d_addr == 32'h4000_0004) begin \/\/\u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 $write(\"%c\", d_data_out); end else if (data_r &amp;&amp; d_addr == 32'h40000008) begin ; \/\/\u0442\u0430\u0439\u043c\u0435\u0440 \u0447\u0438\u0442\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e end else if ((data_r || data_w) &amp;&amp; (d_addr &lt; 8'hff || d_addr &gt; `MEMORY_SIZE * 4)) begin \/\/\u043d\u0443\u043b\u0435\u0432\u044b\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0438 \u0432\u044b\u0445\u043e\u0434 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u044e \u0440\u0430\u0431\u043e\u0442\u044b $finish(); end  if(reset) begin timer = 0; timer_divider = 0; end else begin if (timer_divider == 100) begin timer &lt;= timer + 1; timer_divider &lt;= 0; end else begin timer_divider &lt;= timer_divider + 1; end end out &lt;= data_w; end endmodule <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u042f\u0434\u0440\u043e<\/p>\n<details class=\"spoiler\">\n<summary>core.v<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"vhdl\">\/\/ \u044f\u0434\u0440\u043e risc-v \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 `include \"common.vh\"  \/\/ \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 rv32i `define opcode_load        7'b00000_11 \/\/I \/\/l**   rd,  rs1,imm     rd = m[rs1 + imm]; load bytes `define opcode_store       7'b01000_11 \/\/S \/\/s**   rs1, rs2,imm     m[rs1 + imm] = rs2; store bytes `define opcode_alu         7'b01100_11 \/\/R \/\/***   rd, rs1, rs2     rd = rs1 x rs2; arithmetical `define opcode_alu_imm     7'b00100_11 \/\/I \/\/***   rd, rs1, imm     rd = rs1 x imm; arithmetical with immediate `define opcode_load_upper  7'b01101_11 \/\/U \/\/lui   rd, imm          rd = imm &lt;&lt; 12; load upper imm `define opcode_add_upper   7'b00101_11 \/\/U \/\/auipc rd, imm          rd = pc + (imm &lt;&lt; 12); add upper imm to PC `define opcode_branch      7'b11000_11 \/\/B \/\/b**   rs1, rs2, imm    if (rs1 x rs2) pc += imm `define opcode_jal         7'b11011_11 \/\/J \/\/jal   rd,imm   jump and link, rd = PC+4; PC += imm `define opcode_jalr        7'b11001_11 \/\/I \/\/jalr  rd,rs1,imm   jump and link reg, rd = PC+4; PC = rs1 + imm  module RiscVCore ( input clock, input reset, input irq,  output [31:0] instruction_address, input  [31:0] instruction_data,  output [31:0] data_address, output [1:0]  data_width, input  [31:0] data_in, output [31:0] data_out, output        data_read, output        data_write );  \/\/\u044d\u0442\u0430\u043f 0 ======================================  \/\/\u043d\u0430 \u043d\u0443\u043b\u0435\u0432\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0432\u044b\u0434\u0430\u0451\u043c \u0430\u0434\u0440\u0435\u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043d\u0430 \u0448\u0438\u043d\u0443 \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u043c \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u0430\u043f wire [31:0] stage0_pc; assign instruction_address = stage0_pc;  \/\/\u044d\u0442\u0430\u043f 1 ======================================  \/\/\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0443\u0436\u0435 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c wire stage1_jam_up; \/\/\u0441\u0442\u0430\u0434\u0438\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0434\u0438\u0435\u0439 reg stage1_empty; \/\/\u0441\u0442\u0430\u0434\u0438\u044f \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u044d\u0442\u0430\u043f\u0430 wire stage1_pause = stage1_empty || stage1_jam_up; \/\/\u0441\u0442\u0430\u0434\u0438\u0438 \u043f\u043e\u043a\u0430 \u043d\u0435\u043b\u044c\u0437\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \/\/\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u044d\u0442\u0430\u043f\u0430 wire [31:0] pc; \/\/pc &lt;= stage0_pc  always@(posedge clock or posedge reset) begin if (reset == 1) begin stage1_empty &lt;= 1; end else begin stage1_empty &lt;= 0; end end  \/\/\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0437 \u0448\u0438\u043d\u044b \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e wire [31:0] instruction = instruction_data;  \/\/\u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u0434 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 wire[6:0] op_code = instruction[6:0]; \/\/\u043a\u043e\u0434 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 wire[4:0] op_rd = instruction[11:7]; \/\/\u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 wire[2:0] op_funct3 = instruction[14:12]; \/\/\u043f\u043e\u0434\u043a\u043e\u0434 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 wire[4:0] op_rs1 = instruction[19:15]; \/\/\u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u043e\u043f\u0435\u0440\u0430\u043d\u0434 1 wire[4:0] op_rs2 = instruction[24:20]; \/\/\u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u043e\u043f\u0435\u0440\u0430\u043d\u0434 2 wire[6:0] op_funct7 = instruction[31:25]; wire[31:0] op_immediate_i = {{20{instruction[31]}}, instruction[31:20]}; \/\/\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 I-\u0442\u0438\u043f\u0430 wire[31:0] op_immediate_s = {{20{instruction[31]}}, instruction[31:25], instruction[11:7]}; \/\/\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 S-\u0442\u0438\u043f\u0430 wire[31:0] op_immediate_u = {instruction[31:12], 12'b0}; wire[31:0] op_immediate_b = {{20{instruction[31]}}, instruction[7],                               instruction[30:25], instruction[11:8], 1'b0}; wire[31:0] op_immediate_j = {{12{instruction[31]}}, instruction[19:12],                               instruction[20], instruction[30:21], 1'b0};  \/\/\u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0432\u0448\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e wire is_op_load = op_code == `opcode_load; wire is_op_store = op_code == `opcode_store; wire is_op_alu = op_code == `opcode_alu; wire is_op_alu_imm = op_code == `opcode_alu_imm; wire is_op_load_upper = op_code == `opcode_load_upper; wire is_op_add_upper = op_code == `opcode_add_upper; wire is_op_branch = op_code == `opcode_branch; wire is_op_jal = op_code == `opcode_jal; wire is_op_jalr = op_code == `opcode_jalr; wire is_op_multiply = is_op_alu &amp;&amp; op_funct7[0];  wire error_opcode = !(is_op_load || is_op_store ||                     is_op_alu || is_op_alu_imm ||                     is_op_load_upper || is_op_add_upper ||                     is_op_branch || is_op_jal || is_op_jalr);  \/\/\u043a\u0430\u043a\u043e\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 wire type_r = is_op_alu; wire type_i = is_op_alu_imm || is_op_load || is_op_jalr; wire type_s = is_op_store; wire type_b = is_op_branch; wire type_u = is_op_load_upper || is_op_add_upper; wire type_j = is_op_jal;  \/\/\u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b wire [31:0] immediate = type_i ? op_immediate_i : type_s ? op_immediate_s : type_b ? op_immediate_b : type_j ? op_immediate_j : type_u ? op_immediate_u : 0;  \/\/\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b-\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b wire [31:0] reg_s1; wire [31:0] reg_s2; wire signed [31:0] reg_s1_signed = reg_s1; wire signed [31:0] reg_s2_signed = reg_s2;   \/\/\u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 (lb, lh, lw, lbu, lhu), I-\u0442\u0438\u043f assign data_read = is_op_load &amp;&amp; !stage1_pause;  \/\/\u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0430\u043c\u044f\u0442\u0438 (sb, sh, sw), S-\u0442\u0438\u043f assign data_write = is_op_store &amp;&amp; !stage1_pause; assign data_out = reg_s2;  \/\/\u043e\u0431\u0449\u0435\u0435 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 assign data_address = (is_op_load || is_op_store) ? reg_s1 + immediate : 32'hz; assign data_width = op_funct3[1:0]; \/\/0-byte, 1-half, 2-word  \/\/\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \/\/(add, sub, xor, or, and, sll, srl, sra, slt, sltu) wire [31:0] rd_alu; RiscVAlu alu( .clock(clock), .reset(reset), .is_op_alu(is_op_alu), .is_op_alu_imm(is_op_alu_imm), .op_funct3(op_funct3), .op_funct7(op_funct7), .reg_s1(reg_s1), .reg_s2(reg_s2), .imm(immediate), .rd_alu(rd_alu) );  `ifdef __MULTIPLY__ \/\/(mul, mulh, mulsu, mulu, div, divu, rem, remu) wire [31:0] rd_mul; wire is_mul_wait; RiscVMul mul( .clock(clock), .reset(reset), .enabled(!stage1_pause &amp;&amp; is_op_multiply), .op_funct3(op_funct3), .reg_s1(reg_s1), .reg_s2(reg_s2), .rd_mul(rd_mul), .is_mul_wait(is_mul_wait) ); `endif  \/\/\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 upper immediate wire [31:0] rd_load_upper = immediate; \/\/lui wire [31:0] rd_add_upper = pc + immediate; \/\/auipc  \/\/\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0439 wire [31:0] pc_branch = pc + immediate; wire branch_fired = op_funct3 == 0 &amp;&amp; reg_s1 == reg_s2 || \/\/beq                     op_funct3 == 1 &amp;&amp; reg_s1 != reg_s2 || \/\/bne                     op_funct3 == 4 &amp;&amp; reg_s1_signed &lt;  reg_s2_signed || \/\/blt                     op_funct3 == 5 &amp;&amp; reg_s1_signed &gt;= reg_s2_signed || \/\/bge                     op_funct3 == 6 &amp;&amp; reg_s1 &lt;  reg_s2 || \/\/bltu                     op_funct3 == 7 &amp;&amp; reg_s1 &gt;= reg_s2; \/\/bgeu  \/\/\u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u0438 \u0434\u043b\u0438\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b (jal, jalr) wire [31:0] rd_jal = pc + 4; wire [31:0] pc_jal = pc + immediate; wire [31:0] pc_jalr = reg_s1 + immediate;  \/\/\u0442\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u043b\u043e\u0433\u0438\u043a\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 wire [31:0] stage1_rd = \/*is_op_load ? rd_load :*\/ `ifdef __MULTIPLY__ is_op_multiply ? rd_mul : `endif is_op_alu || is_op_alu_imm ? rd_alu : is_op_load_upper ? rd_load_upper : is_op_add_upper ? rd_add_upper : is_op_jal || is_op_jalr ? rd_jal : 0;  \/\/\u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0442\u0430\u043a\u0442\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0435\u0449\u0451 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u0430 wire stage1_working = 0 `ifdef __MULTIPLY__ || is_mul_wait `endif ; \/\/\u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043e \u043b\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 wire stage1_wait = stage1_pause || stage1_working;  assign stage0_pc = stage1_wait ? pc : (is_op_branch &amp;&amp; branch_fired) ? pc_branch : is_op_jal ? pc_jal : is_op_jalr ? pc_jalr : pc + 4;  \/\/\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043c\u0435\u043d\u044f\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 wire write_rd_instruction = is_op_load || is_op_alu || is_op_alu_imm  || is_op_load_upper || is_op_add_upper || is_op_jal || is_op_jalr;  \/\/\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043c\u0435\u043d\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 wire is_rd_changed = (!(stage1_working || op_rd == 0)) &amp;&amp; write_rd_instruction;  \/\/\u044d\u0442\u0430\u043f 2 ====================================== \/\/\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \/\/\u043c\u0435\u0441\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u043b\u043e \u043b\u0438\u0448\u043d\u0438\u0445 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a reg [2:0] stage2_funct3; reg stage2_is_op_load; reg stage2_is_op_store; reg [31:0] stage2_addr; reg [31:0] stage2_rd; reg[4:0] stage2_op_rd; reg stage2_is_rd_changed; reg stage2_empty; \/\/\u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0441\u0442\u0430\u0434\u0438\u044f \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0430  always@(posedge clock or posedge reset) begin if (reset == 1) begin stage2_funct3 &lt;= 0; stage2_is_op_load &lt;= 0; stage2_is_op_store &lt;= 0; stage2_addr &lt;= 0; stage2_rd &lt;= 0; stage2_op_rd &lt;= 0; stage2_is_rd_changed &lt;= 0; stage2_empty &lt;= 0; end else begin stage2_funct3 &lt;= op_funct3; stage2_is_op_load &lt;= is_op_load; stage2_is_op_store &lt;= is_op_store; stage2_addr &lt;= data_address; stage2_rd &lt;= stage1_rd; stage2_op_rd &lt;= op_rd; stage2_is_rd_changed &lt;= is_rd_changed; stage2_empty &lt;= stage1_wait; end end  wire load_signed = ~stage2_funct3[2]; wire [31:0] rd_load = stage2_funct3[1:0] == 0 ? {{24{load_signed &amp; data_in[7]}}, data_in[7:0]} : \/\/0-byte                       stage2_funct3[1:0] == 1 ? {{16{load_signed &amp; data_in[15]}}, data_in[15:0]} : \/\/1-half                       data_in; \/\/2-word  wire [31:0] stage2_rd_result = stage2_is_op_load ? rd_load : stage2_rd;  \/\/\u0435\u0441\u043b\u0438 \u043f\u0438\u0448\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440, \u043f\u0440\u043e\u0441\u0438\u043c \u043f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0441\u0442\u0430\u0434\u0438\u0438 wire stage2_rs1_equal = (stage2_op_rd == op_rs1) &amp;&amp; (type_r || type_i || type_s || type_b); wire stage2_rs2_equal = (stage2_op_rd == op_rs2) &amp;&amp; (type_r || type_s || type_b); wire stage2_rd_fired = stage2_is_rd_changed &amp;&amp; (stage2_rs1_equal || stage2_rs2_equal); \/\/\u0435\u0441\u043b\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u0441\u0440\u0430\u0437\u0443 \u0447\u0438\u0442\u0430\u0435\u043c, \u0442\u043e\u0436\u0435 \u0436\u0434\u0451\u043c wire stage2_memory_fired = (stage2_is_op_store &amp;&amp; (is_op_load || is_op_store) &amp;&amp; stage2_addr[31:2] == data_address[31:2]); \/\/\u0435\u0441\u043b\u0438 \u043d\u0430 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0442\u0430\u043a\u0442\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043b\u0438, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u0434\u0430\u043b\u044c\u0448\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0443\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u0430 assign stage1_jam_up = !stage2_empty &amp;&amp; (\/*stage2_rd_fired ||*\/ stage2_memory_fired);  wire [31:0] reg_s1_file; wire [31:0] reg_s2_file;  assign reg_s1 = (stage2_is_rd_changed &amp;&amp; stage2_rs1_equal) ? stage2_rd_result : reg_s1_file; assign reg_s2 = (stage2_is_rd_changed &amp;&amp; stage2_rs2_equal) ? stage2_rd_result : reg_s2_file;  \/\/\u043d\u0430\u0431\u043e\u0440 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 RiscVRegs regs( .clock(clock), .reset(reset),  .enable_write_pc(!stage1_wait), .pc_val(pc), \/\/\u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0430\u0434\u0440\u0435\u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 .pc_next(stage0_pc), \/\/\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0430\u0434\u0440\u0435\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438  .rs1_index(op_rs1), \/\/\u0447\u0438\u0442\u0430\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b-\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b .rs2_index(op_rs2), .rs1(reg_s1_file), .rs2(reg_s2_file),  .enable_write_rd(stage2_is_rd_changed &amp;&amp; !stage2_empty), \/\/\u043f\u0438\u0448\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 .rd_index(stage2_op_rd), .rd(stage2_rd_result) );  endmodule <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u044b<\/p>\n<details class=\"spoiler\">\n<summary>registers.v<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"vhdl\">\/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 `include \"common.vh\"  module RiscVRegs ( input clock, input reset,  input enable_write_pc, input [31:0] pc_next, output [31:0] pc_val,  input [4:0] rs1_index, input [4:0] rs2_index, output [31:0] rs1, output [31:0] rs2,  input enable_write_rd, input [4:0] rd_index, input [31:0] rd );  reg [31:0] regs [1:`REG_COUNT-1]; \/\/x0-x31 reg [31:0] pc;  assign pc_val = pc; assign rs1 = rs1_index == 0 ? 0 : regs[rs1_index]; assign rs2 = rs2_index == 0 ? 0 : regs[rs2_index];  `ifdef SIMULATION integer i; initial begin for (i = 1; i &lt; `REG_COUNT; i = i + 1) begin regs[i] = 0; end end `endif  always@(posedge clock or posedge reset) begin if (reset == 1) begin pc = 0; end else begin if (enable_write_pc) begin pc &lt;= pc_next; end end end  always@(posedge clock) begin \/\/regs[enable_write_rd ? 0 : rd_index] &lt;= rd; \/\/\u0442\u0430\u043a \u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0430\u0441\u0438\u0432\u043e, \u043d\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u0435\u0441\u0442\u0430 if (enable_write_rd) begin regs[rd_index] &lt;= rd; end end  endmodule <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0410\u041b\u0423<\/p>\n<details class=\"spoiler\">\n<summary>alu.v<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"vhdl\">module RiscVAlu ( input clock, input reset,  input is_op_alu, \/\/\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441 \u0434\u0432\u0443\u043c\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u043c\u0438 input is_op_alu_imm, \/\/\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u043c \u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439 input [2:0] op_funct3, \/\/\u043a\u043e\u0434 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 input [6:0] op_funct7, \/\/\u043a\u043e\u0434 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 input [31:0] reg_s1, \/\/\u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440-\u043e\u043f\u0435\u0440\u0430\u043d\u0434 input [31:0] reg_s2, \/\/\u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440-\u043e\u043f\u0435\u0440\u0430\u043d\u0434 input [31:0] imm, \/\/\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430-\u043e\u043f\u0435\u0440\u0430\u043d\u0434 output [31:0] rd_alu \/\/\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b );  \/\/\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 (add, sub, xor, or, and, sll, srl, sra, slt, sltu) \/\/\u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043b\u0451\u0433\u043a\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u0440\u0430\u0437\u0443 wire [31:0] alu_operand2 = is_op_alu_imm ? imm : reg_s2; assign rd_alu =       op_funct3 == 3'd0 ? (is_op_alu &amp;&amp; op_funct7[5] ? reg_s1 - alu_operand2 : reg_s1 + alu_operand2) :   op_funct3 == 3'd4 ? reg_s1 ^ alu_operand2 :   op_funct3 == 3'd6 ? reg_s1 | alu_operand2 :   op_funct3 == 3'd7 ? reg_s1 &amp; alu_operand2 :   op_funct3 == 3'd1 ? reg_s1 &lt;&lt; alu_operand2[4:0] :   op_funct3 == 3'd5 ? (op_funct7[5] ? $signed(reg_s1) &gt;&gt;&gt; alu_operand2[4:0] : reg_s1 &gt;&gt; alu_operand2[4:0]) :   op_funct3 == 3'd2 ? $signed(reg_s1) &lt; $signed(alu_operand2) :   op_funct3 == 3'd3 ? reg_s1 &lt; alu_operand2 : \/\/TODO \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 imm \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c   0; \/\/\u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442  endmodule <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041c\u043e\u0434\u0443\u043b\u044c \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f<\/p>\n<details class=\"spoiler\">\n<summary>alu_mul.v<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"vhdl\">`include \"common.vh\"  module RiscVMul ( input clock, input reset, input enabled,  input [2:0] op_funct3, \/\/\u043a\u043e\u0434 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 input [31:0] reg_s1, \/\/\u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440-\u043e\u043f\u0435\u0440\u0430\u043d\u0434 input [31:0] reg_s2, \/\/\u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440-\u043e\u043f\u0435\u0440\u0430\u043d\u0434 output [31:0] rd_mul, \/\/\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b output is_mul_wait \/\/\u043d\u0430\u0434\u043e \u043b\u0438 \u0436\u0434\u0430\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0434\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0442\u0430\u043a\u0442\u0430 );  \/\/ \u0420\u0410\u0421\u0428\u0418\u0420\u0415\u041d\u0418\u0415 M \/\/\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 (mul, mulh, mulhsu, mulu, div, divu, rem, remu) \/\/\u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e wire is_op_muldiv = enabled; wire is_op_multiply = !op_funct3[2]; wire is_op_mul_signed = !op_funct3[1]; \/\/mul, mulh \/\/wire is_op_mul_low = op_funct3[1:0] == 0; \/\/mul wire is_op_mul_extend_sign = op_funct3[1:0] == 2; \/\/mulhsu \/\/\u0443\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u043a\u0430\u043a \u0431\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u044b\u0435, \u043d\u043e \u0441\u0430\u043c \u0437\u043d\u0430\u043a \u043d\u0430\u0434\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0434\u043e 64 \u0431\u0438\u0442 wire is_op_div_signed = !op_funct3[0]; \/\/div, rem \/\/wire is_op_remainder = op_funct3[2]; \/\/rem, remu  \/\/\u0434\u043b\u044f \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e \u0437\u043d\u0430\u043a\u043e\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c \u0437\u043d\u0430\u043a \u0443 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0441\u043e\u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044f \/\/\u043d\u043e \u0434\u043b\u044f \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0434\u043e \u0443\u0431\u0440\u0430\u0442\u044c \u0443 \u043e\u0431\u043e\u0438\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0435\u043b\u0430\u0435\u043c \u0435\u0434\u0438\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e wire need_restore_sign = is_op_multiply ? is_op_mul_signed : is_op_div_signed; wire start_muldiv_sign = need_restore_sign ? reg_s1[31] ^ reg_s2[31] : 1'b0; \/\/ = sign(x) * sign(y) wire rem_sign_start = need_restore_sign ? reg_s1[31] : 1'b0; \/\/ = sign(x) wire [31:0] start_x = (need_restore_sign &amp;&amp; $signed(reg_s1) &lt; 0) ? -reg_s1 : reg_s1; wire [31:0] start_y = (need_restore_sign &amp;&amp; $signed(reg_s2) &lt; 0) ? -reg_s2 : reg_s2;  `ifdef __FAST_MULDIV__  assign is_mul_wait = 0; wire [31:0] quotient; wire [31:0] remainder; wire [31:0] mul_1; wire [31:0] mul_2;  RiscVFastDiv fd( .x(start_x), .y(start_y), .quotient(quotient), .remainder(remainder) );  assign {mul_2, mul_1} = start_x * start_y;  \/\/ \u0435\u0441\u043b\u0438 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0431\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u044b\u043c: -a * b = ((1&lt;&lt;32)-a) * b = -a * b + (b &lt;&lt; 32) \/\/ \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f mulhsu \u043d\u0430\u0434\u043e \u043f\u043e\u0441\u043b\u0435 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435 \u0431\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u043e\u0433\u043e \u0438\u0437 \u0441\u0442\u0430\u0440\u0448\u0438\u0445 \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432 wire [31:0] mulhsu = mul_2 - (reg_s1[31] ? reg_s2 : 0); wire [63:0] mul_result = start_muldiv_sign ? -{mul_2, mul_1} : {mul_2, mul_1}; wire [31:0] quotient_signed = start_muldiv_sign ? -quotient : quotient; wire [31:0] remainder_signed = rem_sign_start ? -remainder : remainder; assign rd_mul =     op_funct3 == 3'd0 ? mul_result[31:0]  : \/\/mul op_funct3 == 3'd1 ? mul_result[63:32] : \/\/mulh op_funct3 == 3'd2 ? mulhsu            : \/\/mulhsu op_funct3 == 3'd3 ? mul_result[63:32] : \/\/mulu op_funct3 == 3'd4 ? quotient_signed :   \/\/div op_funct3 == 3'd5 ? quotient_signed :   \/\/divu op_funct3 == 3'd6 ? remainder_signed :  \/\/rem \/*op_funct3 == 7 ?*\/ remainder_signed;  \/\/remu  `else  \/\/\u043f\u0440\u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043c\u043e\u0433\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u0438\u0445 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \/\/\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u043d\u0430\u0440\u0443\u0436\u0438, \u0435\u0451 \u043d\u0430\u0434\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \/\/\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u043e\u0431\u043e\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 reg [31:0] x, y, r1, r2, r3; \/\/\u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0435 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043d\u0430 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f reg in_progress; \/\/\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0434\u043b\u044f \u0431\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u044b\u0445, \u0437\u043d\u0430\u043a \u043c\u0435\u043d\u044f\u0435\u043c \u0432 \u043a\u043e\u043d\u0446\u0435 reg muldiv_sign; \/\/\u0434\u043b\u044f \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u043a \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437 \u0434\u0435\u043b\u0438\u043c\u043e\u0433\u043e reg rem_sign;  \/\/\u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u044c \u0433\u0434\u0435-\u0442\u043e \u043d\u043e\u043b\u044c, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443 wire need_wait = is_op_muldiv &amp;&amp; reg_s1 &amp;&amp; reg_s2;  \/\/\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \/\/\u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 {r3, r2} = {r1 = sign, x} * y \/\/\u0434\u0435\u043b\u0435\u043d\u0438\u0435 {r3=q, r2=rem} = x \/ y , r1=msb - \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0446\u0438\u043a\u043b\u0430, \u043e\u043d \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u0439 \u0431\u0438\u0442 wire [31:0] start_msb = start_x[31:24] != 8'b0 ? (1 &lt;&lt; 31) : \/\/\u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u0430\u044f \u043f\u043e\u0434\u0433\u043e\u043d\u043a\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430 \u0446\u0438\u043a\u043b\u0430 start_x[23:16] != 8'b0 ? (1 &lt;&lt; 23) : start_x[15:8] != 8'b0 ? (1 &lt;&lt; 15) : (1 &lt;&lt; 7); wire [31:0] start_r1 = !is_op_multiply ? start_msb : is_op_mul_extend_sign ? (reg_s1[31] ? -1 : 0) : 0;  \/\/\u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0432 \u0446\u0438\u043a\u043b\u0435 \/\/\u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 wire [31:0] next_mul_y = (y &gt;&gt; 1); \/\/\u043f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0435 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 wire [63:0] current_mul_x = {r1, x}; \/\/\u0431\u0435\u0440\u0451\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 x wire [63:0] next_mul_x = current_mul_x &lt;&lt; 1; \/\/\u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c wire [63:0] next_mul_val = {r3, r2} + (y[0] ? current_mul_x : 0); \/\/\u0438 \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443 wire mul_end = next_mul_y == 0; \/\/\u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f  \/\/\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432 \u0441\u0442\u043e\u043b\u0431\u0438\u043a \/\/y (\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c) \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u043c \/\/x (\u0434\u0435\u043b\u0438\u043c\u043e\u0435) \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u043c wire [31:0] current_msb = r1; wire [31:0] current_rem = r2; wire [31:0] current_div_val = r3; wire [31:0] next_msb = (current_msb &gt;&gt; 1); \/\/ \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 \u0434\u0435\u043b\u0438\u043c\u043e\u0433\u043e wire [31:0] next_rem_tmp = {current_rem[30:0], current_msb &amp; x ? 1'b1 : 1'b0}; \/\/ \u043f\u0440\u0438\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043a \u043e\u0441\u0442\u0430\u0442\u043a\u0443 \/\/\u0435\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043b\u0438 \u0440\u0430\u0432\u0435\u043d (\u0442\u043e \u0435\u0441\u0442\u044c \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c), \u0442\u043e \u0432\u044b\u0447\u0438\u0442\u0430\u0435\u043c \/\/\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0446\u0438\u0444\u0440\u0443 \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0442\u044c \u043d\u0435 \u043d\u0430\u0434\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u0432\u043e\u0438\u0447\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 wire [31:0] div_remainder_delta = next_rem_tmp - y; wire [31:0] next_rem_val = $signed(div_remainder_delta) &gt;= 0 ? div_remainder_delta : next_rem_tmp; wire [31:0] next_div_val = {current_div_val[30:0], ~div_remainder_delta[31]}; \/\/\u043f\u0440\u0438\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0440\u0430\u0437\u0440\u044f\u0434 \u043a \u0447\u0430\u0441\u0442\u043d\u043e\u043c\u0443 wire div_end = next_msb == 0;  \/\/\u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \/\/\u0432 \u0442\u0435\u043e\u0440\u0438\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u0438\u0442\u044c, \u0441\u0434\u0432\u0438\u0433 \u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u043a\u0430\u0436\u0443\u0442\u0441\u044f \u043f\u043e\u0445\u043e\u0436\u0438\u043c\u0438 wire [31:0] next_x = is_op_multiply ? next_mul_x[31:0] : x; wire [31:0] next_y = is_op_multiply ? next_mul_y : y; wire [31:0] next_r1 = is_op_multiply ? next_mul_x[63:32] : next_msb; wire [31:0] next_r2 = is_op_multiply ? next_mul_val[31:0] : next_rem_val; wire [31:0] next_r3 = is_op_multiply ? next_mul_val[63:32] : next_div_val; wire divmul_end = is_op_multiply ? mul_end : div_end; \/\/\u0431\u043b\u043e\u043a \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c wire next_in_progress = in_progress &amp;&amp; !divmul_end; \/\/\u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u043a\u043e\u043d\u0438\u043b, \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0431\u043b\u043e\u043a\u0430  wire [63:0] mul_result = muldiv_sign ? -next_mul_val : next_mul_val; wire [31:0] div_result = muldiv_sign ? -next_div_val : next_div_val; wire [31:0] rem_result = rem_sign ? -next_rem_val : next_rem_val; assign rd_mul = !in_progress ? 0 : \/\/\u043d\u0430 \u043d\u0443\u043b\u0435\u0432\u043e\u043c \u0442\u0430\u043a\u0442\u0435 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u043b\u044c !divmul_end ? 0 : \/\/\u043f\u043e\u043a\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u0434\u0451\u0442, \u043d\u0435 \u043a\u0430\u0447\u0430\u0435\u043c \u0437\u0430\u0442\u0432\u043e\u0440\u044b op_funct3 == 3'd0 ? mul_result[31:0] : \/\/mul op_funct3 == 3'd1 ? mul_result[63:32] : \/\/mulh op_funct3 == 3'd2 ? mul_result[63:32] : \/\/mulsu op_funct3 == 3'd3 ? mul_result[63:32] : \/\/mulu op_funct3 == 3'd4 ? div_result : \/\/div op_funct3 == 3'd5 ? div_result : \/\/divu op_funct3 == 3'd6 ? rem_result : \/\/rem \/*op_funct3 == 7 ?*\/ rem_result;  \/\/remu  \/\/\u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 assign is_mul_wait = !in_progress ? need_wait : !divmul_end;  wire divmul_active = need_wait || in_progress; always@(posedge clock or posedge reset) begin if (reset == 1) begin x &lt;= 0; y &lt;= 0; r1 &lt;= 0; r2 &lt;= 0; r3 &lt;= 0; in_progress &lt;= 0; end else if (divmul_active) begin if (!in_progress) begin \/\/ \u043d\u0430 \u043d\u0443\u043b\u0435\u0432\u043e\u043c \u0442\u0430\u043a\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f in_progress &lt;= 1'b1; x &lt;= start_x; y &lt;= start_y; r1 &lt;= start_r1; \/\/\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u043e\u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044f \u0437\u043d\u0430\u043a\u043e\u043c \u0434\u043e 64 \u0431\u0438\u0442 \u0438\u043b\u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0446\u0438\u043a\u043b\u0430 r2 &lt;= 0; \/\/\u043c\u043b\u0430\u0434\u0448\u0438\u0435 \u0431\u0438\u0442\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a r3 &lt;= 0; \/\/\u0441\u0442\u0430\u0440\u0448\u0438\u0435 \u0431\u0438\u0442\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0447\u0430\u0441\u0442\u043d\u043e\u0435 muldiv_sign &lt;= start_muldiv_sign; \/\/\u043d\u0430\u0434\u043e \u043b\u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u043a rem_sign &lt;= rem_sign_start; end else begin in_progress = next_in_progress; x &lt;= next_x; y &lt;= next_y; r1 &lt;= next_r1; r2 &lt;= next_r2; r3 &lt;= next_r3; end end end  `endif \/\/FAST_MULDIV  endmodule <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438<\/p>\n<details class=\"spoiler\">\n<summary>common.vh<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"vhdl\">\/\/\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f  \/\/embedded, 16 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 `define __RV32E__  \/\/\u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0435 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b `define __MULTIPLY__ \/\/\u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0437\u0430 \u043e\u0434\u0438\u043d \u0442\u0430\u043a\u0442 \/\/`define __FAST_MULDIV__  `ifdef    __ICARUS__ `define  SIMULATION `endif  `ifdef __RV32E__     `define REG_COUNT 16 \/\/\u0434\u043b\u044f embedded \u0447\u0438\u0441\u043b\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043c\u0435\u043d\u044c\u0448\u0435 `else     `define REG_COUNT 32 `endif <\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><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\/articles\/925402\/\"> https:\/\/habr.com\/ru\/articles\/925402\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"\"><\/figure>\n<p> \u0412 <a href=\"https:\/\/habr.com\/ru\/articles\/922858\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0447\u0430\u0441\u0442\u0438<\/a> \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 M (\u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0435), \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u043e\u0434 \u041f\u041b\u0418\u0421 Cyclone IV. \u041f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 Quartus \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u0441 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u0435\u0451 \u043d\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e, \u0438 \u044d\u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u044b\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u044f\u043c. <\/p>\n<h2>\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c<\/h2>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u0448\u0438\u0431\u043a\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u0432 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u044f\u0434\u0440\u0430 (core_tb.v), \u0442\u0430\u043c \u0433\u0434\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430 \u043f\u0430\u043c\u044f\u0442\u044c. \u041f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0431\u043b\u043e\u043a, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043f\u043e \u0442\u0430\u043a\u0442\u043e\u0432\u043e\u043c\u0443 \u0441\u0438\u0433\u043d\u0430\u043b\u0443, \u043a\u0430\u043a \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u0438\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440, \u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435.<\/p>\n<pre><code class=\"vhdl\">reg [31:0] i_data; \/\/ \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f reg [31:0] old_data; \/\/ \u0434\u0430\u043d\u043d\u044b\u0435 always@(posedge clock) begin i_data &lt;= rom[i_addr[31:2]]; old_data &lt;= rom[d_addr[31:2]]; end <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0442\u0430\u043a\u0442\u0435 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f <em>\u044d\u0442\u043e\u0439 \u0436\u0435<\/em> \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438. \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u0440\u0430\u0437\u043e\u0431\u044c\u0451\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u044d\u0442\u0430\u043f\u044b, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0442\u0430\u043a\u0442\u0435, \u0438 \u043f\u043e\u043a\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u0430\u043f \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0430\u0440\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e, \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0443\u0436\u0435 \u0441 \u043d\u043e\u0432\u043e\u0439. \u0422\u0430\u043a\u0430\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u043e\u043c, \u0438 \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u043e\u043d \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432 intel \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 <a href=\"https:\/\/habr.com\/ru\/articles\/182002\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a>. \u041f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0430\u0434\u0438\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u0445, \u043d\u0430\u0434\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0432 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b. \u0417\u0432\u0443\u0447\u0438\u0442 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043d\u043e \u043d\u0435\u0434\u0435\u043b\u044e \u043d\u0430 \u043e\u0442\u043b\u0430\u0434\u043a\u0443 \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0442\u0430\u043a\u0438 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c. \u0412 \u043e\u0431\u0449\u0435\u043c \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u043f\u0440\u043e\u0432\u043e\u043b\u043e\u0447\u043a\u0438 \u043d\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b, \u043f\u0438\u0448\u0435\u043c \u0442\u0443\u0434\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0434\u0430\u043b\u043e \u044f\u0434\u0440\u043e, \u0438 \u043c\u0435\u043d\u044f\u0435\u043c \u0438\u0445 \u0432 \u043c\u0435\u0441\u0442\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<pre><code class=\"vhdl\">reg [31:0] old_data_out; reg [31:0] old_addr; reg [1:0] old_width; reg old_data_w; reg old_data_r; always@(posedge clock) begin old_data_out &lt;= d_data_out; old_addr &lt;= d_addr; old_width &lt;= d_width; old_data_w &lt;= data_w; old_data_r &lt;= data_r; end  wire [1:0] addr_tail = old_addr[1:0]; ... <\/code><\/pre>\n<p>\u0415\u0449\u0451 \u043e\u0434\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0440\u0443\u0433\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440, \u0441\u0432\u044f\u0437\u0430\u043d\u0430 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u043d\u0435 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0430\u043a\u0442\u043e\u0432\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u043d\u0430\u0434\u043e \u0437\u0430\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b. \u041e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043b\u0438\u0448\u043d\u0435\u0435 \u0432 `ifdef SIMULATION.<\/p>\n<pre><code class=\"vhdl\">`ifdef SIMULATION reg clock = 0; reg reset = 1; `else input wire clock; input wire reset; `endif ... <\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432 \u0438\u0442\u043e\u0433\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u044f\u0434\u0440\u0430 core_tb.v (\u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0446\u0435\u043b\u0438\u043a\u043e\u043c).<\/p>\n<h2>\u042f\u0434\u0440\u043e<\/h2>\n<p>\u0421\u043d\u0430\u0440\u0443\u0436\u0438 \u0432\u0441\u0451 \u0441\u043b\u043e\u043c\u0430\u043b\u0438, \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u0434\u0451\u043c \u043f\u0440\u0438\u0441\u043f\u043e\u0441\u0430\u0431\u043b\u0438\u0432\u0430\u0442\u044c \u044f\u0434\u0440\u043e \u043a \u043d\u043e\u0432\u044b\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c. \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u043a\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d \u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<\/p>\n<pre><code class=\"vhdl\">module RiscVCore ( input clock, input reset,  output [31:0] instruction_address, input  [31:0] instruction_data,  output [31:0] data_address, output [1:0]  data_width, input  [31:0] data_in, output [31:0] data_out, output        data_read, output        data_write ); <\/code><\/pre>\n<h3>\u042d\u0442\u0430\u043f 0, \u0437\u0430\u043f\u0440\u043e\u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 (Fetch)<\/h3>\n<p>\u041a\u0430\u043a \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043f\u0443\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445? \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430 \u0448\u0438\u043d\u0443 \u0430\u0434\u0440\u0435\u0441\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"vhdl\">wire [31:0] stage0_pc; assign instruction_address = stage0_pc; <\/code><\/pre>\n<p>\u041f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c\u0441\u044f, \u043e\u0442\u043a\u0443\u0434\u0430 \u043e\u043d\u043e \u0432\u0437\u044f\u043b\u043e\u0441\u044c, \u043f\u043e\u0442\u043e\u043c \u043a\u0430\u043a \u0440\u0443\u043a\u0438 \u0434\u043e\u0439\u0434\u0443\u0442, \u0442\u043e\u0433\u0434\u0430 \u0438 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c. \u041d\u0430 \u044d\u0442\u043e\u043c \u043d\u0443\u043b\u0435\u0432\u0430\u044f \u0441\u0442\u0430\u0434\u0438\u044f \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0430\u0441\u044c. \u0412\u043e\u043e\u0431\u0449\u0435 \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c\u0441\u044f \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0441\u0442\u043e\u0438\u0442 \u0434\u0430\u0442\u044c \u0438\u043c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b \u043f\u043e \u043d\u043e\u043c\u0435\u0440\u0443 \u044d\u0442\u0430\u043f\u0430 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043e\u043d\u0438 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f. \u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u044d\u0442\u0430\u043f\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438, \u043d\u043e \u043f\u043e\u043a\u0430 \u044f\u0434\u0440\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0435 (280 \u0441\u0442\u0440\u043e\u043a), \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0432\u043e\u0437\u0438\u0442\u044c\u0441\u044f.<\/p>\n<h3>\u042d\u0442\u0430\u043f 1, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u0430\u043d\u043d\u044b\u0445 (Decode, Execute)<\/h3>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0443\u0436\u0435 \u043f\u0440\u0438\u0435\u0445\u0430\u043b\u043e \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u043c \u0435\u0433\u043e \u0438 \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u044c.<\/p>\n<pre><code class=\"vhdl\">wire [31:0] instruction = instruction_data; <\/code><\/pre>\n<p>\u041f\u0440\u0438\u0448\u043b\u0430 \u043f\u043e\u0440\u0430 \u0437\u0430\u0434\u0443\u043c\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0448 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440, \u0430 \u0447\u0442\u043e\u0431\u044b \u0434\u0443\u043c\u0430\u043b\u043e\u0441\u044c \u043b\u0443\u0447\u0448\u0435, \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043e\u0434\u043d\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0438\u0437 \u0442\u0435\u0441\u0442\u0430.<\/p>\n<pre><code class=\"cpp\">sw  a5,0(sp)    \/\/ *(sp + 0) = a5 lw  a4,0(sp)    \/\/ a4 = *(sp + 0) <\/code><\/pre>\n<p>\u041f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043d\u0430 \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u0435\u0434\u0432\u0435\u0449\u0430\u043b\u043e.<\/p>\n<pre><code class=\"cpp\">core_init_matrix(results[0].size,   results[i].memblock[2],   (ee_s32)results[i].seed1   | (((ee_s32)results[i].seed2) &lt;&lt; 16),  \/\/ &lt;- \u043e\u0442\u0441\u044e\u0434\u0430 \u043a\u0430\u043a-\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c   &amp;(results[i].mat)); <\/code><\/pre>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u044f &#171;\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f&#187; \u0438 &#171;\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f&#187; \u043f\u0430\u043c\u044f\u0442\u044c \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430 \u0437\u0432\u0443\u0447\u0430\u0442 \u043f\u0430\u0440\u0430\u0434\u043e\u043a\u0441\u0430\u043b\u044c\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e\u0434 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u0437\u043e\u0432\u0430, \u043d\u043e \u0437\u0434\u0435\u0441\u044c \u0432\u0441\u0451 \u0438\u043d\u0430\u0447\u0435. \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0438 \u0432\u044b\u0434\u0430\u043b\u0430 \u0430\u0434\u0440\u0435\u0441 \u043d\u0430 \u0448\u0438\u043d\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0442\u0430\u043a\u0442\u0435. \u0421 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0435\u0449\u0451 \u0445\u0443\u0436\u0435, \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u044f\u0434\u0440\u0430 \u0432\u0441\u0451 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0440\u0430\u0437\u0443, \u043d\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c RMW (read-modify-write). \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0435 \u0432\u0441\u0451 32-\u0431\u0438\u0442\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u044c (\u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 <strong>data_width<\/strong>), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u0432\u044f\u0437\u043a\u0435 \u043d\u0430\u0434\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u0442, \u0438 \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0412 \u0438\u0442\u043e\u0433\u0435 \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 \u0432\u0438\u0434\u0430 &#171;\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c&#187;, &#171;\u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c&#187; \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u043e\u0448\u0438\u0431\u043a\u0435, \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u044b \u0431\u0443\u0434\u0443\u0442 \u0441\u0442\u0430\u0440\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u0427\u0438\u043d\u0438\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c 8-\u0431\u0438\u0442\u043d\u043e\u0439*4, \u0442\u043e\u0433\u0434\u0430 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0437\u0430 1 \u0442\u0430\u043a\u0442. \u041c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441\u0430 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0448\u0438\u043d\u044b \u0438 \u0435\u0441\u043b\u0438 \u0441\u043e\u0432\u043f\u0430\u043b\u0438, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043d\u043e \u0442\u0443\u0442 \u0432\u043e\u043f\u0440\u043e\u0441, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441 volatile \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438, \u0431\u0443\u0434\u0435\u0442 \u043b\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0431\u0430\u0439\u0442 \u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e (\u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u0442, \u0437\u0430\u043c\u0435\u043d\u0438\u0442 \u0431\u0430\u0439\u0442, \u0437\u0430\u043f\u0438\u0448\u0435\u0442). \u0412 \u043e\u0431\u0449\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c, \u043a\u0430\u043a \u043e\u0431\u043e\u0439\u0442\u0438 \u044d\u0442\u0443 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u043d\u043e \u044d\u0442\u043e \u0432\u0441\u0451 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435.<\/p>\n<h4>\u0413\u0434\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440<\/h4>\n<p>\u0410 \u043c\u044b \u043f\u043e\u043a\u0430 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435: \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0442\u0430\u043a\u0442\u0435. \u0417\u043d\u0430\u0447\u0438\u0442 \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u0430\u043f \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440, \u0438 \u0442\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441, \u0441\u0442\u043e\u0438\u0442 \u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u0442\u0438\u043f\u0430\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0442\u043e\u0436\u0435 \u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430 \u0438\u043b\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443? \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0443\u0434\u043b\u0438\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 \u0432\u0440\u0435\u0434\u043d\u043e, \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u0442\u0430\u0434\u0438\u0439, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430, \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0447\u0430\u0441\u0442\u043e\u0442\u0443. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0437\u0430\u043f\u0438\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u0425\u043e\u0442\u044f \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0441 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u044b, \u043d\u043e \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u043c\u0435\u043d\u044b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439.<\/p>\n<h4>\u0424\u043b\u0430\u0433\u0438 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430<\/h4>\n<p>\u0412\u044b\u0448\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u043b\u0438 \u043f\u0440\u043e \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432, \u0441\u0435\u0439\u0447\u0430\u0441 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f, \u043a\u0430\u043a \u0435\u0433\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c, \u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u0449\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e. \u041f\u043e \u043a\u0430\u043a\u0438\u043c \u043f\u043e\u0432\u043e\u0434\u0430\u043c \u0433\u0438\u043f\u043e\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d? \u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439, \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u0442\u0430\u043f \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u043e\u0442\u0430\u043a\u0442\u043e\u0432\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0430\u043c \u0441\u0435\u0431\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442. \u0422\u0443\u0442 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e, \u0435\u0441\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u0435\u0449\u0451 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u0430, \u0437\u043d\u0430\u0447\u0438\u0442, \u043d\u0430\u0434\u043e \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u044d\u0442\u0430\u043f (\u043f\u0443\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u0443\u0444\u0444\u0438\u043a\u0441 <strong>wait<\/strong>) \u0438 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u044d\u0442\u0430\u043f\u0443, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043f\u043e\u043a\u0430 \u043d\u0435\u0442 (<strong>empty<\/strong>). \u0412\u0442\u043e\u0440\u043e\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0435\u0449\u0451 \u043d\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u044d\u0442\u0430\u043f\u0430 (<strong>jam_up<\/strong>). \u041f\u043e\u0434\u043e\u0431\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442, \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0435\u0449\u0451 \u043d\u0435 \u0443\u0441\u043f\u0435\u043b\u0430 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440, \u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0443\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<br \/> \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0444\u043b\u0430\u0436\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430.<\/p>\n<pre><code class=\"vhdl\">wire stage1_jam_up; \/\/\u0441\u0442\u0430\u0434\u0438\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0434\u0438\u0435\u0439 reg stage1_empty; \/\/\u0441\u0442\u0430\u0434\u0438\u044f \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u044d\u0442\u0430\u043f\u0430 wire stage1_pause = stage1_empty || stage1_jam_up; \/\/\u0441\u0442\u0430\u0434\u0438\u0438 \u043f\u043e\u043a\u0430 \u043d\u0435\u043b\u044c\u0437\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \/\/\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u044d\u0442\u0430\u043f\u0430 wire [31:0] pc; \/\/pc &lt;= stage0_pc  always@(posedge clock or posedge reset) begin if (reset == 1) begin stage1_empty &lt;= 1; end else begin stage1_empty &lt;= 0; end end <\/code><\/pre>\n<p><strong>stage1_jam_up<\/strong> \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u044d\u0442\u0430\u043f\u043e\u043c.<br \/> \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043d\u0435 \u0441\u0440\u0430\u0437\u0443, \u0443 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0434\u0438\u0438 \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u0430 \u043a \u0440\u0430\u0431\u043e\u0442\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u044d\u0442\u0430\u043f \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043b \u0435\u0439 \u0434\u0430\u043d\u043d\u044b\u0435. \u0417\u0430 \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0444\u043b\u0430\u0433 <strong>stage1_empty<\/strong>. \u0421\u0435\u0439\u0447\u0430\u0441 \u043e\u043d \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430 \u0441\u0431\u0440\u043e\u0441 \u0440\u0430\u0431\u043e\u0442\u044b, \u043d\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u044d\u0448\u0430 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u0445\u043e\u0434\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438. \u041a\u0441\u0442\u0430\u0442\u0438 \u0433\u043e\u0432\u043e\u0440\u044f, \u0435\u0441\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043c\u043d\u043e\u0433\u043e\u0442\u0430\u043a\u0442\u043e\u0432\u0430\u044f, \u0442\u043e \u043d\u0430\u043c \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0430\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \u044d\u0442\u0430\u043f 0 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f.<\/p>\n<pre><code class=\"vhdl\">wire stage1_wait = stage1_pause || stage1_working; assign stage0_pc = stage1_wait ? pc : (is_op_branch &amp;&amp; branch_fired) ? pc_branch : is_op_jal ? pc_jal : is_op_jalr ? pc_jalr : pc + 4; <\/code><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u0434\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043d\u0430 \u0447\u0442\u043e \u0436\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0434\u0438\u0438. \u041d\u0430 \u043e\u0434\u043d\u043e\u0442\u0430\u043a\u0442\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0410\u041b\u0423 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f, \u043b\u0438\u0448\u044c \u0431\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u043a\u0438\u043d\u0443\u043b\u0438 (\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u043a\u0430 \u043d\u0435\u0442). \u0412\u043e\u0442 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u043b\u0443\u0447\u0448\u0435 \u043b\u0438\u0448\u043d\u0438\u0439 \u0440\u0430\u0437 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0435\u0433\u043e \u043b\u0438\u0448\u043d\u0435\u0433\u043e.<\/p>\n<pre><code class=\"vhdl\">assign data_read = is_op_load &amp;&amp; !stage1_pause; assign data_write = is_op_store &amp;&amp; !stage1_pause; <\/code><\/pre>\n<p>\u0423\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0433\u043e\u0442\u0430\u043a\u0442\u043e\u0432\u043e\u0435, \u0435\u043c\u0443 \u0442\u043e\u0436\u0435 \u043d\u0435 \u0434\u0430\u0451\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0431\u0435\u0437 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<pre><code class=\"vhdl\">wire [31:0] rd_mul; wire is_mul_wait; RiscVMul mul( .clock(clock), .reset(reset), .enabled(!stage1_pause &amp;&amp; is_op_multiply), .op_funct3(op_funct3), .reg_s1(reg_s1), .reg_s2(reg_s2), .rd_mul(rd_mul), .is_mul_wait(is_mul_wait) ); <\/code><\/pre>\n<p>\u0421 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. \u0411\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u043e\u0442\u0430\u043a\u0442\u043e\u0432\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439.<\/p>\n<pre><code class=\"vhdl\">wire stage1_working = is_mul_wait; <\/code><\/pre>\n<p>\u0417\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u0444\u0430\u043a\u0442 \u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0434\u0438\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435 \u0432\u0441\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043f\u0438\u0448\u0443\u0442 \u0432 <strong>rd<\/strong>.<\/p>\n<pre><code class=\"vhdl\">wire write_rd_instruction = is_op_load || is_op_alu || is_op_alu_imm  || is_op_load_upper || is_op_add_upper || is_op_jal || is_op_jalr; wire is_rd_changed = (!(stage1_working || op_rd == 0)) &amp;&amp; write_rd_instruction; \u0418 \u0432\u044b\u0434\u0430\u0451\u043c \u0441\u0430\u043c\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0434\u0438\u0438. wire [31:0] stage1_rd = \/*is_op_load ? rd_load :*\/ is_op_multiply ? rd_mul : is_op_alu || is_op_alu_imm ? rd_alu : is_op_load_upper ? rd_load_upper : is_op_add_upper ? rd_add_upper : is_op_jal || is_op_jalr ? rd_jal : 0; <\/code><\/pre>\n<h3>\u042d\u0442\u0430\u043f 2, \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u0445 (Write)<\/h3>\n<p>\u041d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u0434\u0435\u043b\u0430\u043b\u0438, \u0437\u0434\u0435\u0441\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0438 \u0432\u044b\u0434\u0430\u0442\u044c \u0444\u043b\u0430\u0433\u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u043c \u0442\u043e, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043b \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u044d\u0442\u0430\u043f, \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b.<\/p>\n<pre><code class=\"vhdl\">reg [2:0] stage2_funct3; reg stage2_is_op_load; reg stage2_is_op_store; reg [31:0] stage2_addr; reg [31:0] stage2_rd; reg[4:0] stage2_op_rd; reg stage2_is_rd_changed; reg stage2_empty; \/\/\u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0441\u0442\u0430\u0434\u0438\u044f \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0430  always@(posedge clock or posedge reset) begin if (reset == 1) begin stage2_funct3 &lt;= 0; stage2_is_op_load &lt;= 0; stage2_is_op_store &lt;= 0; stage2_addr &lt;= 0; stage2_rd &lt;= 0; stage2_op_rd &lt;= 0; stage2_is_rd_changed &lt;= 0; stage2_empty &lt;= 0; end else begin<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-466183","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/466183","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=466183"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/466183\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=466183"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=466183"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=466183"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}