2017-03-29 17 views
0

これはCombinatorial synthesis: Better technology mapping resultsの別のフォローアップの質問です。合成ネットリスト内の余分なバッファ/インバータ

これは私のYosys TCL制御スクリプトです:

yosys -import 
set libfile osu018_stdcells.lib 
read_liberty -lib $libfile 
read_verilog test.v 
hierarchy; 
procs; opt 
memory; opt 
fsm -norecode; opt -full 
techmap; opt -full 
dfflibmap -liberty $libfile 
abc -liberty $libfile \ 
    -script {+strash;ifraig;scorr;dc2;dretime;strash;&get,-n;&dch,-f;&nf,{D};&put} 
clean 
write_verilog test_synth.v 

使用osu018_stdcells.libファイルが1.1 packageQflowバージョンの一部です。

module test (
    input rx_clk, 
    input rxena, 
    input rstn, 
    input [2:0] d, 
    output reg [2:0] q 
); 
    wire rx_rstn = rstn & rxena; 
    always @ (negedge rx_clk or negedge rx_rstn) begin 
    if (!rx_rstn) begin 
     q <= 0; 
    end else begin 
     q <= d; 
    end 
    end 
endmodule 

Yosys(バージョン0.5+ (git sha1 f13e387, gcc 5.3.1-8ubuntu2 -O2 -fstack-protector-strong -fPIC -Os))以下test_synth.v出力ネットリスト生成:

これはtest.vファイルで明らか

/* Generated by Yosys 0.5+ (git sha1 f13e387, gcc 5.3.1-8ubuntu2 -O2 -fstack-protector-strong -fPIC -Os) */ 

(* src = "test.v:1" *) 
module test(rx_clk, rxena, rstn, d, q); 
    wire _0_; 
    wire _1_; 
    wire _2_; 
    (* src = "test.v:5" *) 
    input [2:0] d; 
    (* src = "test.v:6" *) 
    output [2:0] q; 
    (* src = "test.v:4" *) 
    input rstn; 
    (* src = "test.v:2" *) 
    input rx_clk; 
    (* src = "test.v:8" *) 
    wire rx_rstn; 
    (* src = "test.v:3" *) 
    input rxena; 
    INVX1 _3_ (
    .A(rx_clk), 
    .Y(_0_) 
); 
    AND2X1 _4_ (
    .A(rstn), 
    .B(rxena), 
    .Y(rx_rstn) 
); 
    INVX1 _5_ (
    .A(rx_clk), 
    .Y(_1_) 
); 
    INVX1 _6_ (
    .A(rx_clk), 
    .Y(_2_) 
); 
    DFFSR _7_ (
    .CLK(_1_), 
    .D(d[0]), 
    .Q(q[0]), 
    .R(rx_rstn), 
    .S(1'b1) 
); 
    DFFSR _8_ (
    .CLK(_2_), 
    .D(d[1]), 
    .Q(q[1]), 
    .R(rx_rstn), 
    .S(1'b1) 
); 
    DFFSR _9_ (
    .CLK(_0_), 
    .D(d[2]), 
    .Q(q[2]), 
    .R(rx_rstn), 
    .S(1'b1) 
); 
endmodule 

は、INVX1セルの3つのインスタンスが存在しますこの設計では、3つのフリップフロップごとに1つずつです。私はフリップフロップCLK入力の間で共有されるこれらのインバータとその駆動ネットのうちの1つだけを期待していました。

落下クロックエッジからトリガされた約30個のレジスタを持つデザインでは、インバータは1つしか見えませんでしたが、その出力はフリップフロップごとに1つのバッファを通過するため、理想的ではありません。

Yosysにレジスタ間でこれらのリソースを結合/共有させる方法はありますか?

答えて

2

これらのリソースをレジスタ間で結合/共有する方法はありますか?

dfflibmapの実行後にopt_mergeを単に実行してください。

+0

TCLインタプリタを使用するとエラーが発生しました( '無効なコマンド名" opt_merge "')が、代わりに 'opt'を実行してチャームのように働きました。再度、感謝します! – FriendFX

+0

@FriendFX Yosys 0.5+ f13e387は2015年10月からのものです。当時は「opt_share」と呼ばれていました。私は最後のリリース(Yosys 0.7)またはgit headを使うことをお勧めします。 – CliffordVienna