2012-08-03 91 views
0
task monitorPush(); 
    begin 
    bit [7:0] data = 0; 
    while (1) begin 
     @ (posedge intf.clk); 
     if (intf.cb.wr_cs== 1 && intf.cb.wr_en== 1) begin 
     // @ (posedge intf.clk); 
     data = intf.data_in; 
     sb.addItem(data); 
     $write("%dns : Write posting to scoreboard data = %x\n",$time, data); 
     end 
    end 
    end 
    endtask 

以上代码与以下代码有什么不同?至于如何将第5行至第7行的摆动时钟更改为代码?在此先感谢系统verilog/verilog ---事件

task monitorPush(); 
    begin 
    bit [7:0] data = 0; 
    while (1) begin 
     // @ (posedge intf.clk); 
     if (intf.cb.wr_cs== 1 && intf.cb.wr_en== 1) begin 
     @ (posedge intf.clk); 
     data = intf.data_in; 
     sb.addItem(data); 
     $write("%dns : Write posting to scoreboard data = %x\n",$time, data); 
     end 
    end 
    end 
endtask 
+0

'永远'是一种清洁(恕我直言)的方式来写'while while(1)' – toolic 2012-08-03 12:09:40

回答

2

@(posedge intf.clk)等待CLK的posedge然后继续执行。

您的代码的第1版等待clk(posedge),然后执行if语句。

版本2:在if语句失败的情况下,将连续执行,在while真正的块内,直到if变成真,那么你将等待clk posedge。

+2

版本2会得到无限循环问题 – 2012-08-03 23:22:59

1

在版本2中,您有可能陷入无限循环,因为模拟器会卡住评估while循环和if语句,并且不会切换到执行代码的其他部分。在版本1中@(posedge intf.clk)将让模拟器跳转到代码的其他部分。总之,去版本1.