1

我试图在重置时为 FF 分配一个初始值。初始值是电路的输入。在单元库中,我添加了以下 FF:

cell (DFF){
    area    : 0;
    ff(IQ,IQN){
        next_state  : "D";
        clocked_on  : "CLK";
        clear   : "I'*RST";
        preset  : "I*RST";
        clear_preset_var1   : L;
    }
    pin(CLK){
        direction   : input;
        capacitance : 0;
        clock   : true;
    }
    pin(RST){
        direction   : input;
        capacitance : 0;
    }
    pin(D){
        direction   : input;
        capacitance : 0;
        timing() {
          related_pin   : "CLK";
        }
    }
    pin(I){
        direction   : input;
        capacitance : 0;
    }
    pin(Q){
        direction   : output;
        function    : "IQ";
        timing() {
          related_pin   : "CLK";
          timing_type   : falling_edge;
        }
        timing() {
            related_pin : "RST";
            timing_type : clear;
            timing_sense    : positive_unate;
        }
        timing() {
            related_pin : "I";
            timing_type : clear;
            timing_sense    : negative_unate;
        }
        timing() {
            related_pin : "RST";
            timing_type : preset;
            timing_sense    : positive_unate;
        }
        timing() {
            related_pin : "I";
            timing_type : preset;
            timing_sense    : positive_unate;
        }
    }
}

我试图合成到这个 FF 的部分 Verilog 代码是

    always@(posedge clk or posedge rst)
    if(rst) begin 
        e_reg <= e_input;
    end
    else begin 
        e_reg <= e_shift;
    end 

但是,当我运行综合时,它使用来自 Yosys 库 ( ) 的内置 FF$_DFFSR_PPP_之一,而忽略了用户定义单元库中的一个。如果我在用户定义的库中包含一个 set-reset (SR) FF,如下所示,由 Yosys 拾取。

cell(DFF) {
area: 0;
ff("IQ", "IQN") { clocked_on: CLK;
              next_state: D;
                  preset: I;
                   clear: RST; }
pin(CLK) { direction: input;
             clock: true; }
pin(D) { direction: input; }
pin(Q) { direction: output;
          function: "IQ"; }
pin(I) { direction: input; }
pin(RST) { direction: input; }
}

前一个适用于 Synopsys DC,但不适用于 Yosys。似乎 Yosys 中的方程clearpreset没有被拾取。

有什么办法让它工作吗?我错过了什么吗?

编辑:我正在添加一个完整的示例,以防有人想要运行它。

加速器

module acc #(parameter N = 1)( 
    input clk,
    input rst,
    input [N-1:0] a,
    input [N-1:0] b,
    output [N-1:0] o
);

    logic [N-1:0] o_reg;

    assign o = o_reg & a;

    always@(posedge clk or posedge rst) begin
        if(rst) o_reg <= b;
        else o_reg <= o;
    end 

endmodule

asic_cell_yosys.lib

library(demo) {
    cell(IV) {
        area: 1;
        pin(A) { direction: input; }
        pin(Z) { direction: output; function: "A'"; }
    }
    cell(AND) {
        area: 1;
        pin(A) { direction: input; }
        pin(B) { direction: input; }
        pin(Z) { direction: output; function: "(A&B)"; }
    }   
    cell(NAND) {
        area: 1;
        pin(A) { direction: input; }
        pin(B) { direction: input; }
        pin(Z) { direction: output; function: "(A&B)'"; }
    }
    cell(DFFSR) {
        area: 4;
        ff("IQ", "IQN"){clocked_on: C;
                        next_state: D;
                        preset: S;
                        clear: R; }
        pin(C) { direction: input;
                     clock: true; }
        pin(D) { direction: input; }
        pin(Q) { direction: output;
                  function: "IQ"; }
        pin(S) { direction: input; }
        pin(R) { direction: input; }
    }
}

会计文件

yosys -import
read_verilog -sv acc.sv
hierarchy -check -top acc 
procs; opt; flatten; opt; 
techmap; opt;
dfflibmap -liberty asic_cell_yosys.lib
abc -liberty asic_cell_yosys.lib -script +map; 
opt; clean; opt;
opt_clean -purge
write_verilog -noattr -noexpr -nohex acc_syn.v
4

1 回答 1

1

Yosysdfflibmap不支持在 Liberty 文件中清除或预设这样的表达式。

但是,您可以使用techmap带有自定义映射规则的命令来映射$_DFFSR_PPP_到您自己的触发器 - 类似于我们在 Yosys 中进行 FPGA 技术映射的方式。

作为一个例子。创建dffsr_map.v

module $_DFFSR_PPP_(input C, S, R, D, output Q);
    DFFSR _TECHMAP_REPLACE_ (.CLK(C), .RST(S | R), .I(S), .D(D), .Q(Q));    
endmodule

并在techmap -map dffsr_map.v -map +/techmap.v之后添加dfflibmap

于 2018-10-30T18:58:41.340 回答