verilog中的for循环合成

时间:2015-04-18 22:50:05

标签: for-loop verilog synthesis

我看到了一个例子beblow(people.tamu.edu/~ehsanrohani/ECEN248/lab5.ppt,Page39) 关于verilog中的合成。

module count1sC ( bit_cnt, data, clk, rst );
    parameter data_width = 4;  parameter cnt_width = 3;
    output [cnt_width-1:0] bit_cnt;
    input   [data_width-1:0] data;  input clk, rst;
    reg [cnt_width-1:0] cnt, bit_cnt, i; reg [data_width-1:0] tmp;
    always @ ( posedge clk )
        if ( rst ) begin cnt = 0; bit_cnt = 0; end
        else begin
        cnt = 0; tmp = data;
        for ( i = 0; tmp; i = i + 1 )
            begin if ( tmp[0] ) cnt = cnt + 1; 
                tmp = tmp >> 1; end
        bit_cnt = cnt;
    end
endmodule

实际上,这是Not Synthesizable的一个例子,但它似乎是一个可综合的案例,至少通过Design编译器。也许data_width只有4位。如果我将data_width更改为5,它将失败(超出迭代限制)。

有人可以帮我解释一下吗? 提前谢谢!

1 个答案:

答案 0 :(得分:1)

它不可合成。编译时未知for循环的次数。回想一下for条件有tmp,它是用data初始化的,它的值在编译时我们都不知道。

为了使这段代码(或任何其他代码)可以合成,编译器必须能够展开循环。如果您看到此代码并且无法计算for中的块必须实例化的次数,则编译器也不会。