FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Yosysの使い方を勉強する (4. RTLIL中間表現を観察する)

RTLILの中間表現に対していくつかテストケースを流してみて、どういう表現が生成されるのかを眺めてみる。

  • always_combassignの違い
assign out0 = in0;
always_comb begin
  out1 = in1;
end

生成されるRTLILは同一だった。

  connect \out0 \in0
  connect \out1 \in1

DFFセルが生成されるらしい。

always_ff @ (posedge i_clk, negedge i_reset_n) begin
  if (!i_reset_n) begin
    out2 <= 'h0;
  end else begin
    out2 <= in1;
  end
end
  cell $adff $procdff$4
    parameter \ARST_POLARITY 1'0
    parameter \ARST_VALUE 0
    parameter \CLK_POLARITY 1'1
    parameter \WIDTH 32
    connect \ARST \i_reset_n
    connect \CLK \i_clk
    connect \D \in1
    connect \Q \out2
  end
  • case文の生成
always_comb begin
  case (sel)
    2'b00 : data_out = data_3;
    2'b01 : data_out = data_2;
    2'b10 : data_out = data_1;
    2'b11 : data_out = data_0;
    default : data_out = 'h0;
  endcase // case (sel)
end

eqによる比較結果と、それをセレクトする回路が生成された。

  cell $pmux $procmux$2
    parameter \S_WIDTH 4
    parameter \WIDTH 32
    connect \A 32'x
    connect \B { \data_3 \data_2 \data_1 \data_0 }
    connect \S { $procmux$6_CMP $procmux$5_CMP $procmux$4_CMP $procmux$3_CMP }
    connect \Y \data_out
  end
...
  attribute \src "assign_always.sv:0.0-0.0|assign_always.sv:41.3-47.10"
  cell $eq $procmux$3_CMP0
    parameter \A_SIGNED 0
    parameter \A_WIDTH 2
    parameter \B_SIGNED 0
    parameter \B_WIDTH 2
    parameter \Y_WIDTH 1
    connect \A \sel
    connect \B 2'11
    connect \Y $procmux$3_CMP
  end