RTLILの中間表現に対していくつかテストケースを流してみて、どういう表現が生成されるのかを眺めてみる。
always_comb
とassign
の違い
assign out0 = in0; always_comb begin out1 = in1; end
生成されるRTLILは同一だった。
connect \out0 \in0 connect \out1 \in1
- DFFの生成
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