如何在verilog中使用while()循环(用于合成)?

时间:2010-03-02 05:06:52

标签: loops verilog synthesis

我养成了开发大量测试平台并使用for()和while()循环进行测试的习惯。没关系。问题在于我已经习惯于编写应该可合成的电路。 XST和其他人拒绝合成代码(无需对合成参数进行额外修改),例如:

while (num < test_number) 
     begin 
     . 
     . 
     . 
     num = num+1; 
     end

这是错误的编码风格,因为合成器test_num是一个值为2 ^ 32的int!或者它将其视为无限参数。无论哪种方式,它都是一个糟糕的编码习惯。但我已经习惯了在C和测试平台上这样做。什么是上述代码段的等效可合成代码?

谢谢!

3 个答案:

答案 0 :(得分:4)

合成工具各不相同,但通常可以合成循环,只要合成工具已知迭代次数即可。所以,

for ( i = 0; i < 10; i = i + 1 )

没问题,因为该工具知道有10次循环迭代。但

reg [10:0] r;
for ( i = 0; i < r; i = i + 1 )

不正常,因为r是变量r的值在合成时是未知的。

将RTL代码中的循环视为创建一段逻辑的已知固定数量的副本。

答案 1 :(得分:1)

你需要有一个时钟来控制它开始。

always @(posedge clk or negedge rst_n)
  if (!rst_n)
     num <= 32'b0; // or whatever your width is.
  else
     if (num < test_number)
       num <= num + 1'b1;

答案 2 :(得分:1)

如果您的综合工具不支持whilefor循环,请不要使用循环。只需扩展您的代码。

wire [1:0] addr;
reg  [3:0] wren;

always @(posedge clk) begin
    wren[0] <= (addr == 2'd0);
    wren[1] <= (addr == 2'd1);
    wren[2] <= (addr == 2'd2);
    wren[3] <= (addr == 2'd3);
end

我不熟悉XST,但有些综合工具支持循环(例如Synopsys)。