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
。