如果使用类似于generate语句的变量,则始终阻止事件列表

时间:2012-04-25 22:51:09

标签: verilog

考虑如下代码:

   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

现在你可以看到我没有在always块的事件列表中包含cnt,因为cnt没有被引用/分配在always block之外并且完全用for循环遍历

我的问题是我应该在事件清单上有cnt吗?

2 个答案:

答案 0 :(得分:4)

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

在您的情况下,如果您更改a,它应该遍历for循环的所有4个循环然后完成,因此在敏感列表中不需要cnt

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

答案 1 :(得分: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

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