Yosys: начальное значение переменной для триггера при перезагрузке

Я пытаюсь присвоить начальное значение 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;
        }
    }
}

Часть кода Verilog, которую я пытаюсь синтезировать в этот FF,

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

Однако, когда я запускаю синтез, он использует одну из встроенных FF из библиотеки Yosys ($_DFFSR_PPP_) игнорировать один из пользовательской библиотеки ячеек. Если я включу один из FF набора-сброса (SR) в пользовательскую библиотеку, как показано ниже, то, что подхватывает 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. Кажется, что уравнения в clear или же preset не были подхвачены Yosys.

Есть ли способ заставить это работать? Я что-то пропустил?

1 ответ

Yosys' dfflibmap не поддерживает выражения, такие как это, для очистки или предустановки в файле Liberty.

Тем не менее, вы можете использовать techmap команда с пользовательским правилом сопоставления для сопоставления $_DFFSR_PPP_ на свой собственный триггер - аналогично тому, как мы делаем техкарту FPGA в Yosys.

Другие вопросы по тегам