我有以下简单的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()
);