我有以下Verilog代码。我找不到答案,在循环中间或在posedge
之后使用a <= x;b<=ri
有什么作用。我认为always begin
总是被执行,然后函数将在posedge clk
上(在integer d
行之后)被阻塞。当clock
上升时,将执行下一行(即r <= 0
)。
如果这是真的,那么下一个posedge clk
(在<= x ; b <= ri
和c = 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
答案 0 :(得分:2)
然后将在同一时钟沿执行下一个posege clk(在<= x; b <= ri和c = ri之后)
否,每个@(posedge clk);
将阻止执行,直到看到上升沿为止,此后它将继续。
在代码中间而不是开始使用posege的原因是什么?
我不知道为什么这样编写代码,因为我必须知道(或猜测)作者试图解决的问题。
如上所述:a @(posedge clk);
将阻止执行直到看到上升沿。因此,您应该将代码阅读为特定的事件序列:
等待时钟上升沿,然后将r
设置为零。
if k
设置a
,b
,然后再次等待时钟上升沿。
设置c
(出于某种原因,这是一个阻塞分配),然后再次等待时钟上升沿。
等