{"id":287611,"date":"2018-08-16T14:13:10","date_gmt":"2018-08-16T10:13:10","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=287611"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=287611","title":{"rendered":"Chisel \u2014 (\u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c) \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438"},"content":{"rendered":"\n<div data-io-article-url=\"https:\/\/habr.com\/post\/419413\/\" class=\"post__text post__text-html js-mediator-article\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ka\/wc\/b5\/kawcb52amqtfs9chlivqku8sj-a.jpeg\"><\/p>\n<p>  <\/p>\n<p>\u0421 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c \u043c\u0438\u043a\u0440\u043e\u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u0438\u043a\u0438, rtl \u0434\u0438\u0437\u0430\u0439\u043d\u044b \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438\u0441\u044c \u0432\u0441\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435. \u0420\u0435\u044e\u0437\u0430\u0431\u0438\u043b\u0438\u0442\u0438 \u043a\u043e\u0434\u0430 \u043d\u0430 verilog \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0430\u0441\u0441\u0443 \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432, \u0434\u0430\u0436\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c generate, \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0438 \u0444\u0438\u0448\u0435\u043a system verilog. Chisel \u0436\u0435, \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u044e \u043c\u043e\u0449\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 rtl, \u0447\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u043b\u0433\u043e\u0436\u0434\u0430\u043d\u043d\u044b\u043c \u0448\u0430\u0433\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u0432\u0435\u0436\u0438\u043c \u0432\u043e\u0437\u0434\u0443\u0445\u043e\u043c \u043b\u0435\u0433\u043a\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 ASIC \u0438 FPGA.<\/p>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u043d \u043a\u0440\u0430\u0442\u043a\u0438\u0439 \u043e\u0431\u0437\u043e\u0440 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044e\u0437\u043a\u0435\u0439\u0441\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430. \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c, \u0435\u0441\u043b\u0438 \u0442\u0435\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u0441\u0442\u0430\u0442\u044c\u044e \u0432 \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0430\u0445. <\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h3 id=\"sistemnye-trebovaniya\">\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f<\/h3>\n<p>  <\/p>\n<ul>\n<li>scala \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c<\/li>\n<li>verilog \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0446\u0438\u0444\u0440\u043e\u0432\u044b\u0445 \u0434\u0438\u0437\u0430\u0439\u043d\u043e\u0432.<\/li>\n<li>\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e chisel \u043f\u043e\u0434 \u0440\u0443\u043a\u043e\u0439<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u042f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u044b chisel \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445, \u043d\u043e \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 <a href=\"https:\/\/github.com\/freechipsproject\/chisel3\/wiki\">\u043f\u043e\u0434\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u044e\u0434\u0430<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f scala \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u044d\u0442\u043e\u0442 <a href=\"https:\/\/docs.scala-lang.org\/cheatsheets\/\">\u0447\u0438\u0442-\u043b\u0438\u0441\u0442<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 <a href=\"https:\/\/chisel.eecs.berkeley.edu\/doc\/chisel-cheatsheet3.pdf\">\u0435\u0441\u0442\u044c \u0438 \u0434\u043b\u044f chisel<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 (\u0432 \u0432\u0438\u0434\u0435 scala sbt \u043f\u0440\u043e\u0435\u043a\u0442\u0430) \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 <a href=\"https:\/\/github.com\/SpaceCowboyMax\/counter\">\u043d\u0430\u0439\u0442\u0438 \u0442\u0443\u0442<\/a>.<\/p>\n<p>  <\/p>\n<h3 id=\"prostoy-schetchik\">\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0447\u0435\u0442\u0447\u0438\u043a<\/h3>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f &#8216;Constructing Hardware In a scala Embedded Language&#8217; chisel \u2014 \u044d\u0442\u043e \u044f\u0437\u044b\u043a \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u0443\u0440\u044b \u043d\u0430\u0434\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u0434 scala. <\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u043e \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0442\u043e: \u0438\u0437 rtl \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043d\u0430 chisel \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f hardware \u0433\u0440\u0430\u0444, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 firrtl, \u0430 \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0431\u044d\u043a\u044d\u043d\u0434 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0433\u0435\u043d\u0435\u0440\u0438\u0442 \u0438\u0437 firrtl verilog.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0434\u0432\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430.<\/p>\n<p>  <\/p>\n<p>verilog :<\/p>\n<p>  <\/p>\n<pre><code>module SimpleCounter #(   parameter WIDTH = 8 )(   input clk,   input reset,   input wire enable,   output wire [WIDTH-1:0] out );   reg [WIDTH-1:0] counter;    assign out = counter;    always @(posedge clk)     if (reset) begin       counter &lt;= {(WIDTH){1'b0}};     end else if (enable) begin       counter &lt;= counter + 1;     end endmodule<\/code><\/pre>\n<p>  <\/p>\n<p>chisel :<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">class SimpleCounter(width: Int = 32) extends Module {   val io = IO(new Bundle {     val enable = Input(Bool())     val out = Output(UInt(width.W))   })    val counter = RegInit(0.U(width.W))    io.out &lt;&gt; counter    when(io.enable) {     counter := counter + 1.U   } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e chisel:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>Module<\/code> \u2014 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0434\u043b\u044f rtl \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u044f<\/li>\n<li><code>Bundle<\/code> \u2014 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 chisel, \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432.<\/li>\n<li><code>io<\/code> \u2014 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0440\u0442\u043e\u0432<\/li>\n<li><code>Bool<\/code> \u2014 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043e\u0434\u043d\u043e\u0431\u0438\u0442\u043e\u0432\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b<\/li>\n<li><code>UInt(width: Width)<\/code> \u2014 \u0431\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u0446\u0435\u043b\u043e\u0435, \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b\u0430.<\/li>\n<li><code>RegInit[T &lt;: Data](init: T)<\/code> \u2014 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430, \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0441\u0431\u0440\u043e\u0441\u0443 \u0438 \u0438\u043c\u0435\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445.<\/li>\n<li><code>&lt;&gt;<\/code> \u2014 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432<\/li>\n<li><code>when(cond: =&gt; Bool) { \/*...*\/ }<\/code> \u2014 \u0430\u043d\u0430\u043b\u043e\u0433 <code>if<\/code> \u0432 verilog<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041e \u0442\u043e\u043c \u043a\u0430\u043a\u043e\u0439 verilog \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 chisel \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0437\u0436\u0435. \u0421\u0435\u0439\u0447\u0430\u0441 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u043c \u044d\u0442\u0438 \u0434\u0432\u0430 \u0434\u0438\u0437\u0430\u0439\u043d\u0430. \u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0432 chisel \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u0430\u043a\u043e\u0435-\u043b\u0438\u0431\u043e \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 <code>clk<\/code> \u0438 <code>reset<\/code>. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e chisel \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u0442\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u043a \u043c\u043e\u0434\u0443\u043b\u044e. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0441\u0431\u0440\u043e\u0441\u0443 \u0434\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 <code>counter<\/code> \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0441\u043e \u0441\u0431\u0440\u043e\u0441\u043e\u043c <code>RegInit<\/code>. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0442\u0430\u043a\u0442\u043e\u0432\u044b\u0445 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0432 chisel \u0435\u0441\u0442\u044c, \u043d\u043e \u043e \u043d\u0435\u0439 \u0442\u043e\u0436\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>  <\/p>\n<h3 id=\"schetchik-chut-poslozhnee\">\u0421\u0447\u0435\u0442\u0447\u0438\u043a \u0447\u0443\u0442\u044c \u043f\u043e\u0441\u043b\u043e\u0436\u043d\u0435\u0435<\/h3>\n<p>  <\/p>\n<p>\u041f\u043e\u0439\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u043c \u0437\u0430\u0434\u0430\u0447\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u2014 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043c\u043d\u043e\u0433\u043e\u043a\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0441 \u0432\u0445\u043e\u0434\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u0432 \u0432\u0438\u0434\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 \u043d\u0430 chisel <\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">class MultiChannelCounter(width: Seq[Int] = Seq(32, 16, 8, 4)) extends Module {   val io = IO(new Bundle {     val enable = Input(Vec(width.length, Bool()))     val out = Output(UInt(width.sum.W))      def getOut(i: Int): UInt = {       val right = width.dropRight(width.length - i).sum       this.out(right + width(i) - 1, right)     }   })    val counters: Seq[SimpleCounter] = width.map(x =&gt;     Module(new SimpleCounter(x))   )    io.out &lt;&gt; util.Cat(counters.map(_.io.out))    width.indices.foreach { i =&gt;     counters(i).io.enable &lt;&gt; io.enable(i)   } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e scala:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>width: Seq[Int]<\/code> \u2014 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0434\u043b\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 <code>MultiChannelCounter<\/code>, \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f <code>Seq[Int]<\/code> \u2014 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438.<\/li>\n<li><code>Seq<\/code> \u2014 \u043e\u0434\u0438\u043d \u0438\u0437 \u0442\u0438\u043f\u043e\u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439 \u0432 scala c \u0447\u0435\u0442\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.<\/li>\n<li><code>.map<\/code> \u2014 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0437\u043d\u0430\u043a\u043e\u043c\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430\u0434 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u043c\u0438, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u0432 \u0434\u0440\u0443\u0433\u0443\u044e \u0437\u0430 \u0441\u0447\u0435\u0442 \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0446\u0435\u043b\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c <code>SimpleCounter<\/code>&#8216;\u043e\u0432 \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u044c\u044e.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e chisel:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>Vec[T &lt;: Data](gen: T, n: Int): Vec[T]<\/code> \u2014 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 chisel, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430. <\/li>\n<li><code>Module[T &lt;: BaseModule](bc: =&gt; T): T<\/code> \u2014 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043e\u0431\u0435\u0440\u0442\u043a\u0438 \u0434\u043b\u044f \u0438\u043d\u0441\u0442\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439.<\/li>\n<li><code>util.Cat[T &lt;: Bits](r: Seq[T]): UInt<\/code> \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438, \u0430\u043d\u0430\u043b\u043e\u0433 <code>{1'b1, 2'b01, 4'h0}<\/code> \u0432 verilog<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043f\u043e\u0440\u0442\u044b:<br \/>  <code>enable<\/code> \u2014 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0441\u044f \u0443\u0436\u0435 \u0432 <code>Vec[Bool]<\/code>*, \u0433\u0440\u0443\u0431\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u0434\u043d\u043e\u0431\u0438\u0442\u043d\u044b\u0445 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430, \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438 <code>UInt(width.length.W)<\/code>.<br \/>  <code>out<\/code> \u2014 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u043b\u0441\u044f \u0434\u043e \u0441\u0443\u043c\u043c\u044b \u0448\u0438\u0440\u0438\u043d \u0432\u0441\u0435\u0445 \u043d\u0430\u0448\u0438\u0445 \u043a\u0430\u043d\u0430\u043b\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>counters<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u043d\u0430\u0448\u0438\u0445 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c <code>enable<\/code> \u0441\u0438\u0433\u043d\u0430\u043b \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u043a \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u043e\u0440\u0442\u0443, \u0430 \u0432\u0441\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u044b <code>out<\/code> \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0432 \u043e\u0434\u0438\u043d \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 <code>util.Cat<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434.<\/p>\n<p>  <\/p>\n<p>\u041e\u0442\u043c\u0435\u0442\u0438\u043c \u0435\u0449\u0435 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>getOut(i: Int)<\/code> \u2014 \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0431\u0438\u0442\u043e\u0432 \u0432 \u0441\u0438\u0433\u043d\u0430\u043b\u0435 <code>out<\/code> \u0434\u043b\u044f <code>i<\/code>&#8216;\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430. \u0411\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u043f\u0440\u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0442\u0430\u043a\u0438\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u043c. \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0447\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u0432 verilog \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442<\/p>\n<p>  <\/p>\n<p>*<code>Vec<\/code> \u043d\u0435 \u043f\u0443\u0442\u0430\u0442\u044c \u0441 <code>Vector<\/code>, \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 chisel, \u0432\u0442\u043e\u0440\u043e\u0439 \u0436\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u0432 scala.<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u043d\u0430 verilog, \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0434\u0430\u0436\u0435 \u043d\u0430 systemVerilog. <\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u0438\u0434\u0435\u0432 \u043f\u043e\u0434\u0443\u043c\u0430\u0432 \u044f \u043f\u0440\u0438\u0448\u0435\u043b \u043a \u0442\u0430\u043a\u043e\u043c\u0443 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0443(\u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u043e\u043d \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u0435\u0440\u043d\u044b\u043c \u0438 \u0441\u0430\u043c\u044b\u043c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c, \u043d\u043e \u0432\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u0441\u0432\u043e\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445).<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">verilog<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>module MultiChannelCounter #(   parameter TOTAL = 4,   parameter integer WIDTH_SEQ [TOTAL] = {32, 16, 8, 4} )(clk, reset, enable, out);   localparam OUT_WIDTH = get_sum(TOTAL, WIDTH_SEQ);    input  clk;   input  reset;    input wire [TOTAL - 1  : 0] enable;    output wire [OUT_WIDTH - 1 :0] out;    genvar j;   generate     for(j = 0; j &lt; TOTAL; j = j + 1) begin : counter_generation       localparam OUT_INDEX = get_sum(j, WIDTH_SEQ);        SimpleCounter #( WIDTH_SEQ[j] ) SimpleCounter_unit (         .clk(clk),         .reset(reset),         .enable(enable[j]),         .out(out[OUT_INDEX + WIDTH_SEQ[j] - 1: OUT_INDEX])       );     end    endgenerate    function automatic integer get_sum;     input integer array_width;     input integer array [TOTAL];     integer counter = 0;     integer i;   begin     for(i = 0; i &lt; array_width; i = i + 1)       counter = counter + array[i];     get_sum = counter;     end   endfunction endmodule<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0443\u0436\u0435 \u043a\u0443\u0434\u0430 \u0432\u043d\u0443\u0448\u0438\u0442\u0435\u043b\u044c\u043d\u0435\u0435. \u041d\u043e \u0447\u0442\u043e \u0435\u0441\u043b\u0438, \u043c\u044b \u043f\u043e\u0439\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u043c \u043a \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 wishbone \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432\u044b\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c. <\/p>\n<p>  <\/p>\n<h3 id=\"bundle-interfeysy\">Bundle \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b<\/h3>\n<p>  <\/p>\n<p>Wishbone \u2014 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0448\u0438\u043d\u0430 \u043f\u043e \u0442\u0438\u043f\u0443 AMBA APB, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0434\u043b\u044f ip \u044f\u0434\u0435\u0440 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c.<\/p>\n<p>  <\/p>\n<p>\u0427\u0443\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043d\u0430 \u0432\u0438\u043a\u0438: <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Wishbone\">https:\/\/ru.wikipedia.org\/wiki\/Wishbone<\/a><\/p>\n<p>  <\/p>\n<p>\u0422.\u043a. chisel \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0430 <code>Bundle<\/code> \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u0448\u0438\u043d\u0443 \u0432 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043b\u044e\u0431\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043d\u0430 chisel.<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">class wishboneMasterSignals(     addrWidth: Int = 32,     dataWidth: Int = 32,     gotTag: Boolean = false)   extends Bundle {    val adr = Output(UInt(addrWidth.W))   val dat_master = Output(UInt(dataWidth.W))   val dat_slave = Input(UInt(dataWidth.W))    val stb = Output(Bool())   val we = Output(Bool())   val cyc = Output(Bool())    val sel = Output(UInt((dataWidth \/ 8).W))   val ack_master = Output(Bool())   val ack_slave = Input(Bool())    val tag_master: Option[UInt] = if(gotTag) Some(Output(Bool())) else None   val tag_slave: Option[UInt] = if(gotTag) Some(Input(Bool())) else None    def wbTransaction: Bool = cyc &amp;&amp; stb   def wbWrite: Bool = wbTransaction &amp;&amp; we   def wbRead: Bool = wbTransaction &amp;&amp; !we    override def cloneType: wishboneMasterSignals.this.type =     new wishboneMasterSignals(addrWidth, dataWidth, gotTag).asInstanceOf[this.type] }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e scala:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>Option<\/code> \u2014 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0435\u0440\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 scala \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u0438\u0431\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043b\u0438\u0431\u043e <code>None<\/code>, <code>Option[UInt]<\/code> \u2014 \u044d\u0442\u043e \u043b\u0438\u0431\u043e <code>Some(UInt(\/*...*\/))<\/code> \u043b\u0438\u0431\u043e <code>None<\/code>, \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043f\u0440\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412\u0440\u043e\u0434\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e. \u041f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043c\u0430\u0441\u0442\u0435\u0440\u0430, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432: <\/p>\n<p>  <\/p>\n<p><code>tag_master<\/code> \u0438 <code>tag_slave<\/code> \u2014 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 wishbone, \u0443 \u043d\u0430\u0441 \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0435\u0441\u043b\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>gotTag<\/code>, \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u0435\u043d <code>true<\/code>.<\/p>\n<p>  <\/p>\n<p><code>wbTransaction<\/code>, <code>wbWrite<\/code>, <code>wbRead<\/code> \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0448\u0438\u043d\u043e\u0439.<\/p>\n<p>  <\/p>\n<p><code>cloneType<\/code> \u2014 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u0430 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b\u0445 <code>[T &lt;: Bundle]<\/code> \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/p>\n<p>  <\/p>\n<p>\u041d\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0435\u0449\u0435 \u0438 slave \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">class wishboneSlave(     addrWidth: Int = 32,     dataWidth: Int = 32,     tagWidht: Int = 0)   extends Bundle {    val wb = Flipped(new wishboneMasterSignals(addrWidth , dataWidth, tagWidht))    override def cloneType: wishboneSlave.this.type =     new wishboneSlave(addrWidth, dataWidth, tagWidht).asInstanceOf[this.type] }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>Flipped<\/code>, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448 \u043c\u0430\u0441\u0442\u0435\u0440 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0441\u044f \u0432 \u0441\u043b\u0435\u0439\u0432, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043a\u043b\u0430\u0441\u0441 \u043d\u043e \u0434\u043b\u044f \u043c\u0430\u0441\u0442\u0435\u0440\u0430.<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">class wishboneMaster(     addrWidth: Int = 32,     dataWidth: Int = 32,     tagWidht: Int = 0)   extends Bundle {    val wb = new wishboneMasterSignals(addrWidth , dataWidth, tagWidht)    override def cloneType: wishboneMaster.this.type =     new wishboneMaster(addrWidth, dataWidth, tagWidht).asInstanceOf[this.type] }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0443 \u0432\u043e\u0442 \u0438 \u0432\u0441\u0435, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0433\u043e\u0442\u043e\u0432. \u041d\u043e \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c\u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440 \u0438\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c wishbone \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432.<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">class WishboneCrossbarIo(n: Int, addrWidth: Int, dataWidth: Int) extends Bundle {   val slaves = Vec(n, new wishboneSlave(addrWidth, dataWidth, 0))   val master = new wishboneMaster(addrWidth, dataWidth, 0) }  class WBCrossBar extends Module {   val io = IO(new WishboneCrossbarIo(1, 32, 32))   io.master &lt;&gt; io.slaves(0)    \/\/ ... }<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043f\u043e\u0434 \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440. \u0423\u0434\u043e\u0431\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0442\u0438\u043f\u0430 <code>Vec[wishboneSlave]<\/code>, \u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u043c\u043e\u0436\u043d\u043e \u0442\u0435\u043c \u0436\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c <code>&lt;&gt;<\/code>. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0444\u0438\u0448\u043a\u0438 chisel \u043a\u043e\u0433\u0434\u0430 \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u043e\u0431 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432.<\/p>\n<p>  <\/p>\n<h3 id=\"universalnyy-kontroller-shiny\">\u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0448\u0438\u043d\u044b<\/h3>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c \u0440\u0430\u043d\u0435\u0435 \u043f\u0440\u043e \u043c\u043e\u0449\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c. \u0414\u0430\u043b\u044c\u0448\u0435 \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0448\u0438\u043d\u044b wishbone \u0432 \u0432\u0438\u0434\u0435 <code>trait<\/code>, \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043a\u0438\u0439 mixin \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u0441 \u0448\u0438\u043d\u043e\u0439 <code>wishboneSlave<\/code>, \u0434\u043b\u044f \u043c\u043e\u0434\u0443\u043b\u044f \u043b\u0438\u0448\u044c \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u0443 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0437\u0430\u043c\u0435\u0448\u0430\u0442\u044c <code>trait<\/code> \u2014 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043a \u043d\u0435\u043c\u0443 \u043f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<h4 id=\"realizaciya\">\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h4>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 \u043f\u043e\u043b\u043e\u043d \u044d\u043d\u0442\u0443\u0437\u0438\u0430\u0437\u043c\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0438 \u0441\u0440\u0430\u0437\u0443 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b\u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0438\u0437 \u043f\u0443\u043b\u0430 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u043b\u044c.<\/p>\n<p>  <\/p>\n<p>\u0420\u0430\u0437\u0435\u0431\u0435\u0440\u0435\u043c \u043f\u043e \u0447\u0430\u0441\u0442\u044f\u043c:<\/p>\n<p>  <\/p>\n<ul>\n<li>\n<p>\u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c acknowlege-\u043e\u043c<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">val io : wishboneSlave = \/* ... *\/  val wb_ack = RegInit(false.B)  when(io.wb.wbTransaction) { wb_ack := true.B }.otherwise { wb_ack := false.B }  wb_ack &lt;&gt; io.wb.ack_slave<\/code><\/pre>\n<p>  <\/li>\n<li>\u041d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u043c\u0438<br \/> \n<pre><code class=\"scala\">val wb_dat = RegInit(0.U(io.wb.dat_slave.getWidth.W)) \/\/ getWidth \u0432\u043e\u0437\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u044c when(io.wb.wbRead) { wb_dat := MuxCase(default = 0.U, Seq(   (io.wb.addr === ADDR_1) -&gt; data_1,   (io.wb.addr === ADDR_3) -&gt; data_2,   (io.wb.addr === ADDR_3) -&gt; data_2 )) } wb_dat &lt;&gt; io.wb.dat_slave<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>MuxCase[T &lt;: Data] (default: T, mapping: Seq[(Bool, T)]): T<\/code> \u2014 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u043a\u043e\u0431\u0438\u043d\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0442\u0438\u043f\u0430 <code>case<\/code> \u0432 verilog*.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u0431\u044b \u0432 verilog:<\/p>\n<p>  <\/p>\n<pre><code>  always @(posedge clock)     if(reset)       wb_dat_o &lt;= 0;     else if(wb_read)       case (wb_adr_i)          `ADDR_1  : wb_dat_o &lt;= data_1;         `ADDR_2  : wb_dat_o &lt;= data_2;         `ADDR_3  : wb_dat_o &lt;= data_3;         default  : wb_dat_o &lt;= 0;       endcase   }<\/code><\/pre>\n<p>  <\/p>\n<p>*\u0412\u043e\u043e\u0431\u0449\u0435 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0445\u0430\u043a \u0440\u0430\u0434\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u0438, \u0432 chisel \u0435\u0441\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0441\u043b\u0438, \u043f\u0438\u0448\u0438\u0442\u0435 \u0447\u0442\u043e-\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435.<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">switch(x) {   is(value1) {     \/\/ ...   }   is(value2) {     \/\/ ...   } } <\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0443 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">  when(io.wb.wbWrite) {     data_4 := Mux(io.wb.addr === ADDR_4, io.wb.dat_master, data_4)   }<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>Mux[T &lt;: Data](cond: Bool, con: T, alt: T): T<\/code> \u2014 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u043e\u0440<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043d\u0435\u0447\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u043a \u043d\u0430\u0448\u0435\u043c\u0443 \u043c\u0443\u043b\u044c\u0442\u0438\u043a\u0430\u043d\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0443, \u0432\u0435\u0448\u0430\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u043d\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0430\u043d\u0430\u043b\u0430\u043c\u0438 \u0438 \u0434\u0435\u043b\u043e \u0432 \u0448\u043b\u044f\u043f\u0435. \u041d\u043e \u0442\u0443\u0442 \u0443\u0436\u0435 \u0440\u0443\u043a\u043e\u0439 \u043f\u043e\u0434\u0430\u0442\u044c \u0434\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0448\u0438\u043d\u044b WB \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u0443 \u043f\u0430\u043c\u044f\u0442\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0438\u0434\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">  val readMemMap = Map(     ADDR_1 -&gt; DATA_1,     ADDR_2 -&gt; DATA_2     \/*...*\/   )    val writeMemMap = Map(     ADDR_1 -&gt; DATA_1,     ADDR_2 -&gt; DATA_2     \/*...*\/   )<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0433\u0443\u0442 <code>trait<\/code> \u2014 \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 mixin-\u043e\u0432 \u0432 Sala. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 <code>readMemMap: [Int, Data]<\/code> \u043a \u0432\u0438\u0434\u0443 <code>Seq(\u0443\u0441\u043b\u043e\u0432\u0438\u0435 -&gt; \u0434\u0430\u043d\u043d\u044b\u0435)<\/code>, \u0430 \u0435\u0449\u0435 \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0440\u0442\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 <\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">  val readMemMap = Map(     ADDR_1_BASE -&gt; DATA_SEQ,     ADDR_2 -&gt; DATA_2     \/*...*\/   )<\/code><\/pre>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0432 \u043d\u0435\u0447\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435, \u0433\u0434\u0435 WB_DAT_WIDTH \u0448\u0438\u0440\u0438\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0431\u0430\u0439\u0442\u0430\u0445<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">  val readMemMap = Map(     ADDR_1_BASE + 0 * (WB_DAT_WIDHT)-&gt; DATA_SEQ_0,     ADDR_1_BASE + 1 * (WB_DAT_WIDHT)-&gt; DATA_SEQ_1,     ADDR_1_BASE + 2 * (WB_DAT_WIDHT)-&gt; DATA_SEQ_2,     ADDR_1_BASE + 3 * (WB_DAT_WIDHT)-&gt; DATA_SEQ_3     \/*...*\/     ADDR_2 -&gt; DATA_2     \/*...*\/   )<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0433\u043e, \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u043e\u0440 \u0438\u0437 <code>Map[Int, Any]<\/code> \u0432 <code>Seq[(Bool, UInt)]<\/code>. \u041f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c scala pattern mathcing.<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">  def parseMemMap(memMap: Map[Int, Any]): Seq[(Bool, UInt)] = memMap.flatMap { case(addr, data) =&gt;     data match {       case a: UInt =&gt; Seq((io.wb.adr === addr.U) -&gt; a)       case a: Seq[UInt] =&gt; a.map(x =&gt; (io.wb.adr === (addr + io.wb.dat_slave.getWidth \/ 8).U) -&gt; x)       case _ =&gt; throw new Exception(\"WRONG MEM MAP!!!\")     }   }.toSeq<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0448 \u0442\u0440\u0435\u0439\u0442 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a :<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">trait wishboneSlaveDriver {   val io : wishboneSlave    val readMemMap: Map[Int, Any]   val writeMemMap: Map[Int, Any]    val parsedReadMap: Seq[(Bool, UInt)] = parseMemMap(readMemMap)   val parsedWriteMap: Seq[(Bool, UInt)] = parseMemMap(writeMemMap)    val wb_ack = RegInit(false.B)   val wb_dat = RegInit(0.U(io.wb.dat_slave.getWidth.W))    when(io.wb.wbTransaction) {     wb_ack := true.B   }.otherwise {     wb_ack := false.B   }    when(io.wb.wbRead) {     wb_dat := MuxCase(default = 0.U, parsedReadMap)   }    when(io.wb.wbWrite) {     parsedWriteMap.foreach { case(addrMatched, data) =&gt;       data := Mux(addrMatched, io.wb.dat_master, data)     }   }    wb_dat &lt;&gt; io.wb.dat_slave   wb_ack &lt;&gt; io.wb.ack_slave    def parseMemMap(memMap: Map[Int, Any]): Seq[(Bool, UInt)] = { \/*...*\/} }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e scala :<\/p>\n<p>  <\/p>\n<ul>\n<li><code>io , readMemMap, writeMemMap<\/code> \u2014 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e <code>trait<\/code>&#8216;a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0435\u0433\u043e \u0437\u0430\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<p>  <\/p>\n<h4 id=\"kak-im-polzovatsya-polzovatsya\">\u041a\u0430\u043a \u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f<\/h4>\n<p>  <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0437\u0430\u043c\u0435\u0448\u0430\u0442\u044c \u043d\u0430\u0448 <code>trait<\/code> \u043a \u043c\u043e\u0434\u0443\u043b\u044e \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0431\u043b\u044e\u0441\u0442\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0439:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>io<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 <code>wishboneSlave<\/code><\/li>\n<li>\u043d\u0443\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0434\u0432\u0435 \u043a\u0430\u0440\u0442\u044b \u043f\u0430\u043c\u044f\u0442\u0438 <code>readMemMap<\/code> \u0438 <code>writeMemMap<\/code><\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"scala\">class WishboneMultiChannelCounter extends Module {   val BASE = 0x11A00000   val OUT  = 0x00000100   val S_EN = 0x00000200   val H_EN = 0x00000300    val wbAddrWidth = 32   val wbDataWidth = 32   val wbTagWidth = 0   val width = Seq(32, 16, 8, 4)    val io = IO(new wishboneSlave(wbAddrWidth, wbDataWidth, wbTagWidth) {     val hardwareEnable: Vec[Bool] = Input(Vec(width.length, Bool()))   })    val counter = Module(new MultiChannelCounter(width))    val softwareEnable = RegInit(0.U(width.length.W))    width.indices.foreach(i =&gt; counter.io.enable(i) := io.hardwareEnable(i) &amp;&amp; softwareEnable(i))    val readMemMap = Map(     BASE + OUT  -&gt; width.indices.map(counter.io.getOut),     BASE + S_EN -&gt; softwareEnable,     BASE + H_EN -&gt; io.hardwareEnable.asUInt   )    val writeMemMap = Map(     BASE + S_EN -&gt; softwareEnable   ) }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440 <code>softwareEnable<\/code> \u043e\u043d \u043f\u043e &#8216;\u0438&#8217; \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u0432\u0445\u043e\u0434\u043d\u044b\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c <code>hardwareEnable<\/code> \u0438 \u0437\u0430\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 enable <code>counter[MultiChannelCounter]<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u0434\u0432\u0435 \u043a\u0430\u0440\u0442\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c: <code>readMemMap<\/code> <code>writeMemMap<\/code>, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0433\u043b\u0430\u0432\u0443 \u0432\u044b\u0448\u0435.<br \/>  \u0412 \u043a\u0430\u0440\u0442\u0443 \u043f\u0430\u043c\u044f\u0442\u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430*, <code>softwareEnable<\/code> \u0438 <code>hardwareEnable<\/code>. \u0410 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u043e\u0442\u0434\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e <code>softwareEnable<\/code> \u0440\u0435\u0433\u0438\u0441\u0442\u0440.<\/p>\n<p>  <\/p>\n<p>*<code>width.indices.map(counter.io.getOut)<\/code> \u2014 \u0441\u0442\u0440\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f, \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u043e \u0447\u0430\u0441\u0442\u044f\u043c.<\/p>\n<p>  <\/p>\n<ul>\n<li><code>width.indices<\/code> \u2014 \u0432\u0435\u0440\u043d\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0442.\u0435. \u0435\u0441\u043b\u0438 <code>width.length == 4<\/code> \u0442\u043e <code>width.indices = {0, 1, 2, 3}<\/code><\/li>\n<li><code>{0, 1, 2, 3}.map(counter.io.getOut)<\/code> \u2014 \u0434\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<br \/>  <code>{ counter.io.getOut(0), counter.io.getOut(1), \/*...*\/ }<\/code><\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u043d\u0430 chisel \u0441 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u043a\u0430\u0440\u0442\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043d\u0430\u0448 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0448\u0438\u043d\u044b wishbone \u043f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438, \u043a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a :<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">class wishbone_multicahnnel_counter extends WishboneMultiChannelCounter with wishboneSlaveDriver  object countersDriver extends App {   Driver.execute(Array(\"-td\", \".\/src\/generated\"), () =&gt;     new wishbone_multicahnnel_counter   ) }<\/code><\/pre>\n<p>  <\/p>\n<p><code>wishboneSlaveDriver<\/code> \u2014 \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u0435\u0441\u0442\u044c \u0442\u043e\u0442 trait \u043c\u0438\u043a\u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043e\u043f\u0438\u0441\u0430\u043b\u0438 \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u044d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439, \u0430 \u0441\u043a\u043e\u0440\u0435\u0439 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 \u0441\u044b\u0440\u043e\u0439. \u0415\u0433\u043e \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 rtl \u043d\u0430 chisel. \u0421\u043e \u0432\u0441\u0435\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 scala \u0442\u0430\u043a\u0438\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0442\u0430\u043a \u0447\u0442\u043e \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0441\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u0434\u043b\u044f \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u0442\u0432\u0430. \u041f\u0440\u0430\u0432\u0434\u0430 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043e\u0441\u043e\u0431\u043e \u043f\u043e\u043a\u0430 \u043d\u0435\u043e\u0442\u043a\u0443\u0434\u0430, \u043a\u0440\u043e\u043c\u0435 \u043a\u0430\u043a :<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0440\u043e\u0434\u043d\u0430\u044f chisel \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 utils, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0430\u043b\u044c\u0448\u0435, \u0442\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432<\/li>\n<li><a href=\"https:\/\/github.com\/freechipsproject\/rocket-chip\">https:\/\/github.com\/freechipsproject\/rocket-chip<\/a> \u2014 risc-v \u044f\u0434\u0440\u043e \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043d\u0430 chisel, \u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438 \u0447\u0442\u043e \u0432\u044b \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u0437\u043d\u0430\u0435\u0442\u0435 scala, \u0434\u043b\u044f \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432 \u0436\u0435 \u0431\u0435\u0437 \u043f\u043e\u043b \u043b\u0438\u0442\u0440\u0430 \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f \u0431\u0443\u0434\u0435\u0442\u0435 \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u043b\u0433\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0442.\u043a. \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0435\u0442.<\/li>\n<\/ul>\n<p>  <\/p>\n<h3 id=\"multiclockdomain\">MultiClockDomain<\/h3>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u043c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0430\u043a\u0442\u043e\u0432\u044b\u043c\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430\u043c\u0438 \u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430\u043c\u0438 \u0441\u0431\u0440\u043e\u0441\u0430 \u0432 chisel. \u0414\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043d\u0435\u043b\u044c\u0437\u044f, \u043d\u043e c \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0440\u0435\u043b\u0438\u0437\u043e\u0432 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 <code>withClock {}<\/code>, <code>withReset {}<\/code> \u0438 <code>withClockAndReset {}<\/code>. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 :<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">class DoubleClockModule extends Module {   val io = IO(new Bundle {     val clockB = Input(Clock())      val in = Input(Bool())     val out = Output(Bool())     val outB = Output(Bool())   })    val regClock = RegNext(io.in, false.B)    regClock &lt;&gt; io.out    val regClockB = withClock(io.clockB) {     RegNext(io.in, false.B)   }    regClockB &lt;&gt; io.outB }<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>regClock<\/code> \u2014 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c <code>clock<\/code> \u0438 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c <code>reset<\/code><\/li>\n<li><code>regClockB<\/code> \u2014 \u044d\u0442\u043e\u0442 \u0436\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0442\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u043a\u0430\u043a \u0432\u044b \u0434\u043e\u0433\u0430\u0434\u0430\u043b\u0438\u0441\u044c, \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c <code>io.clockB<\/code>, \u043d\u043e \u0441\u0431\u0440\u043e\u0441 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0436\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0443\u0431\u0440\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u044b <code>clock<\/code> \u0438 <code>reset<\/code> \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043a\u0430 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u0444\u0438\u0447\u0443 \u2014 <code>RawModule<\/code>(\u043c\u043e\u0434\u0443\u043b\u044c \u0431\u0435\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0441\u0431\u0440\u043e\u0441\u0430, \u0432\u0441\u0435\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e). \u041f\u0440\u0438\u043c\u0435\u0440 :<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">class MultiClockModule extends RawModule {   val io = IO(new Bundle {     val clockA = Input(Clock())     val clockB = Input(Clock())     val resetA = Input(Bool())     val resetB = Input(Bool())      val in = Input(Bool())     val outA = Output(Bool())     val outB = Output(Bool())   })    val regClockA = withClockAndReset(io.clockA, io.resetA) {     RegNext(io.in, false.B)   }    regClockA &lt;&gt; io.outA    val regClockB = withClockAndReset (io.clockB, io.resetB) {      RegNext(io.in, false.B)   }    regClockB &lt;&gt; io.outB }<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"utils-biblioteka\">Utils \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430<\/h3>\n<p>  <\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0435 \u0431\u043e\u043d\u0443\u0441\u044b chisel \u043d\u0435 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f. \u0415\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0438 \u043f\u043e\u0442\u0440\u0443\u0434\u0438\u043b\u0438\u0441\u044c \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043d\u043e \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u041a\u0430\u043a \u043d\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u043e \u043d\u0430 \u0432\u0438\u043a\u0438 \u043d\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0447\u0438\u0442-\u043b\u0438\u0441\u0442\u0435 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435(\u0442\u0430\u043c \u0434\u0432\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u0430)<\/p>\n<p>  <\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>DecoupledIO<\/code> \u2014 \u043e\u0431\u043a\u043d\u043e\u0432\u0435\u043d\u043d\u044b\u0439 \u0447\u0430\u0441\u0442\u043e\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 ready\/valid \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<br \/>  <code>DecoupledIO(UInt(32.W))<\/code> \u2014 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0441\u0435\u0431\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u044b:<br \/>  <code>val ready = Input(Bool())<\/code><br \/>  <code>val valid = Output(Bool())<\/code><br \/>  <code>val data = Output(UInt(32.W))<\/code><\/li>\n<li><code>ValidIO<\/code> \u2014 \u0442\u043e\u0436\u0435 \u0447\u0442\u043e \u0438 <code>DecoupledIO<\/code> \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0435\u0437 <code>ready<\/code><\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041c\u043e\u0434\u0443\u043b\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>Queue<\/code> \u2014 \u043c\u043e\u0434\u0443\u043b\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e FIFO \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0432\u0435\u0449\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a<br \/>  <code>val enq: DecoupledIO[T]<\/code> \u2014 \u043f\u0435\u0440\u0435\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0439 <code>DecoupledIO<\/code><br \/>  <code>val deq: DecoupledIO[T]<\/code> \u2014 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 <code>DecoupledIO<\/code><br \/>  <code>val count: UInt<\/code> \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438<\/li>\n<li><code>Pipe<\/code> \u2014 \u043c\u043e\u0434\u0443\u043b\u044c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438, \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 n-\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432\u044b\u0445 \u0441\u0440\u0435\u0437\u043e\u0432<\/li>\n<li><code>Arbiter<\/code> \u2014 \u0430\u0440\u0431\u0438\u0442\u0440 \u043d\u0430 <code>DecoupledIO<\/code> \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u0445, \u0438\u043c\u0435\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u0432\u0438\u0434\u043e\u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e \u0432\u0438\u0434\u0443 \u0430\u0440\u0431\u0438\u0442\u0440\u0430\u0436\u0430<br \/>  <code>val in: Vec[DecoupledIO[T]]<\/code> \u2014 \u043c\u0430\u0441\u0441\u0438\u0432 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432<br \/>  <code>val out: DecoupledIO[T]<\/code><br \/>  <code>val chosen: UInt<\/code> \u2014 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0438\u0437 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u043d\u0430 github \u2014 \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u043b\u0430\u043d\u0430\u0445 \u0435\u0441\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043c\u043e\u0434\u0443\u043b\u0438: \u0442\u0438\u043f\u0430 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e FIFO, LSFSR, \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u044b, \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 PLL \u0434\u043b\u044f FPGA; \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b; \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u043f\u043e\u0434 \u043d\u0438\u0445 \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435.<\/p>\n<p>  <\/p>\n<h3 id=\"chisel-io-teseters\">Chisel io-teseters<\/h3>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 chisel, \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c \u0434\u0432\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>peekPokeTesters<\/code> \u2014 \u0447\u0438\u0441\u0442\u043e \u0441\u0438\u043c\u0443\u043b\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442 \u043b\u043e\u0433\u0438\u043a\u0443 \u0432\u0430\u0448\u0435\u0433\u043e \u0434\u0438\u0437\u0430\u0439\u043d\u0430<\/li>\n<li>\n<p><code>hardwareIOTeseters<\/code> \u2014 \u044d\u0442\u043e \u0443\u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0439, \u0442.\u043a. \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 c\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 teset bench \u0441 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u043d\u0430 chisel, \u0438 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0430\u0435 verilator \u0434\u0430\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443.<\/p>\n<p>  <\/p>\n<p>\u041d\u043e \u043f\u043e\u043a\u0430, \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435 \u0432\u044b\u0440\u0430\u0431\u043e\u0442\u0430\u043d, \u0430 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u0435\u0449\u0435 \u0438\u0434\u0435\u0442. \u0412 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u0435\u0439 \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0442\u0435\u0441\u0442\u044b \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 chisel. \u041d\u043e \u043f\u043e\u043a\u0430 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0442\u043e \u0447\u0442\u043e \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0438 \u043a\u0430\u043a \u044d\u0442\u0438\u043c <a href=\"https:\/\/github.com\/freechipsproject\/chisel-testers\/wiki\">\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u0443\u0442<\/a>.<\/p>\n<p>  <\/li>\n<\/ul>\n<p>  <\/p>\n<h3 id=\"nedostatki-chisel\">\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 chisel<\/h3>\n<p>  <\/p>\n<p>\u041d\u0435\u043b\u044c\u0437\u044f \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e chisel \u2014 \u044d\u0442\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u0438 \u0447\u0442\u043e \u0432\u0441\u0435\u043c \u0441\u0442\u043e\u0438\u0442 \u043d\u0430 \u043d\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c. \u041e\u043d \u043a\u0430\u043a \u0438, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0432\u0441\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0442\u043e\u0438\u0442 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044c \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0442\u044b \u043a\u0430\u0440\u0442\u0438\u043d\u044b.<\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0436\u0430\u043b\u0443\u0439 \u0441\u0430\u043c\u044b\u0439 \u0432\u0430\u0436\u043d\u044b\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u2014 \u044d\u0442\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u0431\u0440\u043e\u0441\u043e\u0432. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0435\u0441\u043e\u043c\u044b\u0439, \u043d\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u0443\u0442\u044f\u043c\u0438, \u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445 \u044d\u0442\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043f\u043e\u0432\u0435\u0440\u0445 verilog, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 reset \u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439. \u042d\u0442\u043e \u043b\u0435\u0433\u043a\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0442.\u043a. \u0432\u0441\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u043e\u043c verilog \u0441 <code>always<\/code> \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0434\u043d\u043e\u0431\u0440\u0430\u0437\u043d\u044b.<\/p>\n<p>  <\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f, \u043f\u043e \u043c\u043d\u0435\u043d\u0438\u044e \u043c\u043d\u043e\u0433\u0438\u0445 \u0432 \u043d\u0435\u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e\u0433\u043e verilog \u0438 \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438. \u041d\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0441 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u043c<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">generated verilog<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>`ifdef RANDOMIZE_GARBAGE_ASSIGN `define RANDOMIZE `endif `ifdef RANDOMIZE_INVALID_ASSIGN `define RANDOMIZE `endif `ifdef RANDOMIZE_REG_INIT `define RANDOMIZE `endif `ifdef RANDOMIZE_MEM_INIT `define RANDOMIZE `endif  module SimpleCounter(   input        clock,   input        reset,   input        io_enable,   output [7:0] io_out );   reg [7:0] counter;   reg [31:0] _RAND_0;   wire [8:0] _T_7;   wire [7:0] _T_8;   wire [7:0] _GEN_0;   assign _T_7 = counter + 8'h1;   assign _T_8 = _T_7[7:0];   assign _GEN_0 = io_enable ? _T_8 : counter;   assign io_out = counter; `ifdef RANDOMIZE   integer initvar;   initial begin     `ifndef verilator       #0.002 begin end     `endif   `ifdef RANDOMIZE_REG_INIT   _RAND_0 = {1{$random}};   counter = _RAND_0[7:0];   `endif \/\/ RANDOMIZE_REG_INIT   end `endif \/\/ RANDOMIZE   always @(posedge clock) begin     if (reset) begin       counter &lt;= 8'h0;     end else begin       if (io_enable) begin         counter &lt;= _T_8;       end     end   end endmodule<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b\u0439 verilog \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c, \u0434\u0430\u0436\u0435 \u0432 \u0441\u0440\u0435\u0434\u043d\u0438\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0434\u0438\u0437\u0430\u0439\u043d\u0435, \u043d\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f. <\/p>\n<p>  <\/p>\n<ul>\n<li>RANDOMIZE \u0434\u0435\u0444\u0430\u0439\u043d\u044b \u2014 (\u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 chisel-testers) \u2014 \u0432 \u0446\u0435\u043b\u043e\u043c \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b, \u043d\u043e \u043e\u0441\u043e\u0431\u043e \u043d\u0435 \u043c\u0435\u0448\u0430\u044e\u0442<\/li>\n<li>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0448\u0438\u043a \u043f\u043e\u0440\u0442\u043e\u0432, \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0441\u044c<\/li>\n<li>_GEN_0 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0434\u043b\u044f \u043d\u0430\u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f, \u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430\u044f firrtl \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0438\u0442\u0430\u0442\u043e\u0440\u0443 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 verilog. \u041d\u0430 \u043d\u0435\u0435 \u0442\u043e\u0436\u0435 \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f. <\/li>\n<li>\u041e\u0441\u0442\u0430\u044e\u0442\u0441\u044f _T_7 \u0438 _T_8, \u0432\u0441\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0432 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e\u043c verilog \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e \u0432 \u0432\u0438\u0434\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 _T.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043f\u043e\u0440\u0442\u044b, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b, \u043f\u0440\u043e\u0432\u043e\u0434\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442 \u0441\u0432\u043e\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0438\u0437 chisel. \u0418 \u0435\u0441\u043b\u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 verilog \u043d\u043e \u0438 \u043d\u0430 chisel, \u0442\u043e \u0432\u0441\u043a\u043e\u0440\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043f\u043e\u0439\u0434\u0435\u0442 \u0442\u0430\u043a-\u0436\u0435 \u043b\u0435\u0433\u043a\u043e, \u043a\u0430\u043a \u0438 \u0441 \u0447\u0438\u0441\u0442\u044b\u043c verilog.<\/p>\n<p>  <\/p>\n<h3 id=\"zaklyuchenie\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>  <\/p>\n<p>\u0412 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u044f\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 RTL \u0431\u0443\u0434\u044c \u0442\u043e asic \u0438\u043b\u0438 fpga \u0432\u043d\u0435 \u0430\u043a\u0430\u0434\u0435\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0440\u0435\u0434\u044b, \u0434\u0430\u0432\u043d\u043e \u0443\u0448\u043b\u0430 \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0441\u0442\u043e\u0433\u043e \u0440\u0443\u043a\u043e\u043f\u0438\u0441\u043d\u043e\u0433\u043e verilog \u043a\u043e\u0434\u0430 \u043a \u0442\u0435\u043c \u0438\u043b\u0438 \u0438\u043d\u044b\u0445 \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u0435\u0439 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438, \u0431\u0443\u0434\u044c \u0442\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 tcl \u0438\u043b\u0438 \u0446\u0435\u043b\u0430\u044f IDE c \u043a\u0443\u0447\u0435\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439.<\/p>\n<p>  <\/p>\n<p>Chisel \u0436\u0435 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c \u044f\u0437\u044b\u043a\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438. \u041f\u0443\u0441\u0442\u044c \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043e\u043d \u0434\u0430\u043b\u0435\u043a \u043e\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u0430, \u043d\u043e \u0443\u0436\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0434\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u043c\u0438\u0440\u0438\u0442\u044c\u0441\u044f \u0441 \u0435\u0433\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0430\u043c\u0438. \u0412\u0430\u0436\u043d\u043e \u0447\u0442\u043e \u043f\u0440\u043e\u0435\u043a\u0442 \u0436\u0438\u0432\u043e\u0439 \u0438 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0438 \u0435\u0441\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0447\u0442\u043e \u0432 \u043e\u0431\u043e\u0437\u0440\u0438\u043c\u043e\u043c \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0442\u0430\u043a\u0438\u0445 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432 \u0441\u0442\u0430\u043d\u0435\u0442 \u043d\u0443 \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u043e \u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u043d\u0443 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e.<\/p>\n<\/div>\n<p>        <script class=\"js-mediator-script\">!function(e){function t(t,n){if(!(n in e)){for(var r,a=e.document,i=a.scripts,o=i.length;o--;)if(-1!==i[o].src.indexOf(t)){r=i[o];break}if(!r){r=a.createElement(\"script\"),r.type=\"text\/javascript\",r.async=!0,r.defer=!0,r.src=t,r.charset=\"UTF-8\";var d=function(){var e=a.getElementsByTagName(\"script\")[0];e.parentNode.insertBefore(r,e)};\"[object Opera]\"==e.opera?a.addEventListener?a.addEventListener(\"DOMContentLoaded\",d,!1):e.attachEvent(\"onload\",d):d()}}}t(\"\/\/mediator.mail.ru\/script\/2820404\/\",\"_mediator\")}(window);<\/script>     <br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/post\/419413\/\"> https:\/\/habr.com\/post\/419413\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div data-io-article-url=\"https:\/\/habr.com\/post\/419413\/\" class=\"post__text post__text-html js-mediator-article\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ka\/wc\/b5\/kawcb52amqtfs9chlivqku8sj-a.jpeg\"><\/p>\n<p>  <\/p>\n<p>\u0421 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c \u043c\u0438\u043a\u0440\u043e\u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u0438\u043a\u0438, rtl \u0434\u0438\u0437\u0430\u0439\u043d\u044b \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438\u0441\u044c \u0432\u0441\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435. \u0420\u0435\u044e\u0437\u0430\u0431\u0438\u043b\u0438\u0442\u0438 \u043a\u043e\u0434\u0430 \u043d\u0430 verilog \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0430\u0441\u0441\u0443 \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432, \u0434\u0430\u0436\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c generate, \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0438 \u0444\u0438\u0448\u0435\u043a system verilog. Chisel \u0436\u0435, \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u044e \u043c\u043e\u0449\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 rtl, \u0447\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u043b\u0433\u043e\u0436\u0434\u0430\u043d\u043d\u044b\u043c \u0448\u0430\u0433\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u0432\u0435\u0436\u0438\u043c \u0432\u043e\u0437\u0434\u0443\u0445\u043e\u043c \u043b\u0435\u0433\u043a\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 ASIC \u0438 FPGA.<\/p>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u043d \u043a\u0440\u0430\u0442\u043a\u0438\u0439 \u043e\u0431\u0437\u043e\u0440 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044e\u0437\u043a\u0435\u0439\u0441\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430. \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c, \u0435\u0441\u043b\u0438 \u0442\u0435\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u0441\u0442\u0430\u0442\u044c\u044e \u0432 \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0430\u0445. <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-287611","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/287611","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=287611"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/287611\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=287611"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=287611"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=287611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}