如何为 Yosys 创建自定义技术单元图



我有以下简单的Verilog设计(test.v(:

module digital (
input a, b, c,
output reg q
);
wire ena = a & b;
always @ (ena, c) begin
if (ena)
q <= c;
end
endmodule

它模拟一个简单的闩锁,其ena输入上有一个门。我正在使用以下 Yosys TCL 脚本:

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
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

即使DFF映射良好(我尝试了不同的设计(,生成的Verilog文件也包含一个$_DLATCH_P_单元的实例。

因此,我尝试遵循此评论中的注释,即编写一个自定义技术映射文件以将 Yosys 锁存器映射到技术库中的锁存器:

1.使用我从 yosys 命令help $dlatch+获得的模板并查看内置 Yosys 技术地图中的一些示例,我创建了一个我认为是映射文件的内容,test_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

2.然后我还在合成脚本中techmap; opt -full行之后添加了行techmap -map test_map.v

不幸的是,没有成功:Yosys输出网表中仍然有一个$_DLATCH_P_实例。我在 Yosys 日志输出中也找不到任何相关的警告/错误。

3.我还尝试将映射单元格的模块名称(_library_latch上面的代码(和/或techmap_celltype注释更改为$_DLATCH_P_,但这也没有帮助。

我错过了什么?

在找到ICE40 FPGA的官方Yosys锁存映射文件后,我将test_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_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()
);

最新更新