循环体中的 posedge 或 negedge

posedge or negedge in the body of the loop

我有以下verilog代码。我找不到答案在循环中间或之后使用 posedge 的效果是什么 a <= x;b<=ri 。我认为 always begin 总是被执行,之后该函数将在 posedge clk(在 integer d 行之后)被阻止。当clock上升时,下一行将被执行。(即r <= 0)。

如果为真,那么下一个 posedge clk(在 <= x ; b <= ric = ri 之后)将在同一时钟边沿执行,或者需要另一个时钟边沿,原因是什么在代码中间而不是开头使用 posedge

always
begin :two
   real c;
   integer d;
   @(posedge clk)
      r <= 0;
   if (k) 
   begin
      a <= x; b <= ri;
      @(posedge clk);
      begin :loop
      forever
      begin
         c = ri;
         @(posedge clk);
         d = $rtoi(c*4);
         if (abs(b-c) > abs(a-b)) disable loop;
         r <= $rtoi(j*4);
      end
   end 
   d = 3*d; k <= 1’b0; r <= d + 1;
end

then the next posedge clk (after <= x ; b <= ri and c = ri) will be executed on the same clock edge

不,每个@(posedge clk);都会阻塞执行,直到看到上升沿,然后会继续执行。

what is the reason of using posedge in the middle of code instead of in beginning?

我不知道为什么这样写代码,因为我必须知道(或猜测)作者试图解决哪个问题。

如上所述:a@(posedge clk);会阻塞执行,直到看到上升沿。因此,您应该将代码阅读为特定的事件序列:

  1. 等待时钟上升沿,然后将 r 设置为零。

  2. if k 设置 ab 并再次等待时钟上升沿。

  3. 设置c(出于某种原因,这是一个阻塞分配)并再次等待时钟上升沿。

    等等