2012-04-25 29 views
1

考虑代码如下:总是阻止事件列表,如果变量用于类似于生成的语句

reg [2:0] cnt; 
    // a is an input (say 4 bit) to design and being assigned after some manipulation 
    // to some other variable 

    always @(a) 
     for (cnt = 0; cnt < 4; cnt = cnt+1) begin 
      //some operation involving a [bitwise] 
     end 

现在你可以看到我并没有包括在事件列表CNT的总块作为CNT不引用/分配的外部始终阻止,并完全迭代通过for循环

我的问题是我应该cnt事件列表?

回答

4

always块的灵敏度列表的工作方式是,一旦某个输入发生变化,always块将执行,直到达到结尾,然后它将等待灵敏度列表中的另一个更改。

在你的情况下,如果你改变a,它应该运行你的for循环的所有4个循环,然后完成,所以在灵敏度列表中有cnt不是必需的。

这就是说,我很难想象这种逻辑应该是合成的。你的for循环是应该计时的东西,还是打算立即执行?

+0

谢谢@Tim,我不会这样编码。我正在验证别人的代码,但不确定。在任何情况下,for循环假设创建相同硬件的多个副本(它不是时钟并且应该同时执行)。 – wisemonkey 2012-04-25 23:49:20

+0

@wisemonkey在这种情况下,我认为那里的代码示例没有任何问题。 – Tim 2012-04-25 23:54:27

+0

我同意这看起来不错。我总是使用@ *并避免缺少来自敏感列表的参数。 – Morgan 2012-04-26 01:18:04

2

添加答案以允许代码示例: 使用@ *完成敏感性列表并检查不必要的触发。

integer cnt; 
integer loop_cnt = 0; 
reg [3:0] b; 

always @* begin 
    $display("%t : Loop Count ",$realtime, loop_cnt); 
    loop_cnt = loop_cnt + 1; 
    for (cnt = 0; cnt < 4; cnt = cnt+1) begin 
    b[cnt] = one_bit_data ; 
    end 
end 

是一样的:

integer cnt; 
integer loop_cnt = 0; 
reg [3:0] b; 

always @(one_bit_data) begin 
    $display("%t : Loop Count ",$realtime, loop_cnt); 
    loop_cnt = loop_cnt + 1; 
    for (cnt = 0; cnt < 4; cnt = cnt+1) begin 
    b[cnt] = clk ; 
    end 
end 

运行两者的时间和次数应匹配。如果有额外的触发,计数将会高出四倍。

相关问题