首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在verilog中不使用while()循环(用于合成)?

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

Stack Overflow用户
提问于 2010-03-02 13:06:52
回答 3查看 15.3K关注 0票数 2

我已经养成了开发大量测试台的习惯,并将for()和while()循环用于测试目的。那很好。问题是,我已经养成了这个习惯,开始对应该是可合成的电路进行编码。XST和其他人拒绝合成代码(不需要额外修改合成参数),例如:

代码语言:javascript
复制
while (num < test_number) 
     begin 
     . 
     . 
     . 
     num = num+1; 
     end

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

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2010-03-11 06:26:29

综合工具各不相同,但一般来说,只要综合工具知道迭代次数,就可以综合循环。所以,

代码语言:javascript
复制
for ( i = 0; i < 10; i = i + 1 )

是可以的,因为工具知道有10次循环迭代。但

代码语言:javascript
复制
reg [10:0] r;
for ( i = 0; i < r; i = i + 1 )

不是OK,因为r是一个变量,r的值在合成时是未知的。

可以将RTL代码中的循环看作是创建一段逻辑的已知固定数量的副本。

票数 4
EN

Stack Overflow用户

发布于 2010-03-02 22:11:13

你需要有一个时钟来控制它启动。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2010-03-02 22:12:26

如果您的合成工具不支持whilefor循环,那么就不要使用循环。只需扩展您的代码即可。

代码语言:javascript
复制
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)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2361024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档