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

Verilog 如何将时钟门映射到技术库单元,verilog,yosys,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 ena

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

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
)一个
\$\u DLATCH\u p
单元,该单元未包含在我使用的标准单元库文件中,即使该库确实包含锁存

与其尝试将此设计的
启用的
与库中的标准锁存单元相匹配,我希望使用库提供的时钟门,它包括AND门,AND门具有如下接口:

module LIB_GATE (
  input CK,
  input E,
  output ECK);
endmodule
(* blackbox *)
module LIB_GATE (
  input CK,
  input E,
  output ECK);
endmodule
我已经尝试了以下方法:

  • 只需将
    my_clkgate
    模块源的内容替换为
    LIB_GATE
    的实例,并转发所有端口连接即可。Yosys抱怨说,
    LIB_GATE
    不是设计的一部分
  • 除第1点外,将
    LIB_GATE
    声明为空模块(如上所示)。这会在生成的网络列表中留下两个空模块,
    LIB_GATE
    my_clkgate
  • 我还尝试在库的Verilog模型中使用该命令,不幸的是它无法解析(我怀疑该文件包含一些不受支持的Verilog结构,例如
    specify
    块)
  • 当然,我可以编写一个脚本,对网络列表进行后期处理,用
    LIB\u GATE
    实例替换
    my\u clkgate
    ,但我想知道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”是一个包含所有输入文件的行的文件,后跟一个
    -check-top my_design

    除了前面的声明之外,还将LIB_GATE声明为空模块(如上所示)。这会在生成的网络列表中留下两个空模块,LIB_GATE和my_clkgate

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

    module LIB_GATE (
      input CK,
      input E,
      output ECK);
    endmodule
    
    (* blackbox *)
    module LIB_GATE (
      input CK,
      input E,
      output ECK);
    endmodule
    
    顺便说一句:如果您使用
    read\u verilog-lib
    读取.v文件,那么所有模块的内容都将被忽略,并且
    blackbox
    属性将自动设置


    您还可以使用
    read\u liberty-lib
    读取liberty单元库,为单元库中的所有内容获取可实例化的黑盒单元。

    我不知道Yosis,但在Design Compiler(Synopsys)上有一个命令
    set\u clock\u gating\u style
    ,允许您选择用作时钟网关(和其他选项)的元素. 你有没有检查过Yosis中类似的东西?非常感谢你的回复。我最终使用了涉及
    read_liberty-lib
    的解决方案,因为它不需要我重新定义
    lib_GATE
    模块。使用
    (*blackbox*)
    的解决方案似乎也做了正确的事情,但我还没有测试
    read\u verilog