Yosys:复位时触发器的可变初始值

Yosys: Variable initial value to flip-flop at reset

我正在尝试在重置时为 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 库 ($_DFFSR_PPP_) 中的内置 FF 之一,忽略了用户定义单元库中的内置 FF。如果我在用户定义的库中包含一个设置重置 (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。 clearpreset 中的方程似乎没有被 Yosys 提取。

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

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

acc.v

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; }
    }
}

acc.tcl

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

Yosys 的 dfflibmap 不支持在 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

并在dfflibmap

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