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

Verilog 若变量的使用类似于generate语句,则始终阻止事件列表,verilog,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 [

考虑如下代码:

   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
reg[2:0]cnt;
//a是一个输入(比如说4位),用于设计并在一些操作后分配
//到其他变量
始终@(a)
对于(cnt=0;cnt<4;cnt=cnt+1)开始
//涉及[按位]的某些操作
终止
现在您可以看到,我并没有将cnt包括在always块的事件列表中,因为cnt并没有在always块之外引用/分配,而是完全通过for循环进行迭代


我的问题是,我应该在事件列表中设置cnt吗?

始终块的敏感度列表的工作方式是,一旦其中一个输入发生更改,始终块将执行,直到它到达末尾,然后它将等待敏感度列表中的另一个更改

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


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

“始终”块的灵敏度列表的工作方式是,一旦其中一个输入发生变化,“始终”块将执行,直到它到达末尾,然后它将等待灵敏度列表中的另一个变化

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


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

添加作为答案以允许代码示例: 使用@*完成灵敏度列表并检查是否存在不必要的触发

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;
整数循环_cnt=0;
reg[3:0]b;
总是开始
$display(“%t:Loop Count”,$realtime,Loop\u cnt);
loop_cnt=loop_cnt+1;
对于(cnt=0;cnt<4;cnt=cnt+1)开始
b[cnt]=一位数据;
终止
终止
同:

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
integer-cnt;
整数循环_cnt=0;
reg[3:0]b;
始终@(一位数据)开始
$display(“%t:Loop Count”,$realtime,Loop\u cnt);
loop_cnt=loop_cnt+1;
对于(cnt=0;cnt<4;cnt=cnt+1)开始
b[cnt]=clk;
终止
终止

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

添加为允许代码示例的答案: 使用@*完成灵敏度列表并检查是否存在不必要的触发

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;
整数循环_cnt=0;
reg[3:0]b;
总是开始
$display(“%t:Loop Count”,$realtime,Loop\u cnt);
loop_cnt=loop_cnt+1;
对于(cnt=0;cnt<4;cnt=cnt+1)开始
b[cnt]=一位数据;
终止
终止
同:

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
integer-cnt;
整数循环_cnt=0;
reg[3:0]b;
始终@(一位数据)开始
$display(“%t:Loop Count”,$realtime,Loop\u cnt);
loop_cnt=loop_cnt+1;
对于(cnt=0;cnt<4;cnt=cnt+1)开始
b[cnt]=clk;
终止
终止

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

谢谢@Tim,我不会这样编码。我正在验证其他人的代码,但不确定。在任何情况下,for loop假设创建同一硬件的多个副本(它没有计时,应该同时执行)。@wisemonkey在这种情况下,我认为那里的代码示例没有任何问题。我同意这看起来不错。我总是使用@*并避免从敏感度列表中丢失参数。@Munkymorgy:那么这是否意味着cnt将在事件列表中?如果是,那么每次cnt递增时总是执行block,否?我不这么认为,我在其他地方见过这种技术,这不是问题。据我所知,编译器将有效地展开for循环,因此for不会不必要地触发。我已经添加了一个示例,您可以运行来检查它。谢谢@Tim,我不会这样编码。我正在验证其他人的代码,但不确定。在任何情况下,for loop假设创建同一硬件的多个副本(它没有计时,应该同时执行)。@wisemonkey在这种情况下,我认为那里的代码示例没有任何问题。我同意这看起来不错。我总是使用@*并避免从敏感度列表中丢失参数。@Munkymorgy:那么这是否意味着cnt将在事件列表中?如果是,那么每次cnt递增时总是执行block,否?我不这么认为,我在其他地方见过这种技术,这不是问题。据我所知,编译器将有效地展开for循环,因此for不会不必要地触发。我已经添加了一个例子,您可以运行来检查它的答案。