使用clk来延迟

时间:2014-07-10 08:51:12

标签: verilog

我在我的测试平台中使用此部分来提供输入。如何在此代码中使用@(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但是它无法正常工作

1 个答案:

答案 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}}