如何将时钟门映射到技术库单元
How to map clock gate to tech library cell
我在设计中有以下时钟门:
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
我已经尝试过以下方法:
- 只需将
my_clkgate
模块源的内容替换为 LIB_GATE
的实例并转发所有端口连接。 Yosys 抱怨 LIB_GATE
是 "not part of the design"。
- 除了第1点,声明
LIB_GATE
为空模块(如上图)。这具有在生成的网表中留下两个空模块 LIB_GATE
和 my_clkgate
的效果。
- 我也尝试过对库的 Verilog 模型使用
extract
命令,不幸的是它无法解析(我怀疑该文件包含一些不受支持的 Verilog 结构,例如 specify
块)。
当然,我可以编写一个 post 处理网表的脚本,以用 LIB_GATE
实例替换 my_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" 是包含 read_verilog
line with all the input files followed by a hierarchy
-check -top my_design
行的文件。
In addition to the previous, declaring LIB_GATE as an empty module (as shown above). This had the effect of leaving two empty modules, LIB_GATE and my_clkgate in the resulting netlist.
这就是解决方案。但是,您必须像这样在模块上设置 blackbox
属性:
(* blackbox *)
module LIB_GATE (
input CK,
input E,
output ECK);
endmodule
顺便说一句:如果您使用 read_verilog -lib
读取 .v 文件,那么所有模块的内容将被忽略,并且 blackbox
属性将被自动设置。
您还可以使用 read_liberty -lib
阅读自由单元库,为单元库中的所有内容获取可实例化的黑盒单元。
我在设计中有以下时钟门:
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
我已经尝试过以下方法:
- 只需将
my_clkgate
模块源的内容替换为LIB_GATE
的实例并转发所有端口连接。 Yosys 抱怨LIB_GATE
是 "not part of the design"。 - 除了第1点,声明
LIB_GATE
为空模块(如上图)。这具有在生成的网表中留下两个空模块LIB_GATE
和my_clkgate
的效果。 - 我也尝试过对库的 Verilog 模型使用
extract
命令,不幸的是它无法解析(我怀疑该文件包含一些不受支持的 Verilog 结构,例如specify
块)。
当然,我可以编写一个 post 处理网表的脚本,以用 LIB_GATE
实例替换 my_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" 是包含 read_verilog
line with all the input files followed by a hierarchy
-check -top my_design
行的文件。
In addition to the previous, declaring LIB_GATE as an empty module (as shown above). This had the effect of leaving two empty modules, LIB_GATE and my_clkgate in the resulting netlist.
这就是解决方案。但是,您必须像这样在模块上设置 blackbox
属性:
(* blackbox *)
module LIB_GATE (
input CK,
input E,
output ECK);
endmodule
顺便说一句:如果您使用 read_verilog -lib
读取 .v 文件,那么所有模块的内容将被忽略,并且 blackbox
属性将被自动设置。
您还可以使用 read_liberty -lib
阅读自由单元库,为单元库中的所有内容获取可实例化的黑盒单元。