首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为Yosys创建自定义技术单元图

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

Stack Overflow用户
提问于 2020-02-10 02:12:58
回答 1查看 1.1K关注 0票数 1

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

代码语言:javascript
复制
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脚本:

代码语言:javascript
复制
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闩锁单元:

代码语言:javascript
复制
(* 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输出netlist中仍然有一个\$_DLATCH_P_实例。我也无法在Yosys日志输出中找到任何相关的警告/错误。

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

我遗漏了什么?

EN

回答 1

Stack Overflow用户

发布于 2020-02-10 02:49:12

在找到ICE40 FPGA的正式Yosys锁存映射文件之后,我将test_map.v文件更改为:

代码语言:javascript
复制
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行已经正确,下面是供参考的整个文件:

代码语言:javascript
复制
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有一个如下所示的实例:

代码语言:javascript
复制
  TLATX1M _1_ (
    .D(c),
    .G(ena),
    .Q(q),
    .QN()
  );
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60143268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档