我已经养成了开发大量测试台的习惯,并将for()和while()循环用于测试目的。那很好。问题是,我已经养成了这个习惯,开始对应该是可合成的电路进行编码。XST和其他人拒绝合成代码(不需要额外修改合成参数),例如:
while (num < test_number)
begin
.
.
.
num = num+1;
end这是一个糟糕的编码风格,因为对于合成器来说,test_num是一个值为2^32的整数!或者它将其视为无界参数。无论哪种方式,这都是一个糟糕的编码习惯。但我太习惯在C和testbenches中这样做了。上述代码段的等价可综合代码是什么?
谢谢!
发布于 2010-03-11 06:26:29
综合工具各不相同,但一般来说,只要综合工具知道迭代次数,就可以综合循环。所以,
for ( i = 0; i < 10; i = i + 1 )是可以的,因为工具知道有10次循环迭代。但
reg [10:0] r;
for ( i = 0; i < r; i = i + 1 )不是OK,因为r是一个变量,r的值在合成时是未知的。
可以将RTL代码中的循环看作是创建一段逻辑的已知固定数量的副本。
发布于 2010-03-02 22:11:13
你需要有一个时钟来控制它启动。
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-02 22:12:26
如果您的合成工具不支持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)。
https://stackoverflow.com/questions/2361024
复制相似问题