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

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 *) (*

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