Почему этот простой код вызывает очень медленный проход PROC_DLATCH - PullRequest
1 голос
/ 02 февраля 2020

Я использую (отлично) Yosys для синтеза (read_verilog & pro c) приведенного ниже кода (серая логика инкремента c для asyn c fifo), чтобы сделать некоторые формальные проверки и обнаружил, что он невероятно медленный.

Для W=2 он синтезируется в 0.2sec, W=3 в 230sec. Это еще не закончилось для W=4, и мне нужно W=5 для моего дизайна.

Yosys - версия 0.9+932. Атрибут mem2reg используется потому, что я хотел его, так как regs не mem (smtbm c не любит nonconst meminit).

Мне интересно, если он задуман или есть какая-то ошибка / неэффективность в PROC_DLATCH?

module gray5_inc #(parameter K=1,W=3) (
        input [W-1:0] in,
        output [W-1:0] out);
        localparam SZ=1<<W;

        function [W-1:0] gray; 
                input [W-1:0] x;
                begin
                        gray = x^{1'b0,x[W-1:1]};
                end
        endfunction

        integer i;
        (* mem2reg *)
        reg [W-1:0] rom [SZ-1:0];
        initial begin
                for(i=0;i<SZ;i=i+1) rom[gray(i)] = gray(i+K);
        end
        assign out = rom[in];
endmodule
...