2

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

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_未包含在我正在使用的标准单元库文件中的单元,即使该库确实包含锁存器。

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块)。

当然,我可以编写一个脚本来对网表进行后处理以替换my_clkgateLIB_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

4

1 回答 1

1

除了前面,将 LIB_GATE 声明为空模块(如上图)。这会在结果网表中留下两个空模块 LIB_GATE 和 my_clkgate。

这就是解决方案。但是,您必须blackbox像这样在模块上设置属性:

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

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

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

于 2017-01-24T10:16:20.613 回答