我的设计中有以下时钟门:
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
) a \$_DLATCH_P_
尽管该库确实包含锁存器,但我正在使用的标准单元库文件中未包含该单元。
而不是尝试匹配enabled
将此设计转换为库中的标准锁存单元,我想使用库提供的时钟门,而不是包括与门,其接口如下:
module LIB_GATE (
input CK,
input E,
output ECK);
endmodule
我已经尝试过以下操作:
- 只需更换
my_clkgate
模块源的内容与实例LIB_GATE
并转发所有端口连接。尤西斯抱怨说LIB_GATE
是“不是设计的一部分”。
- 除第 1 点外,还声明
LIB_GATE
作为一个空模块(如上所示)。这会产生留下两个空模块的效果,LIB_GATE
and my_clkgate
在生成的网表中。
- 我也尝试使用extract http://www.clifford.at/yosys/cmd_extract.html命令与库的 Verilog 模型,不幸的是它无法解析(我怀疑该文件包含一些不受支持的 Verilog 结构,例如
specify
块)。
当然,我可以编写一个脚本来对网表进行后处理以替换my_clkgate
with 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 http://www.clifford.at/yosys/cmd_read_verilog.html包含所有输入文件的行,后跟hierarchy http://www.clifford.at/yosys/cmd_hierarchy.html -check -top my_design
line.