我有以下简单的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
endmodule2.然后,我在合成脚本中在techmap; opt -full行之后添加了行techmap -map test_map.v。
不幸的是,没有成功:在Yosys输出netlist中仍然有一个\$_DLATCH_P_实例。我也无法在Yosys日志输出中找到任何相关的警告/错误。
3. I还尝试将映射单元格的模块名(在上面的代码中为_library_latch)和/或techmap_celltype注释更改为\$_DLATCH_P_,但这也没有帮助。
我遗漏了什么?
发布于 2020-02-10 02:49:12
在找到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...and我的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现在,output netlist有一个如下所示的实例:
TLATX1M _1_ (
.D(c),
.G(ena),
.Q(q),
.QN()
);https://stackoverflow.com/questions/60143268
复制相似问题