我养成了开发大量测试平台并使用for()和while()循环进行测试的习惯。没关系。问题在于我已经习惯于编写应该可合成的电路。 XST和其他人拒绝合成代码(无需对合成参数进行额外修改),例如:
while (num < test_number)
begin
.
.
.
num = num+1;
end
这是错误的编码风格,因为合成器test_num是一个值为2 ^ 32的int!或者它将其视为无限参数。无论哪种方式,它都是一个糟糕的编码习惯。但我已经习惯了在C和测试平台上这样做。什么是上述代码段的等效可合成代码?
谢谢!
答案 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)
如果您的综合工具不支持while
或for
循环,请不要使用循环。只需扩展您的代码。
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)。