我在我的测试平台中使用此部分来提供输入。如何在此代码中使用@(posedge clk)而不是#10
initial
clk=1'b0;
always #5 clk = ~clk;
initial begin
rst=1'b1;
# 10 rst=1'b0;
for (i=0;i<20;i=i+1)
begin
a=$random;
Pn=a[3];
Pe=a[2];
Ps=a[1];
Pw=a[0];
#10;
if (Pn==1) begin
Pn=0;
#10;
end
if (Pe==1) begin
Pe=0;
#10;
end
if (Ps==1) begin
Ps=0;
#10;
end
if (Pw==1) begin
Pw=0;
#10;
end
end
end
endmodule
这是流量控制的测试平台。我尝试过使用@(posedge clk)到处而不是#10但是它无法正常工作
答案 0 :(得分:2)
如果每个#10
每个Pn=0;
#10;
Pe=0;
#10;
Pn=1;
具有正时钟边沿,则这些块将是等效的:
Pn=0
@(posedge clk);
Pe=0;
@(posedge clk);
Pn=1;
用posedge:
@(posedge clk);
<=
只是等待条件得到满足,然后再转到下一行代码。如果刺激的顺序看起来是现在的时钟周期,那么您可能需要在测试平台中切换到非阻塞(Pn <= 0
@(posedge clk);
Pe <= 0;
@(posedge clk);
Pn <= 1;
)分配,即:
initial begin
clk = 1'b0;
end
always begin
#5 clk = ~clk;
end
另请注意,您的时钟生成逻辑在时间5生成了第一个posedge,并且您在10处更改了数据。因此,您始终在时钟周期之间更改数据,如果它来自另一个同步,则通常不会如何驱动数据系统
initial begin
clk = 1'b0;
forever begin
#5 clk = ~clk;
end
end
我发现从一个进程/块控制时钟更可靠:
initial begin
clk = 1'b0;
#5;
forever begin
#5 clk = ~clk;
end
end
然后您可以通过以下方式将时钟重新调整为10步:
{{1}}