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包含在always块的事件列表中,因为cnt没有在always块之外引用/分配,并且完全通过for循环迭代

我的问题是我应该在事件列表上有 cnt 吗?

4

2 回答 2

4

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

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

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

于 2012-04-25T23:21:45.533 回答
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

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

于 2012-04-27T10:50:39.833 回答