如何将时钟门映射到技术库单元格

时间:2017-01-23 01:28:46

标签: verilog yosys

我在设计中有以下时钟门:

module my_clkgate(clko, clki, ena);
  // Clock gating latch triggered on the rising clki edge
  input  clki;
  input  ena;
  output clko;
  parameter tdelay = 0;

  reg enabled;
  always @ (clki, ena) begin
    if (!clki) begin
      enabled = ena;
    end
  end

  assign #(tdelay) clko = enabled & clki;
endmodule

当与Yosys合成时,生成的网表实例化(对于reg enabled\$_DLATCH_P_单元格,该单元格未包含在我正在使用的标准单元格lib文件中,即使该库确实包含锁存器。

我没有尝试将此设计的enabled与库中的标准锁存单元匹配,而是想使用库提供的时钟门,而不是包含AND门,它具有类似于的接口这样:

module LIB_GATE (
  input CK,
  input E,
  output ECK);
endmodule

我已经尝试了以下内容:

  1. 只需将my_clkgate模块源的内容替换为LIB_GATE的实例并转发所有端口连接。 Yosys抱怨LIB_GATE“不是设计的一部分”。
  2. 除了第1点,将LIB_GATE声明为空模块(如上所示)。这样就可以在生成的网表中留下两个空模块LIB_GATEmy_clkgate
  3. 我也尝试将extract命令与库的Verilog模型一起使用,遗憾的是它无法解析(我怀疑该文件包含一些不受支持的Verilog构造,例如specify块)。
  4. 当然,我可以编写一个脚本来对网表进行后期处理,以便用my_clkgate实例替换LIB_GATE,但我想知道Yosys能否为我做到这一点?

    供参考,这是我正在使用的“synth.ys”文件:

    read_liberty -lib  my_library.lib
    script yosys_readfiles.ys
    proc; opt; memory; opt; fsm -norecode; opt
    techmap; opt
    dfflibmap -liberty my_library.lib
    abc -liberty my_library.lib
    hilomap -hicell LIB_TIEHI Y -locell LIB_TIELO Y
    clean
    write_verilog -noattr -noexpr output.v
    stat
    

    “yosys_readfiles.ys”是包含read_verilog行的文件,其中所有输入文件后跟hierarchy -check -top my_design行。

1 个答案:

答案 0 :(得分:1)

  

除了上一个之外,将LIB_GATE声明为空模块(如上所示)。这样就可以在生成的网表中留下两个空模块LIB_GATE和my_clkgate。

这是解决方案。但是,您必须在模块上设置blackbox属性,如下所示:

(* blackbox *)
module LIB_GATE (
  input CK,
  input E,
  output ECK);
endmodule

顺便说一句:如果您使用read_verilog -lib读取.v文件,则将忽略所有模块的内容,并自动设置blackbox属性。

您还可以使用read_liberty -lib读取自由单元库,以获取单元库中所有内容的可实例化黑盒单元格。