2017-03-29 39 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版本的一部分。

這是test.v文件:

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輸出的網表:

/* 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個實例,這個設計中的三個觸發器各有一個。我預計這些逆變器中只有一個和其驅動網絡在觸發器CLK輸入之間共享。在另一種設計中(大約有30個寄存器是從下降時鐘沿觸發的),我只看到一個反相器,但是它的輸出通過一個觸發器的緩衝器,這也不是理想的。

有沒有辦法讓Yosys在寄存器中合併/共享這些資源?

回答

2

有沒有辦法讓Yosys在寄存器中合併/共享這些資源?

運行dfflibmap後,只需運行opt_merge即可。

+0

使用TCL解釋器導致錯誤('無效命令名稱「opt_merge」'),但運行'opt'而不是像魅力一樣工作。再次感謝! – FriendFX

+0

@FriendFX Yosys 0.5+ f13e387自2015年10月起。當時命令被稱爲「opt_share」。我建議使用最新版本(Yosys 0.7)或git頭。 – CliffordVienna