2

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

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

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

谢谢!

4

3 回答 3

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 代码中的循环视为创建一段逻辑的已知固定数量的副本。

于 2010-03-10T22:26:29.497 回答
2

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

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;
于 2010-03-02T14:11:13.077 回答
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)。

于 2010-03-02T14:12:26.000 回答