Verilog 如何为Yosys创建自定义技术单元图
我有以下简单的Verilog设计(在Verilog 如何为Yosys创建自定义技术单元图,verilog,yosys,Verilog,Yosys,我有以下简单的Verilog设计(在test.v): 尽管DFF映射得很好(我尝试了另一种设计),但生成的Verilog文件包含一个\$\u DLATCH\u p单元格的实例 因此,我尝试按照中的说明进行操作,即编写一个自定义技术映射文件,将Yosys闩锁映射到技术库中的闩锁: 1。使用我从yosys命令获得的模板help$dlatch+并查看中的一些示例,我创建了一个映射文件,test\u map.v以使用库自己的TLATX1M锁存单元: (* techmap_simplemap *) (*
test.v
):
尽管DFF映射得很好(我尝试了另一种设计),但生成的Verilog文件包含一个\$\u DLATCH\u p
单元格的实例
因此,我尝试按照中的说明进行操作,即编写一个自定义技术映射文件,将Yosys闩锁映射到技术库中的闩锁:
1。使用我从yosys命令获得的模板help$dlatch+
并查看中的一些示例,我创建了一个映射文件,test\u map.v
以使用库自己的TLATX1M
锁存单元:
(* techmap_simplemap *)
(* techmap_celltype = "$dlatch" *)
module _library_latch (EN, D, Q);
parameter WIDTH = 0;
parameter EN_POLARITY = 1'b1;
input EN;
input [WIDTH-1:0] D;
output reg [WIDTH-1:0] Q;
genvar i;
generate begin
for (i = 0; i < WIDTH; i=i+1) begin:latch_bit
TLATX1M _TECHMAP_REPLACE_ ( // TODO: support EN_POLARITY = 1'b0
.D(D[i]),
.G(EN),
.Q(Q[i]),
.QN()
);
end
end endgenerate
endmodule
(*techmap\u simplemap*)
(*techmap_celltype=“$dlatch”*)
模块库锁存器(EN、D、Q);
参数宽度=0;
参数EN_极性=1'b1;
输入EN;
输入[WIDTH-1:0]D;
输出寄存器[WIDTH-1:0]Q;
genvar i;
生成开始
对于(i=0;i
2.然后我还在techmap之后添加了行techmap-map test\u map.v
;我的合成脚本中的opt-full
行
不幸的是,没有成功:在Yosys输出网络列表中仍然有一个\$\u DLATCH\u p\
实例。我在Yosys日志输出中也找不到任何相关的警告/错误
3.我还尝试将映射单元的模块名(\u library\u latch
在上面的代码中)和/或techmap\u celltype
注释更改为\$\u DLATCH\u p
,但这也没有帮助
我缺少什么?找到后,我将test\u map.v
文件更改为以下内容:
module \$_DLATCH_N_ (E, D, Q);
wire [1023:0] _TECHMAP_DO_ = "simplemap; opt";
input E, D;
output Q;
TLATNX1M _TECHMAP_REPLACE_ (
.D(D),
.GN(E),
.Q(Q),
.QN()
);
endmodule
module \$_DLATCH_P_ (E, D, Q);
wire [1023:0] _TECHMAP_DO_ = "simplemap; opt";
input E, D;
output Q;
TLATX1M _TECHMAP_REPLACE_ (
.D(D),
.G(E),
.Q(Q),
.QN()
);
endmodule
…我的Yosys脚本中的techmap-map test\u map.v
行已经正确,下面是整个文件供参考:
yosys -import
set name digital
set libfile my_tech.lib
read_liberty -lib $libfile
read_verilog test.v
hierarchy -check -top ${name}
procs; opt
memory; opt
fsm -norecode; opt -full
techmap; opt -full
techmap -map test_map.v
dfflibmap -liberty $libfile
opt
abc -liberty $libfile \
-script {+strash;ifraig;scorr;dc2;dretime;strash;&get,-n;&dch,-f;&nf,{D};&put}
hilomap -hicell TIEHIM Y -locell TIELOM Y
clean -purge
write_verilog ${name}_synth.v
现在,输出网络列表有如下实例:
TLATX1M _1_ (
.D(c),
.G(ena),
.Q(q),
.QN()
);
请注意,
wire[1023:0]\u TECHMAP\u DO=“simplemap;opt”代码>在这里不需要-iCE40规则有它,因为它们使用软逻辑来实现锁存,锁存本身需要映射;在这种情况下,单元格实例不需要这样做。
yosys -import
set name digital
set libfile my_tech.lib
read_liberty -lib $libfile
read_verilog test.v
hierarchy -check -top ${name}
procs; opt
memory; opt
fsm -norecode; opt -full
techmap; opt -full
techmap -map test_map.v
dfflibmap -liberty $libfile
opt
abc -liberty $libfile \
-script {+strash;ifraig;scorr;dc2;dretime;strash;&get,-n;&dch,-f;&nf,{D};&put}
hilomap -hicell TIEHIM Y -locell TIELOM Y
clean -purge
write_verilog ${name}_synth.v
TLATX1M _1_ (
.D(c),
.G(ena),
.Q(q),
.QN()
);