考虑如下代码:
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吗?
答案 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
同时运行,时间和计数应匹配。如果有额外的触发,则计数会高出四倍。